管理 Node.js 项目中的依赖项更新

已完成

作为 Tailwind Traders 的开发人员,请务必使包保持最新。 这有助于确保我们使用最新的功能和修补程序。 这还有助于我们避免安全漏洞的威胁。 在本单元中,你将了解如何管理 Node.js 项目中的依赖项。 你将了解如何更新包、使用语义版本控制和管理安全问题。

更新包前的注意事项

在更新包之前,请考虑:

  • 更新类型:了解它是次要修复、新功能还是可能会中断代码的重大更改。 语义版本控制可以帮助识别这一点。
  • 项目配置:确保项目设置为仅接收需要的更新以避免意外更改。
  • 安全性:注意潜在的漏洞。 使用 npm 的审核功能识别和更新有问题的包。
  • 测试:确保在更新后通过测试。 如果没有测试,请考虑添加它们。 更新后,应用程序的行为可能会有所不同,测试会验证正确的行为。

用于定义更新行为的语义版本控制

语义版本控制是软件开发的关键标准。 这对于发布和使用 npm 包至关重要。 它通过指示新版本中的更改类型来帮助管理更新风险。 版本号包含特定部分来反映这些更改:

版本类型 Position 语法 发生了什么情况 更新方法
Major 1st x.0.0 or * 从 1.0.0 更改为 2.0.0 代表中断性变更。 可能需要进行代码调整。 熟悉对最新主版本的即时更新,确认潜在的代码更改。
Minor 第 2 个 1.x.1 或 ^ 从 1.2.9 更改为 1.3.0 表示引入了新功能。 现有代码应仍能正常运行。 更新通常是安全的。 接受新功能,而不是中断性变更。
Patch 第三 1.1.x or ~ 从 1.0.7 更改为 1.0.8 代表 bug 修复。 更新应该是安全的。 接受 bug 修复。

对于小型 Node.js 项目,可以自由更新到最新版本。 但对于大型项目,需要仔细考虑更新,并且更新并不总是自动的。 通常,更新较小的依赖项(其自己的依赖项较少)可简化过程。

在更新一个或多个依赖项之前,应配置package.json文件,以便在运行 npm update <name of dependency> 命令时获得可预测的行为。 Node.js 包含一组符号,允许你定义包的更新方式。

使用 npm CLI 更新包

可以在 npm 中使用 installupdate 命令安装包。 这些命令现在大多可互换。 若要更新包,通常使用:

  • 最新版本:npm update <package name>@latest
  • 特定版本:npm update <package name>@<optional version number>

更新过程取决于两个因素:

  • 版本参数:如果在 npm update 命令中指定了版本号,npm 将提取并安装该特定版本。
  • 清单文件条目package.json 文件包含用于更新依赖项的规则。 例如,"dependencyName": "1.1.x" 意味着 npm 将提取与此模式匹配的版本。

了解版本控制

三个文件控制着依赖项的版本控制:

  • package.json:此文件定义要使用的包的版本。 它是项目的清单文件。 它包含项目的元数据,包括依赖项。
  • package-lock.json:此文件描述生成的确切树,以便后续安装能够生成相同的树,无论中间经历怎样的依赖项更新。 此文件将被提交到源存储库中。
  • shrinkwrap.json:此文件由 npm shrinkwrap CLI 命令创建,类似于 package-lock.json。 这些命令之间的主要区别是用户无法重写在 npm-shrinkwrap.json 中指定的包版本。 此外,npm-shrinkwrap.json 文件与较旧版本的 npm(版本 2-4)兼容,而 package-lock.json 与 npm 版本 5 及更高版本兼容。 因此,在维护旧版代码库时,你可能会发现 npm-shrinkwrap.json。 大多数开发人员将使用 package-lock.json 而非 npm-shrinkwrap.json。 首选使用 npm-shrinkwrap.json 的一个例外是守护程序和命令行工具的全局安装,在这种情况下,开发人员希望确保安装指定包的确切版本。

有关如何确定包版本的示例

请考虑以下情况:你在代码中使用版本 1.2,之后发布了版本 1.4, 中断了你的代码。 如果此时有人安装了你的应用,他们将获得无法运作的应用。 但是,如果有 package-lock.json 文件指定版本 1.2,则将安装该版本。

下面是确定安装包版本的示例:

  • 如果 package.jsonpackage-lock.json 文件就版本规则达成一致,则不会发生冲突。 例如,如果 package.json 指定 1.xpackage-lock.json 指定版本 1.4,则将安装版本 1.4。
  • 如果 package.json 指定更具体的版本(如 1.8.x),则它将替代 package-lock.json 该文件,后者指出旧版 1.4。 在这种情况下,将安装版本 1.8.0 或更高补丁版本(如果可用)。

查找和更新包含过时 npm 的过时的包

npm outdated 命令用于标识具有较新可用版本的包。 运行时,它会提供以下过时包的列表:

Package       Current    Wanted   Latest     Location     Depended by
lodash        1.0.0      1.0.0    4.17.19    lock-test    main-code-file
node-fetch    1.2.0      1.2.0    2.6.0      lock-test    function-code-file

输出中的列包括:

说明
程序包 过时包。
当前 当前安装的包版本。
想要 与在 package.json 文件中指定的语义模式匹配的最新版本。
最晚 包的最新版本。
位置 包依赖项的位置。 outdated 命令会遍历各 node_modules 文件夹中的所有已安装的包。
取决于 具有依赖项的包。

使用 npm 审核管理安全问题

每次安装或更新包时,都会获得日志响应,告知已安装的版本以及是否存在任何漏洞。 该日志会列出漏洞。 如果有任何严重或高危别漏洞,应该更新包。

日志响应的示例如下:

+ lodash@1.3.1
added 1 package from 4 contributors and audited 1 package in 0.949s
found 3 vulnerabilities (1 low, 2 high)
  run `npm audit fix` to fix them, or `npm audit` for details

要修复问题并应用更新,可以运行 npm audit 命令。 此命令会列出每个漏洞。

npm audit fix 命令会尝试通过升级到不存在该问题的次要版本来解决漏洞。 但是,如果修补程序实际上是在下一个主要版本中,则可能不可用。

在这种情况下,可能需要使用 npm audit fix --force,它可以通过更新到主要版本来引入重大变更。 运行此命令需要慎重考虑。 应注意中断性变更,并使用 npm update 更新包括漏洞的代码。

漏洞是攻击者可以利用的代码缺陷,他们可利用这些缺陷执行恶意操作,可能会破坏你数据和系统。 及时解决这些漏洞至关重要。

考虑到漏洞的频繁发现,GitHub 具有扫描存储库并自动创建建议升级到更安全版本的 PR 的功能。 定期运行 npm audit 是识别和修复漏洞的好做法,有助于确保项目的整体安全性。

建议用于更新的工作流为:

  1. npm run test:在启动此更新过程之前,请验证现有测试是否通过。
  2. npm audit:检查正在使用的当前版本中的漏洞。 来自 npm audit 的信息可能会建议更新到主版本。 如果列出了中断性变更,则应仔细查看这些变更。
  3. npm outdated:列出所有已过时的包。 此命令提供“所需版本”、“最新版本”和“位置”列中的信息。
  4. 使用 npm update 进行更新:
    • 对于较小的项目(package.json 中的少数依赖项:可以尝试 npm update 来更新所有依赖项,然后运行测试。
    • 对于大型项目(package.json 中包含许多依赖项:更新单个包或包系列(如 Next.js 和 React),然后运行测试。
  5. npm audit:确认不存在严重或高危漏洞。 如果漏洞仍然存在,请使用 npm update,且确保包名称和主要版本是 npm audit 推荐的。
  6. 再次 npm run test
  7. 签入 package.jsonpackage-lock.json