npm i 和 npm ci 有什么区别?

9 阅读2分钟

最近在修改项目的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

以保证每次构建依赖一致、稳定、可复现。