Skip to content

大家好,我是农村程序员,独立开发者,行业观察员,前端之虎陈随易。

我会在这里分享你可能不曾注意到,或者终将被时间淹没的技术历史。

一键三连 (点赞评论转发),可以给我提供曝光,带来一份早餐收入,谢谢大家~~


事件背景

2024年7月30日,Bun 项目的核心贡献者 Jarred Sumner 提交了一个名为 “Make bun install faster in China” (让 bun 在中国安装更快) 的 PR (#12936)。这个 PR 试图通过自动检测用户的系统语言,为中国用户默认使用 npmmirror.com 镜像源,以解决中国大陆用户访问 npm 官方源速度缓慢的问题。

PR 的主要内容

Jarred Sumner 在 PR 中实现了以下功能:

  1. 自动切换镜像源:当检测到系统语言为 CNcn 时,自动将默认 registry 切换为 registry.npmmirror.com

  2. 预设环境变量:为生命周期脚本默认设置多个镜像相关的环境变量,包括:

    • 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"
    • 以及其他多个常用包的镜像配置
  3. 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日做出了详细回应:

  1. 承认误解:原本以为 npmmirror 是 registry.npmjs.org 的完全镜像,但了解到它会修改包内容后,决定不将其作为默认选项

  2. 提出新方案

    • 不推进当前 PR 的更改
    • 创建本地化文档页面,建议使用的镜像
    • 在安装脚本中检测用户是否在中国大陆,并推荐镜像列表
    • 添加 --registry=<url> CLI 参数
    • 可能添加 --mirror=<url> 参数,不会将镜像地址写入 lockfile
    • 在网络超时时,使用启发式方法检测并提示使用镜像

事件总结

这次事件反映了开源项目在处理地域特定问题时面临的挑战:

  1. 技术 vs 政治:看似简单的技术优化可能涉及复杂的信任和政治问题
  2. 全球化 vs 本地化:如何在保持软件中立性的同时,解决特定地区的实际问题
  3. 便利性 vs 安全性:自动化配置虽然方便,但可能损害用户的知情权和选择权
  4. 社区沟通:重大决策需要充分的社区讨论和反馈

最终,这个 PR 被关闭,Jarred Sumner 选择了更加谨慎和尊重用户选择的方案。这个事件也成为了开源社区如何处理地域特定功能的一个重要案例。

启示

  1. 用户选择权至上:任何自动化决策都应该是可选的,而不是强制的
  2. 透明度的重要性:对于涉及第三方服务的功能,必须充分告知用户
  3. 文化敏感性:在全球化的开源项目中,需要考虑不同地区的文化和政治背景
  4. 技术中立性:基础设施类的开源项目应该保持技术中立,避免做出可能被解读为政治立场的决策

这个事件虽然以 PR 被关闭告终,但它引发的讨论对整个开源社区都有重要的参考价值。

何以解忧,唯有代码。不忘初心,方得始终。