Node.js 中 npm i 和 npm ci 的区别

2025年2月13日 | 阅读 5 分钟

Node.js 生态系统中,依赖项的管理是构建和运行应用程序的重要因素之一。Npm 是 node.js 的官方包管理器,它随 node.js 一起打包,并广泛用于此目的。最广泛部署的命令包括 npm install (或 npm i)。 两者都用于安装软件包,但由于其功能性质,它们具有不同的特征。了解 npm inpm ci 之间的区别,以避免在选择适合特定应用程序条件的命令时出错,这非常有用。

npm install 或 npm i 的含义是什么?

npm install 是最常运行的 npm 命令之一。它安装项目包中指定的依赖项。该命令存储在一个 JSON 文件中,可用于管理依赖项的广泛任务。

主要特性和行为

npm i 的几个主要特性如下:

  • 安装依赖项:当 npm install 在没有参数的情况下执行时,它会安装 package.json 文件中 dependencies 和 devDependencies 字段中指定的依赖项。如果存在 json 文件,npm 会使用它来安装 json 文件中提到的相同的依赖项版本。如果缺少锁文件,npm 会根据已安装的依赖项版本创建一个锁文件。
  • 更新 package-lock.json:假设 package.json 文件有任何更改(例如,如果我们添加了一个新依赖项),npm install 会生成一个新的 package-lock。它已添加到安装代码片段中,以更新 json 文件中的更改,以便下次安装使用正确的版本。
  • 尊重版本范围:npm install 还遵守 jar 中提出的版本或 package.json 文件中维护者指定的版本。例如,如果一个依赖项列为“express”:4.17.1 范围,那么 Node Package Manager 或 npm 将安装 4.x.x 范围内的 Express 版本,但不是新的主版本。
  • 安装新依赖项:可以使用 npm install <package-name> 将新依赖项添加到项目中。它会更新 ./package.json 文件,并安装 package.json 和 package-lock.json 文件,其中新依赖项与具有旧依赖项的原始文件不同。

npm ci 是什么?

npm ci 是 “clean install”(干净安装) 的缩写,旨在用于自动化环境,例如 CI。与 npm install 相比,它是一个可以更快、更确定地安装依赖项的命令。

主要特性和行为

npm ci 的几个主要特性如下:

  • 严格依赖项解析:npm ci 直接根据 package-lock.json 文件设置依赖项。它确保只安装锁文件中指定的精确版本。如果 package-lock.json 文件与 package.json 文件中的 package 版本不匹配,npm ci 将抛出错误。
  • 更快的安装:npm ci 通常比 npm install 更快,因为它不执行诸如创建新锁文件和检查包新版本等操作。这使其成为 CI/CD 流水线的理想选择,因为速度通常是此处非常重要的因素。
  • 干净的安装:与 npm install 类似,npm ci 也不修改 package.json,但在安装依赖项之前,它会删除 node_modules 文件夹。它确保依赖项处于干净且一致的状态,这在处理自动化复制品时至关重要。
  • 确定性安装:它还接收一个 package-lock.json 文件,而不使用 package.json 文件,这使其与其他持续集成和交付服务不同。json 文件,npm ci 确保每次都安装相同的依赖项,从而管理构建,使其标准化且唯一。

npm i 和 npm ci 的主要区别

Difference between npm i and npm ci in Node.js

以下是 npm i 和 npm ci 之间的区别:

特点npm installnpm ci
使用场景它特别适用于开发中日常活动。它允许开发人员轻松安装、修改和版本化依赖项。它旨在为自动化环境生成高度可重用的代码,这需要可重复性和效率。它是 CI/CD 流水线的理想选择。
依赖来源它使用 package.json 来决定需要安装哪些包,并使用 package-lock.json 来确定精确的版本。它使用 package-lock.json 来安装包,并明确指示要安装的包的版本。
版本灵活性根据 package.json 中定义的范围更新到最新的兼容版本。使用 package-lock.json 重新创建包,并使用与 .json 中安装的完全相同的版本,确保没有偏差。
丢失的包此功能尝试安装 package.json 中列出的任何缺失的依赖项。它会复制 package-lock.json 中提供的所有依赖项,从而每次都使用干净的数据结构。
过多的包它不会自动删除多余的包,虽然这比根本不使用 Docker 要好,但它可能会在 node_modules 中留下许多未使用的包。它在安装前会清理所有目录,因此不会留下零散的包来混淆机器。
速度由于有版本解析和更新锁文件的两个额外步骤,它比第一个命令花费的时间稍长。它更快,因为它有助于消除版本控制和处理锁文件的步骤。
一致性确定性较低,因为它可能会安装一些与计算机上现有的软件产品兼容的最新版本。它通过 DependencyLock 实现,后者保持高度确定性,确保安装 package-lock.json 中的版本。
错误处理它在 package.json 和 package-lock 发生错误处理的区域提供了灵活性。检查包是否存在任何与其规范不一致的情况,如果发现任何不一致,它将返回一个错误。json 和 package-lock.json,确保一致性。

结论

在 Node.js 生态系统中,管理依赖项是一项关键实践,开发人员必须掌握 npm install (npm i) 和 npm ci 之间的区别。npm install 通常在日常开发中使用,用于安装 package.json 中定义的依赖项,可选地更新 package-lock.json 并尊重版本范围,这使其适合动态依赖项管理和添加新包。另一方面,npm ci 是为 CI/CD 环境 而设计的,因为它遵循 package-lock.json,并且通过删除 node_modules 文件夹在安装前清理应用程序,因此打包更快、更可预测。

它使得在确保构建环境尽可能一致方面更加可靠,并且速度非常快,这使其成为确保我们始终可以重新创建构建环境的理想选择。评估 install 的具体用法并在适当的时候使用 ci 有助于成功管理 Node.js 中的依赖项和安全开发项目。