如何更新NPM依赖

Node 软件包管理器(NPM)提供了各种功能来帮助你安装和维护项目的依赖关系。

当使用 npm install <packagename> 安装软件包时,该软件包最新的可用版本会被下载并放入 node_modules 文件夹中,并且还会将相应的条目添加到当前文件夹中存在的 package.jsonpackage-lock.json 文件中。

由于错误修复、新功能和其他更新,依赖关系可能会随着时间的推移而变得过时。你的项目依赖越多,就越难跟上这些更新。

老旧的软件包会对安全构成威胁,并会对性能产生负面影响。最新的软件包可以防止出现漏洞。这意味着定期检查和更新依赖是很重要的。

更新依赖包流程

最直接的办法逐一查看 package.json 中的每一个单独的包,改变版本,然后运行 npm install <package>@latest 来获得最新版本。但这并不是最有效的方法,想象一下如果你的项目中有20个或更多的依赖包需要更新,这样每个包单独更新会比较困难。

可以制定一个更新工作流程:首先需要明确哪些软件包需要更新,以及版本落后的程度。接下来,选择单独或一起批量更新软件包。始终对更新进行测试,以确保没有发生破坏性变化。对于主要的更新,很可能会遇到破坏性的变化。与许多包一起更新相比,撤销或处理与一个包有关的代码变化要容易得多。

检查需要更新的依赖

若要检查每个已安装的依赖关系,并将当前版本与 npm registry 中的最新版本进行比较需要运行 npm outdated命令。该命令会在终端打印出一个表格概述可用的版本。它是内置在 NPM 中的,不需要下载额外的软件包。npm outdated 可以帮助我们了解所需的依赖性更新的数量。如图所示:
avatar

  • Current是当前安装的版本
  • Wanted是根据semver(版本号管理系统)范围内的软件包的最大版本
  • Latest是在 npm registry 中被标记为最新的软件包版本

要安装每个软件包的更新,你只需要运行npm update但需要注意的是使用 npm update 不会更新到一个主要的(major),具有破坏性变化的版本,主版本永远不会被这种方式更新,因为它们(根据定义)会引入重大的更改,npm 希望为你减少麻烦。它会更新 package.jsonpackage-lock.json 中的依赖关系。

npm模块依赖存在的问题

avatar
假设你的项目模块依赖如上图所示,@1.2.1代表这个模块的版本,在你安装A的时候需要安装依赖E和F,很多依赖不会指定版本号默认会安装最新的版本,这样就会出现问题:比如今天安装模块的时候E和F是某一个版本,而当以后E、F更新的时候,再次安装模块就会安装E和F的最新版本,如果新的版本无法兼容你的项目,你的程序可能就会出Bug,甚至无法运行。

package-lock.json的作用

package-lock.json是在执行npm install命令时生成的一份文件,用以记录当前状态下实际安装的各个 npm package 的具体来源和版本号。package-lock.json 文件的作用锁定安装时的包的版本号,并且需要上传到git,以保证其他人在npm install时大家的依赖能保证一致。

package-lock.json文件可以用来锁定版本。例如:如果你的项目依赖了@1.2.1版本,如果你重新进行 npm install 并且项目中包含package-lock.json文件时,就能锁定版本号防止自动升级到新版防止项目无法兼容导致的不可预测的Bug。

当前版本可以满足依赖树中多个依赖项的版本号要求时,npm将优先考虑在树中使用当前版本而不是更新到最新版本。为了获得”最新”的版本,在单个安装中附加 @latest,例如 npm install react@latest

怎样使用npm-check-updates

若要将所有软件包更新到新的主版本,则需要全局地安装 npm-check-updates 软件包。

1
npm install -g npm-check-updates

这个包可以做所有 npm oudatednpm upgrade 能做的事情,并增加了一些自定义选项。

安装好npm-check-updates之后,运行ncu命令来显示要升级的软件包。如果提示ncu不被识别为内部或外部命令,尝试运行npx npm-check-updates命令npm outdated命令类似他不会产生任何变化。
avatar

要升级依赖项,只需要运行以下的命令:

1
2
3
4
5
ncu --upgrade
//或者
ncu -u
//或者
npx npm-check-updates -u

avatar

  • 显示红色 = major (主版本,或者说是大版本)
  • 显示青色 = minor(次要版本)
  • 显示绿色 = patch (补丁版本)

这个方法只更新 package.json 文件中的依赖关系,并且会选择最新的版本,即使它包括一个会对当前项目长生破坏性的变化,这会升级 package.json 文件的 dependenciesdevDependencies 中的所有版本,以便 npm 可以安装新的主版本。使用这种方法,npm install 不会自动运行,所以一定要在之后运行它 npm install 来更新 package-lock.json文件。

选择你要更新的版本类型,运行 ncu –target [patch, minor, latest, newest, greatest]

使用 npm-check-updates 互动模式
1
2
3
4
5
ncu --interactive
//或者
ncu -i
//或者
npx npm-check-updates -i

互动模式允许你选择特定的软件包进行更新。默认情况下,所有软件包都被选中。
向下浏览每一个软件包,用空格来取消选择,当你准备好升级所有选择的软件包时,回车键(enter)确定。

avatar

ncu --interactive --format group命令将软件包分组并组织成 主版本(major)、次要(minor)和补丁(patch)版本。

参考文档

npm-update文档
npm-outdated文档
npm-check-updates文档