2017-01-31 3 views
9

О проекте Я присоединяюсь это архитектура для node_packages:Джанго НПМ и узел пакетов архитектуры

|- Django project 
|-- app1 
|-- app2 
|-- node_modules 
|--- foundation-sites 
|--- grunt 
|-- static 
|--- css 
|--- images 
|--- js 
|--urls.py 
|--settings.py 
|--package.json 

Я лично думаю, что node_packages должен быть в статическом в папке js, а также package.json как так :

|- Django project 
|-- app1 
|-- app2 
|-- static 
|--- css 
|--- images 
|--- js 
|---- node_modules 
|----- foundation-sites 
|----- grunt 
|---- packages.json 
|--urls.py 
|--settings.py 

есть разница? что является лучшей практикой? Зачем?

ответ

15

Я понимаю ваше мышление желая сохранить все файлы, связанные с JavaScript в одном месте, но вот несколько причин, вы можете захотеть сохранить папку node_modules и package.json файла из static каталогов, в Django приложения.

  1. Скорее всего, вы станете статически обслуживать файлы, которые не предназначены. Если папка node_modules существует в вашей производственной среде, запуск collectstatic должен будет проверять, что она синхронизируется каждый раз, что может быть медленным из-за структуры вложенных зависимостей узлов. Предполагая, что у вас есть шаг сборки для связывания и перевода вашего JS, если эти исходные файлы находятся в пределах static, они также будут обслуживаться как статические файлы, без каких-либо причин.
  2. Возможно, вы захотите использовать узел не только для своего процесса сборки JavaScript. Я вижу, что вы используете Grunt, и вы можете использовать его для большего, чем ваши потребности в JavaScript, например, для минимизации вашего css или запуска прокси-сервера вокруг вашего сервера Django dev, который автоматически перезагружает ваш браузер при изменении файлов или Сервер Django перезапускается. Имея это в виду, может возникнуть смысл думать о Node.js как о инструменте в процессе сборки, который может касаться любой части вашего проекта, а также связывание/трансляция JavaScript, являющихся лишь частью этого.
+0

Я думаю, что это лучший но я начинаю удивляться, почему бы не поставить его вне проекта? –

+1

Спасибо. Да, я пытался ответить на вопрос с точки зрения того, как не структурировать вещи, потому что, когда дело доходит до структуры проекта, это действительно зависит от вашего проекта. Например, у меня есть несколько проектов Django, которые полностью основаны на API приложениях React/Redux. С такими проектами я, как правило, предпочитаю полностью вытаскивать интерфейсный контент в свое собственное репо и размещать его отдельно. В проектах, использующих систему шаблонов Django, обычно имеет смысл для меня иметь это с самим проектом Django. – joslarson

+0

Почему это не имеет никакого смысла? Шаблоны Django могут обертывать проекты React, а в некоторых случаях (например, страницы администратора) вам нужен доступ к этим пакетам npm – AlxVallejo

1

Обычно node_modules должен находиться вне приложения Django. Типичный формат я использую для приложения Django является следующее:

- AppName 
---- appname (This is the Django Project) 
---- appname-env (Python virtualenv) 
---- bower_components 
---- bower.json 
---- gulpfile.js 
---- node_modules 
---- package.json 
---- requirements.txt 

Затем я использую глотка, чтобы скопировать компоненты из модулей либо узлов или компонентов Бауэр в мой каталог приложений static/lib.

+0

Почему, по вашему мнению, это должно быть вне приложения? Я не думаю, что это общее. Кроме того, это хорошая и новая идея подхода к node.js с django –

+1

Я думаю, что основная причина заключается в том, что только файлы, которые должны быть отправлены клиенту, должны находиться в статических папках ваших проектов. Нет никаких оснований для того, чтобы клиент имел избыточные и ненужные файлы. – turbotux

6
  • Помещенный npm_modules и package.json на верхнем уровне вашего проекта:

    • легко доступны, вы устанавливаете модули и выполнять команды на верхнем уровне вашего проекта
    • dependecies обнаженном на верхнем уровне, обычно вместе с требованиями к приложению
    • внешние библиотеки/модули, отделенные от вашего кода
  • Добавить npm_modules.gitignore
  • Подавать только сгенерированные файлы.Держите исходный код вне STATICFILES_DIRS

  • (Необязательно) Если вы хотите, чтобы служить некоторые НПЕ модули без vendoring (вместо беседки) использовать инструмент как django-npm, чтобы определить, что будет подвергаться

Пример проекты:

https://github.com/mbrochh/django-reactjs-boilerplate

https://github.com/Seedstars/django-react-redux-base

+0

Хотя я голосовал за ваш ответ, так как он поможет людям, которые новичок в настройке, вы не ответили на мой вопрос, который «почему», а не «как», –