【发布时间】:2020-05-28 03:26:34
【问题描述】:
我可以像 maven 处理其依赖项一样将 node_modules 目录放在我的项目之外吗?
【问题讨论】:
我可以像 maven 处理其依赖项一样将 node_modules 目录放在我的项目之外吗?
【问题讨论】:
有点。 node_modules 目录实际上不是npm 的功能,而是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
这样,您可以让多个项目共享一些模块,并让一些特定于项目的模块,甚至一些仅对项目中的某些文件可用的模块。
node_modules
但请注意,npm 只有一种对 node_modules 的解释。它只管理您项目目录中的node_modules。特别是包含package.json 文件的目录。
所以是的,您可以这样做,但 npm 不会理解您在做什么,并且您的 package.json 将包含不完整的依赖项。我不建议在涉及多个开发人员的项目中这样做,因为它看起来更像是一个配置错误的开发环境——基本上其他人会认为这是一个错误。但是,我个人将这种结构用于我不关心我的package.json 文件的个人项目。
【讨论】:
node_modules。您会在此项目中找到多个package.json 文件,这些文件将安装正确的node_modules:github.com/slebetman/movemachines - 一个在项目目录中,一个在mm16,一个在m516/js516 等
node_modules 文件夹,您会发现其他 node_modules 文件夹,因为即使您的依赖项也有自己的私有依赖项。磁盘空间便宜,程序员调试依赖问题的时间很昂贵
是的,你可以,但你应该尽量避免这样做。
npm install 将始终在您的父工作目录的 node_modules 文件夹中安装模块。
当您使用npm install -g module_name 安装模块时,它会在您的项目目录之外全局安装模块,这也可以在其他项目中使用,通常会全局安装一些开发依赖项,这有助于您进行开发。
一个例子是
npm install -g @angular/cli ,这样做一次将使您能够使用 ng 命令来构建、测试其他 Angular 项目。
除此之外,如果项目所需的所有 node_modules 都保留在项目的工作目录中,那将是理想的。
在项目外部全局安装任何东西被认为是不好的做法,因为不同的项目可能依赖于同一 node_module 的不同版本。在项目目录中本地安装 node_modules 允许不同的项目具有相同 node_module 的不同版本。
【讨论】:
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.json 和 Project B 将具有版本 6.0.0,因为它将参考 Project B package.json 安装。所以两个项目都有自己的 node_modules 文件夹,具有不同版本的相同 (rxjs) node_module 从而不会破坏代码在这两个项目中。