就在刚刚,npm 被发现存在重大缺陷!

发布一些特殊的 npm 包时,一般会在 package.json 里用 libc 字段标记二进制包到底依赖 glibc 还是 musl!
"libc": ["glibc", "musl"]
通常请求下,一个操作系统只能支持其中一种,你可以使用下面的命令查看自己的操作系统支持的版本:
node -p "process.env.LIBC || (process.config.variables.node_shared_libc || 'glibc')"

但是现在被发现 npm 默认响应(Accept: application/json),根本不识别这个字段!
包括 npm 在内的包管理器存在两种极端操作:
libc,一股脑儿把两个版本都下下来即使操作系统只需要其中一个application/json) → 响应体可能从 2KB 暴涨到 200KB+,解析变慢了很多倍拿 esbuild 举例,glibc 版本 1.8 MB,musl 版本 1.9 MB,如果 npm registry 加上 libc 字段,能省 1.9 MB 流量。
目前社区给的提案是使用新的请求头 Accept,如下:
GET /esbuild
Accept: application/vnd.npm.install-v1+json
返回精简响应,只包含安装必需字段:
{
"name": "esbuild",
"version": "x.x.x",
"dist-tags": { "latest": "x.x.x" },
"versions": {
"0.33.0": {
"dist": {
"tarball": "https://...",
"libc": ["glibc", "musl"] // 关键字段!
}
}
}
}
期待 npm 尽快响应!
这可能是 2025 年最值得 star 的 npm 优化提案!
今天的分享就这些了,感谢阅读,有错欢迎指正!