为什么要使用 package-lock.json[每日前端夜话0xCE]
source link: https://www.tuicool.com/articles/MRV36rn
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
每日前端夜话 0xCE
每日前端夜话,陪你聊前端。
每天晚上18:00准时推送。
正文共:1533 字
预计阅读时间:12 分钟
作者:Kostas Bariotis
翻译:疯狂的技术宅
来源: logrocket
在本文中,我们将介绍 package-lock.json
为什么重要,以及如何与 NPM CLI 一起使用。
历史
NPM v5 引入了 package-lock.json
, 将其作为捕获在任意时刻安装的确切依赖树的机制。
这会有助于在不同环境中进行协作,在这种环境中,你希望每个人都为项目的特定版本获取依赖项以得到同一棵依赖树。
package.json
使用语义版本【 https://semver.org/ 】定义所需的依赖项及其各自的版本。但是语义版本控制可能很棘手。
考虑一个表示为 "express": "^4.16.4"
的依赖项。
该模块的发布者(不使用 package-lock.json
)将安装版本为 4.16.4 的 Express ,因为他们安装了最新版本。
如果 express
在我下载该模块并尝试安装依赖项时发布了新版本,则可以下载最新版本。
这些信息 caret
符号可以准确地告诉我们【 https://stackoverflow.com/a/22345808/1955940 】。
上面的问题是,如果 4.17.x 版本存在一个错误,则我的本地设置将会失败,但是发布商的版本将继续在旧版本上正常运行。
在生产环境中可能会发生同样的事情,并且你不知道为什么它会失败。
在 NPM v5 之前,你需要使用 shrinkwrap
。它与 package-lock.json
不同,因为它可以与模块一起发布到 NPM 注册表中,而 package-lock.json
则不允许。
如果所有成员都可以使用 NPM+5,则最好对未发布的项目使用 package-lock.json
。
但是,如果你正在开发模块并打算发布它,则需要考虑是否要让客户端安装你指定的确切依赖关系树,或者是否希望灵活一些。这里是该主题的更详细的版本【 https://stackoverflow.com/a/46132512/1955940 】。
因此, package-lock.json
将描述当前安装的确切依赖树。该格式在NPM文档【 https://docs.npmjs.com/files/package-lock.json#dependencies-1 】中进行了描述。
通过将其提交到你的 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
,因为依赖关系树将会发生变化。
考虑下面的例子:
1npm 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 【 https://dependabot.com/ 】之类的服务,但请确保测试覆盖率良好)。
这样,你可以确保你的依存关系是最新的,并避免技术债。
更多参考
-
npm install
和npm ci
之间的区别: https://stackoverflow.com/questions/52499617/what-is-the-difference-between-npm-install-and-npm-ci -
NPM CLI 源代码: https://github.com/npm/cli/blob/latest/lib/install.js
-
语义版本控制: https://blog.npmjs.org/post/162134793605/why-use-semver
原文: https://blog.logrocket.com/why-you-should-use-package-lock-json/
下面夹杂一些私货:也许你和高薪之间只差这一张图
2019年京程一灯课程体系上新,这是我们第一次将全部课程列表对外开放。
愿你有个好前程,愿你月薪30K。我们是认真的 !
在公众号内回复“体系”查看高清大图
长按二维码,加大鹏老师微信好友
拉你加入前端技术交流群
唠一唠怎样才能拿高薪
往期精选
小手一抖,资料全有。长按二维码关注 前端先锋 ,阅读更多技术文章和业界动态。
Recommend
-
39
In this article, we’ll look at package-lock.json , why it’s important, and how it’s best used along with NPM CLI in your day-to-day life. History NPM version 5 introduced package-...
-
5
标签:夜话返回所有文章列表也谈9962021-01-13最近网络上有很多 996 相关话题...
-
3
2021年末广告业「围炉夜话」
-
6
5位大咖围炉夜话:哪些印象深刻的创新?又有哪些值得关注的赛道BeWater Community2022-01-31热度: 44018大咖分享带你洞见行业机会。
-
2
当前位置:DaoCloud道客博客 > 干货 > 活动开启|论道原生:围炉 Githu...
-
1
Q: 【游研夜话】游戏、美食、运动,你还想加入哪些“兴趣小组”?...
-
2
Q: 【游研夜话】拔草!你认为哪些夏促游戏需要避雷?...
-
13
查看: 313|回复: 0 [原创] 项目经理年终夜话:我的“第二年状态”
-
1
Q: 【有奖夜话】元宵节将至,我们来征集灯谜啦!
-
1
2023广告业「围炉夜话」:6位大咖导演,36句精彩语录
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK