大家好,我是农村程序员,独立开发者,行业观察员,前端之虎陈随易。
我会在这里分享你可能不曾注意到,或者终将被时间淹没的技术历史。
- 个人网站 1️⃣:https://chensuiyi.me
- 个人网站 2️⃣:https://me.yicode.tech
- 技术群,搞钱群,闲聊群,自驾群,想入群的在我个人网站联系我。
一键三连 (点赞
、评论
、转发
),可以给我提供曝光,带来一份早餐收入,谢谢大家~~
事件背景
2024年7月30日,Bun 项目的核心贡献者 Jarred Sumner 提交了一个名为 “Make bun install faster in China” (让 bun 在中国安装更快) 的 PR (#12936)。这个 PR 试图通过自动检测用户的系统语言,为中国用户默认使用 npmmirror.com 镜像源,以解决中国大陆用户访问 npm 官方源速度缓慢的问题。
PR 的主要内容
Jarred Sumner 在 PR 中实现了以下功能:
自动切换镜像源:当检测到系统语言为
CN
或cn
时,自动将默认 registry 切换为registry.npmmirror.com
预设环境变量:为生命周期脚本默认设置多个镜像相关的环境变量,包括:
npm_config_disturl="https://npmmirror.com/dist"
npm_config_sharp_binary_host="https://npmmirror.com/mirrors/sharp/"
npm_config_electron_mirror="https://npmmirror.com/mirrors/electron/v"
- 以及其他多个常用包的镜像配置
bun upgrade 支持:使
bun upgrade
命令也使用镜像源
社区反应
这个 PR 引发了激烈的讨论,最终收到了 11 个赞同和 191 个反对。主要的争议点包括:
反对意见
1。安全和信任问题
SukkaW (贡献者) 指出:
- npmmirror.com 虽然开源,但运营公司的 ICP 备案信息显示是 “杭州多项网络科技有限公司”,而非直接的阿里巴巴
- 无法确定 npmmirror.com 实际运行的代码是否与 GitHub 上公开的代码一致
- 提到了 polyfill.io 被中国公司收购后注入恶意代码的先例
NotEvenANeko 揭露了一个重要问题:
- npmmirror 有一个
BugVersionService
机制,会自动替换有 bug 版本的包 - 例如
fsevents@1.2.7
在 npmmirror 上实际是 1.2.11 版本的内容 - 这会导致与官方 registry 的完整性不一致
2。用户自主权
Losses 强调:
- 网络审查和包屏蔽问题
- 缺乏中立性
- 应该让用户自主选择,而不是强制决定
A7610605 指出:
- 基于系统语言判断地域是不准确的
- 许多使用 zh-CN 的用户并不在中国大陆
- 这种做法像是 “地理围栏”
3。技术实现问题
pan93412 (贡献者) 发现代码中有遗漏的地方,getLatestVersion
的某些调用没有使用镜像版本。
xhyrom (合作者) 明确表示:
- Bun 这样的软件应该避免加入地域特定的功能设置
- 这会带来破坏性变更,违反语义化版本控制
支持意见
1。实际需求
killagu (npmmirror 维护者之一) 表示:
- 不是每个人都有自己的镜像或代理
- 这对用户很有帮助
elrrrrrrr (npmmirror 维护者) 详细说明:
- npmmirror 已稳定运行 10 年
- 每天处理约 4500 万次下载请求
- 所有代码都是开源的
- 没有代理的情况下,在中国通过 bun 安装依赖几乎不可能
akirarika (中国的 Bun 框架作者) 分享经验:
- 他已经编写了脚本帮助中国用户从 npmmirror 下载 Bun
- 几乎每个中国开发者都需要经历类似步骤
- 建议让用户选择镜像源,而不是 Bun 替用户做决定
Jarred Sumner 的回应
在听取了社区反馈后,Jarred Sumner 在8月2日做出了详细回应:
承认误解:原本以为 npmmirror 是 registry.npmjs.org 的完全镜像,但了解到它会修改包内容后,决定不将其作为默认选项
提出新方案:
- 不推进当前 PR 的更改
- 创建本地化文档页面,建议使用的镜像
- 在安装脚本中检测用户是否在中国大陆,并推荐镜像列表
- 添加
--registry=<url>
CLI 参数 - 可能添加
--mirror=<url>
参数,不会将镜像地址写入 lockfile - 在网络超时时,使用启发式方法检测并提示使用镜像
事件总结
这次事件反映了开源项目在处理地域特定问题时面临的挑战:
- 技术 vs 政治:看似简单的技术优化可能涉及复杂的信任和政治问题
- 全球化 vs 本地化:如何在保持软件中立性的同时,解决特定地区的实际问题
- 便利性 vs 安全性:自动化配置虽然方便,但可能损害用户的知情权和选择权
- 社区沟通:重大决策需要充分的社区讨论和反馈
最终,这个 PR 被关闭,Jarred Sumner 选择了更加谨慎和尊重用户选择的方案。这个事件也成为了开源社区如何处理地域特定功能的一个重要案例。
启示
- 用户选择权至上:任何自动化决策都应该是可选的,而不是强制的
- 透明度的重要性:对于涉及第三方服务的功能,必须充分告知用户
- 文化敏感性:在全球化的开源项目中,需要考虑不同地区的文化和政治背景
- 技术中立性:基础设施类的开源项目应该保持技术中立,避免做出可能被解读为政治立场的决策
这个事件虽然以 PR 被关闭告终,但它引发的讨论对整个开源社区都有重要的参考价值。