如果你是前端开发者。
每天大概率都会执行这样一条命令:npm install
看起来平平无奇。甚至已经成为肌肉记忆。
但很多人可能从来没意识到:当你敲下这条命令时。你的电脑其实正在执行陌生人写的代码。而且默认允许。
过去很多年,npm 一直有一个被业内吐槽的问题:install 竟然会自动执行脚本
例如:
json
{
"scripts": {
"preinstall": "...",
"install": "...",
"postinstall": "..."
}
}
只要依赖包里存在这些脚本。
执行:
bash
npm install
npm 就会自动运行它们。
很多开发者第一次知道这件事时都会愣住。
等等...... 我只是安装一个包。为什么它能执行代码?
这可能是 npm 历史上最大的安全漏洞之一
过去几年。供应链攻击越来越疯狂。
攻击者最喜欢的方式之一就是:把恶意代码藏进安装脚本。
当开发者执行:npm install
恶意代码自动运行。读取环境变量。窃取 Token。上传 SSH Key。甚至直接感染 CI/CD。
很多安全研究人员一直在吐槽:npm 最大的问题不是下载了什么。而是安装时执行了什么。
而现在
npm 终于决定动刀了
根据 GitHub 发布的公告。

预计将在 2026 年 7 月发布的:npm v12
将彻底改变 npm install 的默认行为。

一句话概括:
text
以前:
默认信任
未来:
默认拒绝
install 脚本默认禁止
这是本次最重磅的变化。
未来 npm v12 中:
text
preinstall
install
postinstall
默认不会执行。
除非你主动批准。
否则:
bash
npm install
只负责安装。不负责执行。
很多人看到这里可能会说:这不是很正常吗?
实际上。这在 npm 历史上是一次革命级变化。
因为过去十几年。自动执行安装脚本一直是默认行为。
现在终于变成:
text
执行脚本
↓
需要显式授权
新增 approve-scripts 机制
为了兼顾安全和兼容性。
npm 推出了新的工作流:
bash
npm approve-scripts
先查看有哪些包试图执行脚本。
然后选择:允许 或者:拒绝
最后把结果写入项目配置。
简单理解:
以前:
text
任何依赖
↓
都能执行代码
现在:
text
经过批准的依赖
↓
才能执行代码
影响最大的不是脚本,而是 Native 模块,很多开发者看到这里还没意识到问题有多大。
因为 npm 官方特别提到:
text
node-gyp
也会被拦截。什么意思?很多原生模块:
- sqlite
- sharp
- canvas
- node-rs 系项目
安装时都需要编译。
而编译过程通常依赖:
text
install
postinstall
node-gyp rebuild
未来如果没有授权。直接失败。
Git 依赖也要凉了
除了脚本。npm v12 还做了一件大事。
未来默认禁止:
json
{
"dependency": "github:user/repo"
}
或者:
json
{
"dependency": "git+https://..."
}
这样的 Git 依赖。如果需要。必须显式开启:
bash
--allow-git
远程 URL 依赖同样被封
例如:
json
{
"dependency": "https://xxx.com/pkg.tgz"
}
未来也会被拦截。
需要:
bash
--allow-remote
才能安装。
为什么 npm 突然这么激进?
因为过去一年。npm 生态几乎成了供应链攻击重灾区。各种恶意包层出不穷。很多攻击甚至不需要用户运行代码。
只要:
bash
npm install
就已经中招。 这也是 GitHub 这次下定决心修改默认行为的原因。
这其实是在向 pnpm 和 Bun 学习
有意思的是。社区对此反应并不意外。因为很多开发者发现:其它现代工具早就在强化供应链安全。
Reddit 上不少开发者甚至表示:npm 终于补上了这块短板。 换句话说。npm 不是在创新。而是在补课。
现在就该开始准备
好消息是:不用等 npm v12。
官方已经提前给出了过渡方案。
升级到:
bash
npm install -g npm@latest
确保版本:
text
11.16.0+
之后正常执行:
bash
npm install
npm 会提示:
哪些包未来会被拦截。
然后执行:
bash
npm approve-scripts --allow-scripts-pending
即可提前检查风险。
为什么这件事值得所有前端开发者关注?
因为它改变的不只是 npm。而是整个 JavaScript 生态的安全模型。
过去:
text
npm install = 下载代码 + 执行代码
未来:
text
npm install = 下载代码
执行代码 = 需要授权
这是完全不同的思维模式。 某种程度上。
npm 正在从:默认信任 走向:Zero Trust(零信任)
最后
过去十五年。无数开发者习惯了:
bash
npm install
然后什么都不想。但现实证明。这种便利背后隐藏着巨大的风险。
npm v12 的改变一定会带来兼容性问题。很多项目会踩坑。很多 CI 会报错。很多依赖需要调整。
但从长期来看。这可能是 npm 历史上最重要的一次安全升级。
因为从这一刻开始。JavaScript 世界终于不再默认相信每一个陌生依赖了。
你的项目里有多少包的安装脚本在默默运行?你认真看过吗?
转发这篇文章,提醒你的前端同事。
各位互联网搭子,要是这篇文章成功引起了你的注意,别犹豫,关注、点赞、评论、分享走一波,让我们把这份默契延续下去,一起在前端的海洋里乘风破浪!