最近在修改项目的CI文件,发现CI里执行的是npm ci 而不是 npm i,于是好奇搜索了下,npm i 和 npm ci 有什么区别?
npm i
(即 npm install
)和 npm ci
都是用于安装 Node.js 项目的依赖项,但它们的行为和用途有明显不同,适用于不同的场景。以下是两者的关键区别:
简要区别总结:
特性/行为 | npm install (npm i ) | npm ci |
---|---|---|
是否使用 package-lock.json | 会参考,但可能会修改 | 严格依赖,完全根据 package-lock.json 安装 |
是否会修改 package-lock.json | 可能会修改(如版本不一致) | 不会修改 |
是否删除 node_modules | 不会自动删除 | 会先删除整个 node_modules 再全量安装 |
安装速度 | 较慢,尤其是在不一致时 | 通常更快,适用于 CI 场景 |
是否允许 package-lock.json 缺失 | ✅ 可以安装 | ❌ 不允许,必须存在 package-lock.json |
用途推荐 | 日常开发使用 | 持续集成 / 自动化部署 |
🧪 举个例子说明差异:
如果你的 package.json
中是这样:
CopyEdit
"dependencies": {
"lodash": "^4.17.0"
}
package-lock.json
中锁定的是:
CopyEdit
"lodash": "4.17.21"
-
如果你运行
npm install
:- 它会安装
lodash@4.17.21
,但也可能安装其他兼容版本(受网络或缓存影响)。 - 它可能会更新
package-lock.json
(比如发现有新版本或 lock 文件不一致)。
- 它会安装
-
如果你运行
npm ci
:- 它会强制安装
package-lock.json
中指定的lodash@4.17.21
。 - 不允许任何变动,不允许有新的依赖或版本不一致,否则报错。
- 它会强制安装
🎯 适用场景建议
场景 | 推荐命令 | 理由 |
---|---|---|
本地开发环境 | npm install | 更灵活,可以添加新依赖,适合迭代开发 |
CI/CD 自动化构建环境 | npm ci | 保证构建的一致性,避免引入不可预期的版本变更 |
第一次安装项目 | npm install | 不需要 lock 文件也能运行,适合初次 clone 下来的项目 |
构建镜像、部署前构建 | npm ci | 快速、确定性强、干净的环境 |
⚠️ 注意事项
npm ci
要求项目中存在package-lock.json
,否则会失败。- 如果你改了
package.json
中的依赖(版本号变化),没更新 lock 文件,npm ci
也会失败。
如果你在 CI/CD 管道中构建前端项目(例如 Vite/Next.js/React 应用),推荐使用:
npm ci
以保证每次构建依赖一致、稳定、可复现。