【问题标题】:Can I put the npm node_modules directory outside of my project我可以将 npm node_modules 目录放在我的项目之外吗
【发布时间】:2020-05-28 03:26:34
【问题描述】:

我可以像 maven 处理其依赖项一样将 node_modules 目录放在我的项目之外吗?

【问题讨论】:

    标签: node.js npm


    【解决方案1】:

    有点。 node_modules 目录实际上不是npm 的功能,而是node.js 的功能。

    node.js 如何使用node_modules

    当你需要一个模块时,node.js 将从当前目录向上搜索node_modules 目录。这意味着如果它在当前目录(实际上可能是您的项目的子目录而不是您的项目目录)中找不到它,它将在父目录中查找它,然后是父目录的父目录一直到您的根目录。

    例如,您可以有这样的项目结构:

    /node_modules   <-------------------- modules available to all projects    
    /code
         /project_A
                    /node_modules <------ modules available to project A
                    /lib
                        /node_modules <-- modules available to the lib directory
         /project_B
                   /node_modules  <------ modules available to project B
    

    这样,您可以让多个项目共享一些模块,并让一些特定于项目的模块,甚至一些仅对项目中的某些文件可用的模块。

    npm 如何处理node_modules

    但请注意,npm 只有一种对 node_modules 的解释。它只管理您项目目录中的node_modules。特别是包含package.json 文件的目录。

    所以是的,您可以这样做,但 npm 不会理解您在做什么,并且您的 package.json 将包含不完整的依赖项。我不建议在涉及多个开发人员的项目中这样做,因为它看起来更像是一个配置错误的开发环境——基本上其他人会认为这是一个错误。但是,我个人将这种结构用于我不关心我的package.json 文件的个人项目。

    【讨论】:

    • 我想指出的是,在 node.js 的早期,在 npm 被开发并被 node 项目采用之前,以这种非标准方式使用 node_modules 并没有被认为是奇怪的。
    • 主要问题是有时我想在我的项目 ts 文件中搜索某些内容,而由于依赖关系,我有数千个这样的文件。除了在我的 IDE 工作区中有多个文件之外,我实际上并没有将它用于其他目的。
    • 这是我的一个个人项目的示例,项目中包含多级node_modules。您会在此项目中找到多个package.json 文件,这些文件将安装正确的node_modulesgithub.com/slebetman/movemachines - 一个在项目目录中,一个在mm16,一个在m516/js516 等
    • 但这正是我不想要的。我想将依赖项放在项目外部的目录中,就像 maven 处理 Java 项目一样。
    • 您可以全局安装模块,但强烈不建议这样做,因为其他语言(是的,甚至是 Java,尤其是 Windows dll)的依赖地狱的经验。以这种方式开发节点的原因是为了解决依赖地狱。如果您查看 node_modules 文件夹,您会发现其他 node_modules 文件夹,因为即使您的依赖项也有自己的私有依赖项。磁盘空间便宜,程序员调试依赖问题的时间很昂贵
    【解决方案2】:

    正如this 问题中提到的那样,不要这样做。让 NPM 以它设计的方式工作。但是,为了节省空间,您可以删除当前处于休眠状态的项目上的 node_modules 文件夹,并在切换回它们时通过一次 npm install 重新创建它。

    如果插件声明将模块安装在可配置目录中,则会出现问题。因此我建议修复文档,它给出了错误的希望。 请参阅npm docs,因为这是 npm 的默认行为。不是前端 maven 插件问题。

    【讨论】:

    • 问题不在于磁盘空间,而在于一大堆文件,除了查阅它们之外,我实际上并没有什么用处。
    【解决方案3】:

    是的,你可以,但你应该尽量避免这样做。

    npm install 将始终在您的父工作目录的 node_modules 文件夹中安装模块。

    当您使用npm install -g module_name 安装模块时,它会在您的项目目录之外全局安装模块,这也可以在其他项目中使用,通常会全局安装一些开发依赖项,这有助于您进行开发。

    一个例子是 npm install -g @angular/cli ,这样做一次将使您能够使用 ng 命令来构建、测试其他 Angular 项目。

    除此之外,如果项目所需的所有 node_modules 都保留在项目的工作目录中,那将是理想的。

    在项目外部全局安装任何东西被认为是不好的做法,因为不同的项目可能依赖于同一 node_module 的不同版本。在项目目录中本地安装 node_modules 允许不同的项目具有相同 node_module 的不同版本。

    【讨论】:

    • 没有办法用 maven 的方式来做?
    • Installing anything globally outside your project is considered bad practice as different projects may depend on different versions of the same node_module.Installing node_modules locally within the project directory allows different projects to have different versions of same node_module. 你能再解释一下吗?如果 node_module 对于每个项目都是本地的,different projects have different versions of SAME node_module 怎么可能?
    • 假设您有一个名为rxjs 的node_module,版本为5.0.0,您已全局安装,您的本地Project A 使用该模块中的一些方法来工作,现在几天后您克隆一个新的Project B,它使用来自 rxjs 最新版本(6.0.0)的新方法,这在5.0.0 中不存在。但是由于全局安装的版本为 5.0.0,你的新 Project B 将有破坏代码因为它将搜索 5.0.0 版本中不存在的新方法
    • different projects have different versions of SAME node_module,我的意思是当您将 node_module 保存在项目目录中时,如上述评论中所述,Project A 将具有 rxjs 版本 5.0.0,因为它将安装 w.r.t package.jsonProject B 将具有版本 6.0.0,因为它将参考 Project B package.json 安装。所以两个项目都有自己的 node_modules 文件夹,具有不同版本的相同 (rxjs) node_module 从而不会破坏代码在这两个项目中。
    • 我真的不明白为什么 npm 不像 Maven 那样管理依赖。 Maven 在全局范围内执行此操作,并且项目不会中断,因为您为每个依赖项显式声明所需的版本,就像使用 npm 一样。但即使你必须以这种方式工作,至少 npm 不应该强制 node_modules 目录在你的工作目录中,可能放在另一个目录中,并在项目文件夹中创建 node_modules 并在另一个目录中创建这个项目文件夹。跨度>
    猜你喜欢
    • 2013-03-09
    • 2012-03-20
    • 2017-07-22
    • 1970-01-01
    • 2015-07-13
    • 2020-06-26
    • 2017-08-01
    • 2019-11-13
    • 1970-01-01
    相关资源
    最近更新 更多