【问题标题】:django npm and node packages architecturedjango npm 和节点包架构
【发布时间】:2017-06-17 09:22:19
【问题描述】:

在我加入的项目中,这是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

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

【问题讨论】:

    标签: python node.js django npm architecture


    【解决方案1】:

    我理解您希望将所有与 javascript 相关的文件保存在一个位置的想法,但您可能希望将 node_modules 文件夹和 package.json 文件保留在 Django 应用程序的 @987654323 之外的几个原因@目录。

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

    【讨论】:

    • 我认为这是最好的答案,但我开始想知道为什么不把它放在项目之外?
    • 谢谢。是的,我试图从如何不构建事物的角度来回答这个问题,因为当涉及到项目结构时,它真的取决于你的项目。例如,我有一些完全基于 API 驱动的 React/Redux 应用程序的 Django 项目。对于这样的项目,我倾向于将前端的东西完全提取到自己的仓库中并单独托管。在使用 Django 模板系统的项目中,我通常将它与 Django 项目本身一起使用更有意义。
    • 为什么没有意义呢? Django 模板可以包装 React 项目,并且在某些情况下(例如管理页面),您可能希望访问这些 npm 包
    【解决方案2】:
    • node_modulespackage.json 放在项目的顶层:

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

    • (可选)如果您想在不使用 vendoring(而不是 bower)的情况下提供某些 npm 模块,请使用 django-npm 之类的工具来指定要公开的内容

    示例项目:

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

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

    【讨论】:

    • 虽然我对你的回答投了赞成票,因为它会帮助刚接触设置的人你没有回答我的问题,即“为什么”而不是“如何”
    • 卖什么?
    • 供应商基本上是将第 3 方包复制到您的项目中。
    • 感谢您指出django-npm,这是一个很棒的项目。我希望我早点发现它!
    【解决方案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 组件复制到我的应用程序 static/lib 目录中。

    【讨论】:

    • 为什么你认为它应该在应用程序之外?我不认为这是一个普遍的事情。除此之外,使用 django 处理 node.js 是一个不错的新想法
    • 我认为主要原因是只有要提供给客户端的文件才应该驻留在您的项目静态文件夹中。没有理由让客户可以使用过多和不必要的文件。
    猜你喜欢
    • 1970-01-01
    • 2018-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-11
    • 2014-01-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多