我们怎样才能安全地升级项目中的npm依赖项?在依赖包的版本前面,那些有趣的^
和~
字符是什么意思?我们如何对项目中的npm依赖包进行重大版本升级?我们将在这篇文章中找到答案。
版本部分
npm包的版本管理遵循语义版本管理。所以,一个包的版本有3个部分 -Major.Minor.Patch
- 补丁:当进行了不会破坏消耗代码的错误修复时,这个会被递增。
- 次要的:当添加了不会破坏消耗代码的功能时,它会被递增。
- 主要的:当进行破坏性的修改时,这个值会被递增。
^
和~
是什么意思?
一个版本前面通常有一个^
(例如:^16.8.6
)。这意味着最新的次要版本可以被安全地安装。因此,在这个例子中,如果这是16.x
中的最新版本,则可以安全地安装^16.12.1
。
有时一个版本前面有一个~
(例如:~16.8.6
)。这意味着只有最新的补丁版本可以安全安装。所以在这个例子中,如果这是16.8.x
中的最新版本,^16.8.12
可以安全安装。
那么,npm install
安装依赖的最新安全版本?
是的,也不是!
如果软件包已经被安装到node_modules
文件夹中,那么npm install
不会更新任何软件包。
如果软件包还没有安装,并且存在一个package-lock.json
文件,那么npm install
将安装package-lock.json
中指定的确切依赖版本。
npm install
如果依赖项在 文件夹中不存在,并且没有 文件,则将安装最新的安全版本。然而,你可能认为最新的安全版本node_modules
package-lock.json
没有被安装,因为 是没有变化的,但是如果你检查 文件夹中的软件包,最新的安全版本将被安装。package.json
node_modules
那么,我如何安全地更新所有的依赖项?
首先,可以通过运行以下命令来发现已经过期的依赖项:
npm outdated
依赖项将被列出来:
想要的版本是可以采取的最新安全版本(根据语义版本和^
或~
前缀)。最新版本是npm注册表中可用的最新版本。
通过使用下面的命令,可以将所有的依赖关系安全地更新到想要的版本:
npm update
除了更新node_modules
文件夹中的包之外,package.json
和package-lock.json
文件也将被更新。
如果我们不想更新所有的包,那么可以在命令的最后指定包的名字:
npm update "react" "react-dom"
在上面的例子中,React被更新。
更新有重大变化的所有依赖项
那么,当有重大的版本变化时,我们如何升级依赖关系?
也许最安全的方法是如下。
- 检查依赖包的更新日志,看是否有可能影响我们的应用程序的突破性变化
- 如果我们认为我们可以安全地进行升级,就运行以下命令:
npm install <packagename>@latest
- 如果多个包在一起,你可以把它们都列出来。下面的例子将更新React到最新版本:
npm install react@latest react-dom@latest
- 通过做一些测试来验证应用程序没有损坏
- 对其他有重大版本变化的软件包重复这一过程
有没有一种更快的方法来更新所有的依赖关系,包括主要的版本变化?所以,像npm update
,但也是为了主要的版本更新?
是的,有一个叫做npm-check-updates的工具可以做到这一点。只要运行下面的命令:
npx npm-check-updates -u
这将把依赖关系更新到package.json
文件中的最新版本(包括主要的版本变化)。如果我们乐意继续升级,我们需要运行以下命令:
npm install
然后,这将升级node_modules
文件夹中的软件包,并且package-lock.json
文件也将被更新。
总结
- 使用
npm outdated
来发现过期的依赖项 - 使用
npm update
来执行安全的依赖性升级 - 使用
npm install <packagename>@latest
来升级到软件包的最新主要版本 - 使用
npx npm-check-updates -u
和npm install
将所有依赖关系升级到最新的主要版本