Node.js - 在本地安装模块时是否需要 package.json 依赖项?

Node.js - Are package.json dependencies necessary when installing modules locally?

我知道在 package.json 中做这样的事情 :

....
...
"dependencies" : {
    "some-node-module" : "*"
}

是个坏主意,因为您基本上是在告诉节点始终将此模块更新到其最新版本,即使您的代码可能无法处理除此特定模块的当前版本以外的任何其他版本。

所以我应该这样做:

....
...
"dependencies" : {
    "some-node-module" : "3.4.1"
}

这基本上告诉节点始终使用我的代码构建的模块版本。

问题
我有一个我首先在本地测试过的应用程序。该应用程序现已构建,并使用 package.json dependenciesnpm 在我的应用程序的根文件夹下本地安装了所有 适当的 节点模块(与全局相反,在一些我无法立即访问且与此应用程序无关的晦涩文件夹中 - 我只是不喜欢节点模块的全局安装 - 我发现它们...... "abstract").

鉴于所有节点模块现在都安装在本地,我的 package.json 中的节点模块依赖项部分现在是不是多余的?

我的意思是,如果发生什么事 npm 不可用或找不到模块的特定版本怎么办?

独立于动态节点模块安装并且第一次在本地安装所有内容而不必使用 package.json 依赖项不是最好的吗?

npm 安装和更新

"you're basically telling node to always update this module to its latest version"

软件包不会自动更新。 "*" 唯一的问题是当您第一次通过 npm install or when you manually run an update via npm update.

安装项目时

我个人更喜欢选择模块的特定版本而不是使用任何通配符,但即便如此也有一些陷阱...这就是 npm shrinkwrap 存在的原因。

npm shrinkwrap

下一个问题:

basically tells node to always use the version of the module that my code was built around

有点真实。假设您使用您最喜欢的模块的 1.2.3 版本并且 package.json 反映了这一点,但是模块本身是 package.json 对另一个模块的依赖并且 that 使用 "*"...所以当您安装时,新的内部依赖项和通配符最终会破坏您认为是 'locked down' 的模块。

看到问题了吗?对 顶级 版本的版本控制进行硬编码,但不强制执行任何低于该版本的内容......如果您依赖的模块作者(或模块 他们 depend up on) 使用通配符,你不能 100% 确定事情会是copacetic。

要严格执行某个版本,您需要使用 npm shrinkwrap。 (文档中的 link 提供了更多背景知识,如果您的项目使用多个非常简单的模块,这有助于理解。)

现在...你的问题。

你说:

I mean, what if something happens and npm is not available or the specific version of a module can't be found?

根据这个答案的前两部分,现在应该很清楚在 package.json 中明确列出依赖项并没有什么坏处,因为节点不会在每次应用程序时都进行检查运行。 npm 在调用特定操作(安装、更新等)时使用 package.json,但即便如此,它也是手动触发。

虽然情况各不相同,但我可以想象在 package.json 中省略依赖项是个好主意的情况很少见。如果您最终不得不重建项目,您就会有麻烦了。如果项目好到你想分享它,那你就有麻烦了。哎呀,如果这是工作用的东西,你想去度假,需要在另一台机器上安装它……你就有麻烦了。

因此,考虑到在初始安装后,依赖项没有负面影响...使用 --save 或将依赖项添加到您的 package.json。你未来的自己会感谢你。 :)