2026 年 7 月前后,很多项目里的 npm install 会第一次显得“不听话”。不是 npm 坏了,而是 npm v12 准备把几类过去默认会发生的事,改成默认不发生。

反常点在这里:开发者以为自己只是在装依赖,npm 实际上常常还在运行别人的脚本、拉 Git 仓库、解析远程 tarball。v12 的新默认值等于把一句话摆到台面上:你可以继续信,但要把信任写下来。

v12 改了三个默认信任

npm v12 预计 2026 年 7 月发布。npm 11.16.0+ 已经能通过 warning 提前暴露相关问题。这个安排很现实:别等升级当天才发现 CI/CD 卡在安装阶段。

变化项v12 默认值会拦什么不是在做什么
allowScripts默认关闭未获批准的依赖 preinstallinstallpostinstall不是禁用所有安装脚本
--allow-git默认 none直接或间接的 Git 依赖解析不是永久封杀 Git 依赖
--allow-remote默认 nonehttps tarball 等远程 URL 依赖不是封死所有非 registry 场景

最容易误读的是脚本。准确说,npm v12 默认不执行未获批准的依赖脚本。项目自己信任的包,仍然可以进 allowlist。

原生构建包要格外留意。一个包只要有 binding.gyp,哪怕没有显式写 install 脚本,npm 也可能隐式跑 node-gyp rebuild。v12 下,这类行为也会被拦。

Git、file、link 依赖里的部分 prepare 脚本,也会按同一逻辑处理。allow-fileallow-directory 的默认值不变,所以这次不是一刀切。

Git 依赖被收紧,有明确安全理由。GitHub 给出的解释是:Git 依赖里的 .npmrc 可能改写 Git 可执行路径,即使用了 --ignore-scripts,仍可能形成代码执行风险。这个细节很要命。它说明“安装依赖”早就不是一个干净动作。

最先疼的是维护者和 CI

普通开发者会看到 warning。生产项目维护者会看到成本。

最相关的两类人,一类是 Node.js / npm 项目维护者,一类是管前端供应链和 CI/CD 的工程团队。他们要做的不是等 v12,而是现在用 npm 11.16.0+ 跑一次正常安装。

动作很具体:

对象现在该做什么不做的后果
项目维护者升级 npm,跑 npm install,看 warningv12 升级时才发现依赖脚本被拦
CI/CD 团队检查构建镜像、锁文件策略、内网包来源安装阶段失败,问题难定位
企业依赖治理团队npm approve-scripts / npm deny-scripts 生成 allowlist白名单靠口头约定,审计时说不清

迁移路径并不复杂,但需要有人负责。

先升级到 npm 11.16.0 或更高版本。跑一次正常安装。再用 npm approve-scripts --allow-scripts-pending 找出会跑脚本的包。

可信的包执行 npm approve-scripts。不可信或暂时不用的包执行 npm deny-scripts。生成的 allowlist 会写入 package.json,应该提交进仓库。

这里有一个现实约束:依赖树越深,人工判断越贵。工具给 warning 只是开始,真正费时间的是回答三个问题:这个脚本为什么需要跑?这个 Git URL 为什么可信?这个远程 tarball 为什么不能换成 registry 包?

如果团队最后只是一路 approve,把所有提示点成绿色,那 v12 只会制造新仪式。安全边界看起来更厚,实际还是橡皮图章。

便利开始付账

我更在意的不是破坏性更新本身,而是 npm 把责任边界改清楚了。

过去的默认逻辑是:生态为了顺滑,工具替你信任。脚本自动执行,原生包更容易装上;Git 依赖能直接拉,内部包和临时修复更省事;远程 tarball 能解析,绕过常规发布流程也更方便。

这些便利不是免费的。只是账单以前藏在安装流程里。

这次 v12 没有消灭复杂性。它只是把复杂性从 npm 的默认行为里拿出来,放回项目维护者桌面上。谁能执行代码,谁能拉远程源,谁能绕过 registry,都要留下痕迹。

这很像早期互联网平台从“随便接入”走向权限审核。阶段不完全一样,但权力结构相似:扩张期奖励低摩擦,治理期开始追问边界。旧账不会自己消失,只会换一种格式出现。

我不太买账“安全又拖慢开发体验”的抱怨。真正拖慢开发体验的,往往是过去没有记录信任关系。等事故发生,再回头问哪个依赖跑过脚本、哪个 Git URL 被拉过,那个成本更高。

但 npm 也不能把这事包装成纯胜利。显式许可会把治理成本推给维护者。尤其是企业内网包、原生构建包、历史 Git 依赖很多的项目,迁移不会轻。

接下来最该看的不是 v12 有没有按期发布,而是三件事:warning 是否足够可读,allowlist 是否便于审计,团队会不会把 approve 当成例行点确认。

分水岭不在 2026 年 7 月。分水岭在那张 allowlist 是安全清单,还是新的形式主义。

回到开头那句:npm install 以后会更不听话。对一个会替你执行陌生代码的工具来说,这反而是迟到的成熟。