python - reactify - django npm y arquitectura de paquetes de nodos
reactify django (3)
En el proyecto al que me uno, esta es la arquitectura de los node_packages
:
|- Django project
|-- app1
|-- app2
|-- node_modules
|--- foundation-sites
|--- grunt
|-- static
|--- css
|--- images
|--- js
|--urls.py
|--settings.py
|--package.json
Personalmente, creo que los node_packages
deben estar en la parte estática debajo de la carpeta js
, así como en el package.json
así:
|- Django project
|-- app1
|-- app2
|-- static
|--- css
|--- images
|--- js
|---- node_modules
|----- foundation-sites
|----- grunt
|---- packages.json
|--urls.py
|--settings.py
¿Hay una diferencia? cuál es la mejor práctica? ¿por qué?
En general, los node_modules
deberían estar fuera de la aplicación Django. El formato típico que uso para una aplicación Django es el siguiente:
- AppName
---- appname (This is the Django Project)
---- appname-env (Python virtualenv)
---- bower_components
---- bower.json
---- gulpfile.js
---- node_modules
---- package.json
---- requirements.txt
Luego uso gulp para copiar los componentes de los módulos de nodo o los componentes de bower en el directorio static/lib
mi aplicación.
Entiendo que piense en querer mantener todos los archivos relacionados con JavaScript en un solo lugar, pero he aquí algunas razones por las que podría querer mantener la carpeta node_modules
y el archivo package.json
fuera del directorio static
la aplicación Django.
- Es probable que termine sirviendo estáticamente archivos que no están destinados a ser. Si la carpeta
node_modules
existe en su entorno de producción, la ejecución decollectstatic
deberá verificar que esté sincronizada todo el tiempo, lo que puede ser lento debido a la estructura de dependencia anidada de los nodos. Y suponiendo que tiene un paso de compilación para agrupar y transpilar su JS, si esos archivos fuente están dentro destatic
, también se servirán como archivos estáticos, sin ningún motivo. - Es posible que desee utilizar el nodo para algo más que el proceso de creación de JavaScript. Veo que está usando Grunt, y es posible que desee usarlo para más de lo que necesita JavaScript, como minificar su
css
o ejecutar un servidor proxy alrededor de su servidor Django Dev que autocarga su navegador cuando los archivos cambian o el Django el servidor se reinicia. Con esto en mente, podría tener más sentido pensar en Node.js como una herramienta en su proceso de compilación que podría tocar cualquier parte de su proyecto, la agrupación / transpiling de JavaScript es solo una parte de eso.
Coloque
npm_modules
ypackage.json
en el nivel superior de su proyecto:- de fácil acceso, instala módulos y ejecuta comandos en el nivel superior de su proyecto
- las dependencias expuestas en el nivel superior, comúnmente junto con los requisitos de pip
- librerías / módulos externos separados de tu código
- Agregue
npm_modules
a.gitignore
Sirve solo los archivos generados. Mantenga su código fuente fuera de
STATICFILES_DIRS
(Opcional) Si desea servir algunos módulos npm sin vendoring (en lugar de bower) utilice una herramienta como django-npm para especificar qué se expondrá
Proyectos de ejemplo: