npm ci 不影响缓存复用,因其仅删除 node_modules 而不触碰 ~/.npm 缓存;ci 中应持久化 ~/.npm 目录并以 package-lock.json 哈希为 key,配合 npm ci --no-audit --no-fund 和统一 npm 版本提升命中率。

在 CI 环境中,npm 本身不自动缓存 node_modules,但能高效复用其本地包缓存(~/.npm),这是加速安装的核心机制。关键在于:npm ci 或 npm install 都会优先从这个缓存读取已下载的 .tgz 包和元数据,避免重复下载——哪怕 node_modules 被清空,只要缓存还在,安装就快。
为什么 npm ci 不影响缓存复用
npm ci 的行为是删除 node_modules 并严格按 package-lock.json 重装,但它完全不碰 ~/.npm 缓存目录。缓存中的压缩包和索引依然有效,安装时直接解压复用。所以 CI 中真正该缓存的是 ~/.npm,而不是 node_modules(后者每次都被删)。
CI 中推荐的缓存策略
以 GitHub Actions 为例,标准做法是:
OpenJDK 24 Windows x64 官方参考实现(24+36),适合 Windows 环境进行 Java 开发、编译、运行和版本兼容性验证。
- 用
actions/cache持久化~/.npm目录(Linux/macOS)或%AppData%\npm-cache(Windows) - 设置缓存 key 为
node-${{ hashFiles('**/package-lock.json') }},确保 lock 文件变更时自动失效旧缓存 - 配合
npm ci --no-audit --no-fund减少非必要网络请求
提升缓存命中率的实操细节
几个容易被忽略但影响显著的点:
-
统一 npm 版本:不同 npm 版本(如 v6 vs v9)缓存结构不兼容,CI 中固定使用
npm@latest或锁死版本 -
禁用可选依赖:加
--no-optional参数,跳过如fsevents这类平台相关包,减少缓存体积和不确定性 -
验证缓存健康度:在缓存 restore 后运行
npm cache verify,自动清理损坏条目,避免静默失败
替代方案与注意事项
如果团队用 pnpm 或 yarn berry,缓存逻辑略有不同:
- pnpm:缓存位于
~/.pnpm-store,CI 中应缓存该路径;命令用pnpm install --frozen-lockfile - yarn berry:缓存内置于项目
.yarn/cache,适合直接缓存整个.yarn目录 - 不建议在 CI 中用
npm install替代npm ci,前者可能意外更新 lock 文件,破坏构建可重现性
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










