package.json 配置

如果你正在使用大量 npm 包开发一个 Node.js 应用程序,当更新了一个或多个包时,在构建项目时很常见会遇到警告或错误。 有时会出现版本冲突,或者包版本已被弃用。 下面是几个快速提示,可帮助你配置 package.json 文件,并了解出现警告或错误时发生的情况。 这不是 package.json 的完整指南,仅专注于 npm 包的版本管理。

npm 包版本控制系统有严格的规则。 版本格式如下所示:

[major].[minor].[patch]

假设应用中有一个版本为 5.2.1 的包。 主版本为 5,次要版本为 2,修补程序为 1。

  • 在主要版本更新中,该包包含向后不兼容的新功能,即破坏性变更。
  • 在次要版本更新中,已添加新功能到软件包中,这些功能与早期版本的软件包保持向后兼容。
  • 在修补程序更新中,包括一个或多个漏洞修复。 Bug 修复始终是后向兼容的。

值得注意的是,某些 npm 包功能具有依赖项。 例如,若要将 TypeScript 编译器包(ts-loader)的新功能与 Webpack 配合使用,可能还需要更新 webpack npm 包和 webpack-cli 包。

为了帮助管理包版本控制,npm 支持可在 package.json中使用的多个表示法。 可以使用这些表示法来控制要在应用中接受的包更新的类型。

假设你使用的是 React,需要包含 react 和react-dom npm 包。 可以在 package.json 文件中通过多种方式指定该设置。 例如,可以指定使用包的确切版本,如下所示。

"dependencies": {
  "react": "16.4.2",
  "react-dom": "16.4.2",
},

使用上述表示法,npm 将始终获取指定的确切版本 16.4.2。

可以使用特殊标记来限制修补更新(bug 修复)。 在本示例中:

"dependencies": {
  "react": "~16.4.2",
  "react-dom": "~16.4.2",
},

使用波浪符(~)字符告诉 npm 仅在软件包被修补时更新。 因此,npm 可以将 react 16.4.2 更新为 16.4.3(或 16.4.4 等),但它不接受对主版本或次要版本的更新。 因此,16.4.2 不会更新到 16.5.0。

还可以使用^(尖角符号)来指定 npm 更新次要版本号。

"dependencies": {
  "react": "^16.4.2",
  "react-dom": "^16.4.2",
},

使用此表示法,npm 可以将 react 16.4.2 更新为 16.5.0(或 16.5.1、16.6.0 等),但它不接受对主版本的更新。 因此,16.4.2 不会更新到 17.0.0。

npm 更新包时,它会生成一个 package-lock.json 文件,其中列出了应用中使用的实际 npm 包版本,包括所有嵌套包。 虽然 package.json 控制应用的直接依赖项,但它不控制嵌套依赖项(特定 npm 包所需的其他 npm 包)。 如果需要确保其他开发人员和测试人员使用所使用的确切包(包括嵌套包),则可以在开发周期中使用 package-lock.json 文件。 有关详细信息,请参阅 npm 文档中 package-lock.json

对于 Visual Studio, package-lock.json 文件不会添加到项目中,但你可以在项目文件夹中找到该文件。