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

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

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

是一个坏主意,因为你基本上告诉节点总是将这个模块更新到最新版本,即使你的代码可能无法处理除了当前模块以外的任何其他版本。

所以我应该做这样的事情:

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

这基本上告诉节点总是使用我的代码的模块版本。


我有一个我第一次在本地testing的应用程序。 该应用程序现在已经build成,并使用package.json dependenciesnpm已经在我的应用程序的根文件夹下本地 安装了所有适当的节点模块 (而不是全局的,在一些模糊的文件夹中,我没有立即访问和哪些是不相关的这个应用程序 – 我只是不喜欢全局安装的节点模块 – 我觉得他们..“抽象”)。

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

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

是不是最好独立于dynamic节点模块安装,并且只需要在本地安装一切,而不必使用package.json依赖项?

npm安装和更新

“你基本上是告诉节点总是把这个模块更新到最新版本”

包不会自动更新。 "*"唯一的问题就是当你第一次通过npm install来安装项目时,或者当你通过npm update手动运行更新的时候 。

我个人更喜欢select一个特定版本的模块,而不是使用任何通配符,但即使如此,还是有一些陷阱…这就是为什么npm shrinkwrap存在。

npm收缩包装

下一个问题:

基本上告诉节点总是使用我的代码周围的模块版本

Sorta真的。 假设你使用你最喜欢的模块的版本1.2.3package.json反映,但在模块本身是一个package.json依赖另一个模块,并使用"*" …所以当你安装,新的内部依赖和通配符可以打破你认为被“locking”的模块。

看到这个问题? 硬编码顶级版本的版本控制,但不强制执行下面的任何东西…如果你依赖的模块作者(或者他们依赖的模块)使用通配符,你不能100%确定的东西COPACETIC。

要严格执行一个版本,你需要使用npm shrinkwrap 。 (链接到文档提供了更多的背景,这是很好理解,如果你的项目使用超过几个非常简单的模块。)

现在…你的问题。

你说:

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

基于这个答案的前两部分,现在应该清楚的是,在package.json显式列出依赖项并不会造成什么package.json因为每次运行应用程序时,节点都不会检查事物。 当特定的动作(安装,更新等)被调用时, npm使用package.json ,但即使如此,它也是一个手动触发器。

虽然情况有所不同,但我可以想象,在package.json中省略依赖关系是个好主意。 如果你不得不重build项目,你会遇到麻烦。 如果项目如此好,你想分享它,你会遇到麻烦。 哎呀,如果这是工作的东西,你想度假,需要安装在另一台机器…你会遇到麻烦。

因此,考虑到在初始安装之后,依赖关系没有负面影响…使用 – 保存或添加依赖到您的package.json 。 你未来的自我会感谢你。 🙂