django npm和节点包体系结构

ela*_*ver 22 python architecture django node.js npm

在我加入的项目中,这是以下的架构node_packages:

|- Django project
|-- app1
|-- app2
|-- node_modules
|--- foundation-sites
|--- grunt
|-- static
|--- css
|--- images
|--- js
|--urls.py
|--settings.py
|--package.json
Run Code Online (Sandbox Code Playgroud)

我个人认为node_packages应该是在js文件夹下的静态以及package.json类似的:

|- Django project
|-- app1
|-- app2
|-- static
|--- css
|--- images
|--- js
|---- node_modules
|----- foundation-sites
|----- grunt
|---- packages.json
|--urls.py
|--settings.py
Run Code Online (Sandbox Code Playgroud)

有区别吗?这是最佳做法?为什么?

jos*_*son 27

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

  1. 您可能最终会静态地提供不合适的文件.如果node_modules生产环境中存在该文件夹collectstatic,则每次运行时都必须检查它是否同步,由于节点嵌套的依赖关系结构,这可能会很慢.假设您有一个构建步骤来捆绑和转换您的JS,如果这些源文件在其中static,它们也将无缘无故地作为静态文件提供.
  2. 您可能希望将节点用于不仅仅是JavaScript构建过程.我看到你正在使用Grunt,你可能想要使用它来满足你的JavaScript需求,比如缩小你的css,或者在你的Django dev服务器周围运行一个代理服务器,当你改变文件或Django服务器时自动重新加载你的浏览器重新启动.考虑到这一点,将Node.js视为构建过程中可能触及项目任何部分的工具可能更有意义,JavaScript的捆绑/转换只是其中的一部分.

  • 谢谢.是的,我试图从如何不构建事物的角度回答这个问题,因为当谈到项目结构时,它实际上取决于你的项目.例如,我有一些完全由API驱动的基于React/Redux的应用程序的Django项目.对于这样的项目,我倾向于将前端内容完全转移到自己的回购中并单独托管.在使用Django的模板系统的项目中,通常使用Django项目本身更有意义. (2认同)
  • 为什么它没有意义呢?Django 模板可以环绕 React 项目,并且在某些情况下(例如管理页面),您希望访问这些 npm 包 (2认同)

zxz*_*zak 10

  • npm_modulespackage.json你的项目的顶层:

    • 易于访问,您可以在项目的顶层安装模块和运行命令
    • 在顶级公开的家属,通常与点子要求一起
    • 外部库/模块与您的代码分开
  • 添加npm_modules.gitignore
  • 仅提供生成的文件.将源代码保留在外面STATICFILES_DIRS

  • (可选)如果你想在没有售卖的情况下提供一些npm模块(而不是bower),请使用像django-npm这样的工具来指定将要暴露的内容

示例项目:

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

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

  • 虽然我投了你的答案,因为它会帮助那些不熟悉设置的人你没有回答我的问题,这是"为什么"而不是"如何" (3认同)
  • 什么叫卖货? (2认同)

tur*_*tux 5

一般来说,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
Run Code Online (Sandbox Code Playgroud)

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

  • 我认为主要原因是只有要提供给客户端的文件才应该驻留在项目静态文件夹中.没有理由让客户可以使用多余的和不必要的文件. (2认同)