作者:Kostas Bariotis
翻译:疯狂的技术宅
原文:https://blog.logrocket.com/wh…
未经允许严禁转载
在本文中,我们将介绍 package-lock.json
为什么重要,以及如何与 NPM CLI 一起使用。
历史
NPM v5 引入了 package-lock.json
,将其作为捕获在任意时刻安装的确切依赖树的机制。
这会有助于在不同环境中进行协作,在这种环境中,你希望每个人都为项目的特定版本获取依赖项以得到同一棵依赖树。
package.json
使用语义版本定义所需的依赖项及其各自的版本。但是语义版本控制可能很棘手。
考虑一个表示为 "express": "^4.16.4"
的依赖项。
该模块的发布者(不使用 package-lock.json
)将安装版本为 4.16.4 的 Express,因为他们安装了最新版本。
如果 express
在我下载该模块并尝试安装依赖项时发布了新版本,则可以下载最新版本。
这些信息 caret
符号可以准确地告诉我们。
上面的问题是,如果 4.17.x 版本存在一个错误,则我的本地设置将会失败,但是发布商的版本将继续在旧版本上正常运行。
在生产环境中可能会发生同样的事情,并且你不知道为什么它会失败。
在 NPM v5 之前,你需要使用 shrinkwrap
。它与 package-lock.json
不同,因为它可以与模块一起发布到 NPM 注册表中,而 package-lock.json
则不允许。
如果所有成员都可以使用 NPM+5,则最好对未发布的项目使用 package-lock.json
。
但是,如果你正在开发模块并打算发布它,则需要考虑是否要让客户端安装你指定的确切依赖关系树,或者是否希望灵活一些。这里是该主题的更详细的版本。
因此,package-lock.json
将描述当前安装的确切依赖树。该格式在 NPM 文档中进行了描述。
通过将其提交到你的 VCS(绝对应该这样做),可以返回历史记录并复制确切的依赖关系树。
确保始终向你的 VCS 提交 package-lock.json
,以在任何给定时间跟踪确切的依赖树。
它将确保下载你项目并尝试安装依赖项的所有客户端都能够获得完全相同的依赖树。此外这也确保你能够检出先前的提交并复制每个提交的依赖状态。
package.json
与 package-lock.json
要确保你不去直接更改 package-lock.json
。这将由 NPM 自动处理。它将对 package.json
的更改反映到 package-lock.json
,并保持最新。
但是只有在使用 NPM 的 CLI 进行更改时,才会发生这种情况。如果你手动更改 package.json
,则不要期望 package-lock.json
会更新。要始终使用 CLI 命令,例如 install
,uninstall
等。
如何使用 NPM CLI
当你首次在新项目中使用 NPM 时,它会自动生成 package-lock.json
。
然后,你就可以正常使用 NPM 了。
npm install(使用特定模块作为参数)
可以将 install
与要安装的模块名一起使用,这将更改 package.json
和 package-lock.json
,因为依赖关系树将会发生变化。
考虑下面的例子:
npm install express body-parser cors
npm install(不带参数)
install
将尝试安装与 package-lock.json
相关的所有依赖项。
这里的关键是,如果 install
注册已经过期,则可以更改 package-lock.json
。
如果有人手动更改 package.json
(例如,他们删除了一个软件包,因为这只是删掉一行),那么下次有人运行 npm install
时,它将更改 package-lock.json
以反映对先前软件包的删除。
这可能很棘手。想象一下,拉取项目的最新版本,当运行 npm install
获取最新信息时,却发现树中进行了许多毫无意义的更改。
你树中的更改很可能对审核你的代码更改的人没有意义。
npm uninstall
与 install
类似,但需要用要被删除的模块名称作为参数。这将同时更改 package.json
和 package-lock.json
。
npm update
update
将会读取 package.json
,用来查找可以更新的所有依赖项。随后它将构造一个新的依赖关系树并更新 package-lock.json
。
还记得语义版本控制吗?假设我们在 package.json
中有一个依赖项,状态为 ^1.4.5
。
字符 ^
告诉 NPM 检查在 1.X.X
范围内是否有较新版本,如果有,则进行安装。类似地,〜
字符只会出现在热修复程序或 1.4.X
上。
你也可以省略特殊字符并保留固定版本,这会减少 package-lock.json
的帮助(但并非没有用)。
npm ci
ci
将安装与 package-lock.json
有关的所有依赖项,类似于 install
。这里的主要区别在于,在任何情况下都不会更改 package-lock.json
。
其目的是要在某些环境中使用,例如构建服务器时以自动方式进行安装等。
结论
使用 package-lock.json
时,请记住以下关键要点:
不要在没有参数的情况下使用 npm install
来获取依赖关系,所以请使用 npm ci
。你可以用 npm install
安装特定的依赖项。
仅在需要本地依赖关系树时,甚至在本地开发环境中,都可以在所有地方使用 npm ci
。
为你依赖关系的更新做一个重复的任务,例如每月一次。(或者,你可以用 dependabot 之类的服务,但请确保测试覆盖率良好)。
这样,你可以确保你的依存关系是最新的,并避免技术债。
更多参考
-
npm install
和npm ci
之间的区别:https://stackoverflow.com/que… - NPM CLI 源代码:https://github.com/npm/cli/bl…
- 语义版本控制:https://blog.npmjs.org/post/1…
本文首发微信公众号:前端先锋
欢迎扫描二维码关注公众号,每天都给你推送新鲜的前端技术文章
欢迎继续阅读本专栏其它高赞文章:
- 深入理解 Shadow DOM v1
- 一步步教你用 WebVR 实现虚拟现实游戏
- 13 个帮你提高开发效率的现代 CSS 框架
- 快速上手 BootstrapVue
- JavaScript 引擎是如何工作的?从调用栈到 Promise 你需要知道的一切
- WebSocket 实战:在 Node 和 React 之间进行实时通信
- 关于 Git 的 20 个面试题
- 深入解析 Node.js 的 console.log
- Node.js 究竟是什么?
- 30 分钟用 Node.js 构建一个 API 服务器
- Javascript 的对象拷贝
- 程序员 30 岁前月薪达不到 30K,该何去何从
- 14 个最好的 JavaScript 数据可视化库
- 8 个给前端的顶级 VS Code 扩展插件
- Node.js 多线程完全指南
- 把 HTML 转成 PDF 的 4 个方案及实现
- 更多文章 …