Django npm和节点包架构

2024-06-13 12:44:16 发布

您现在位置:Python中文网/ 问答频道 /正文

在我加入的项目中,这是node_packages的体系结构:

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

我个人认为node_packages应该在js文件夹下的static以及package.json中,如下所示:

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

有区别吗?哪一个是最佳实践?为什么?


Tags: djangopyprojectmodulesnodejsonpackagesjs
3条回答

一般来说,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

然后我使用gulp将节点模块或bower组件中的组件复制到我的appstatic/lib目录中。

  • npm_modulespackage.json放在项目的顶层:

    • 易于访问,您可以在项目的顶层安装模块并运行命令
    • 在顶层公开的依赖项,通常与pip要求一起
    • 与代码分离的外部库/模块
  • npm_modules添加到.gitignore
  • 只提供生成的文件。把源代码放在外面STATICFILES_DIRS

  • (可选)如果您想在没有供应商(而不是bower)的情况下为一些npm模块提供服务,请使用django-npm这样的工具来指定将公开的内容

示例项目:

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

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

我理解您希望将所有与javascript相关的文件保存在一个地方的想法,但这里有两个原因您可能希望将node_modules文件夹和package.json文件保存在Django应用程序的static目录之外。

  1. 您很可能最终会静态地为不应该是的文件提供服务。如果生产环境中存在node_modules文件夹,则运行collectstatic时必须检查它是否每次都处于同步状态,这可能是由于节点嵌套的依赖结构而导致的。假设您有一个构建步骤来捆绑和传输您的JS,如果这些源文件在static内,那么它们也将毫无理由地作为静态文件使用。
  2. 您可能不只是想将node用于JavaScript构建过程。我看到您正在使用Grunt,您可能还想将其用于JavaScript需要之外的其他用途,例如缩小您的css,或者在Django dev服务器周围运行代理服务器,在文件更改或Django服务器重新启动时自动重新加载浏览器。考虑到这一点,将Node.js看作构建过程中可以触及项目任何部分的工具可能更有意义,JavaScript的捆绑/传输只是其中的一部分。

相关问题 更多 >