web-dev-qa-db-fra.com

django npm et architecture des packages de nœuds

Sur le projet que je rejoins, c'est l'architecture du node_packages:

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

Je pense personnellement que node_packages doit se trouver dans le répertoire statique sous le dossier js ainsi que le package.json ainsi:

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

y a-t-il une différence? quelle est la meilleure pratique? Pourquoi?

21
elad silver

Je comprends que vous pensiez vouloir conserver tous les fichiers liés au javascript en un seul endroit, mais voici quelques raisons pour lesquelles vous voudrez peut-être conserver le node_modules dossier et le package.json fichier hors d'un répertoire Django app static de l'application.

  1. Vous finirez probablement par servir des fichiers statiques qui ne sont pas censés l'être. Si le node_modules le dossier existe dans votre environnement de production, l'exécution de collectstatic devra vérifier qu'il est synchronisé à chaque fois, ce qui peut être lent en raison de la structure de dépendance imbriquée des nœuds. Et en supposant que vous ayez une étape de construction pour regrouper et transpiler votre JS, si ces fichiers source sont dans static, ils seront également servis en tant que fichiers statiques, sans aucune raison.
  2. Vous voudrez peut-être utiliser le nœud pour plus que votre processus de génération JavaScript. Je vois que vous utilisez Grunt, et vous voudrez peut-être l'utiliser pour plus que vos besoins JavaScript, comme réduire votre css, ou en exécutant un serveur proxy autour de votre Django qui recharge automatiquement votre navigateur lorsque les fichiers changent ou le serveur Django redémarre. Avec ceci à l'esprit, il pourrait être plus logique de considérer Node.js comme un outil dans votre processus de construction qui pourrait toucher n'importe quelle partie de votre projet, le regroupement/transpilage de JavaScript n'en étant qu'une partie.
27
joslarson
  • Mettez npm_modules et package.json au plus haut niveau de votre projet:

    • facilement accessible, vous installez des modules et exécutez des commandes au plus haut niveau de votre projet
    • dépendances exposées au niveau supérieur, généralement aux côtés des exigences pip
    • bibliothèques/modules externes séparés de votre code
  • Ajouter npm_modules à .gitignore
  • Servir uniquement les fichiers générés. Gardez votre code source en dehors de STATICFILES_DIRS

  • (Facultatif) Si vous souhaitez servir certains modules npm sans vendeur (au lieu de bower), utilisez un outil comme Django-npm pour spécifier ce qui sera exposé

Exemples de projets:

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

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

10
zxzak

En général, le node_modules doit être en dehors de l'application Django. Le format typique que j'utilise pour une application Django est le suivant:

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

Ensuite, j'utilise gulp pour copier les composants des modules de noeud ou des composants de bower dans mon application static/lib répertoire.

5
turbotux