管理 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 中使用 install
或 update
命令安装包。 这些命令现在大多可互换。 若要更新包,通常使用:
- 最新版本:
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.json
和package-lock.json
文件就版本规则达成一致,则不会发生冲突。 例如,如果package.json
指定1.x
且package-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
是识别和修复漏洞的好做法,有助于确保项目的整体安全性。
建议的更新工作流
建议用于更新的工作流为:
npm run test
:在启动此更新过程之前,请验证现有测试是否通过。npm audit
:检查正在使用的当前版本中的漏洞。 来自npm audit
的信息可能会建议更新到主版本。 如果列出了中断性变更,则应仔细查看这些变更。npm outdated
:列出所有已过时的包。 此命令提供“所需版本”、“最新版本”和“位置”列中的信息。- 使用
npm update
进行更新:- 对于较小的项目(
package.json
中的少数依赖项:可以尝试npm update
来更新所有依赖项,然后运行测试。 - 对于大型项目(
package.json
中包含许多依赖项:更新单个包或包系列(如 Next.js 和 React),然后运行测试。
- 对于较小的项目(
npm audit
:确认不存在严重或高危漏洞。 如果漏洞仍然存在,请使用npm update
,且确保包名称和主要版本是npm audit
推荐的。- 再次
npm run test
。 - 签入
package.json
和package-lock.json
。