+− THE DAILY DIFFdev & AI news
SHIP IT

十一行 JavaScript 代码搞垮了互联网。一次取消发布。

2016年3月22日,世界协调时21:30:一位开发者在npm将包名“kik”交给即时通讯应用Kik后,取消发布了他所有的273个npm包,Kik的专利代理人曾威胁要“让律师上门找你”。

2016年3月22日,世界协调时21:30:一位开发者在npm将包名“kik”交给即时通讯应用Kik后,取消发布了他所有的273个npm包,Kik的专利代理人曾威胁要“让律师上门找你”。这273个包中有一个是left-pad:十一行代码,用于在字符串前面添加空格,每月下载量达250万次。几分钟之内,Babel、React和Node的构建在全球范围内失败,每分钟数百次。十分钟内出现了一个分支,但没有改变任何东西,因为Babel通过行号拉取left-pad,这精确地固定了0.0.3版本。23:55,npm从备份中恢复了被删除的版本——这是注册表历史上首次“撤销取消发布”——一周后发布了24小时取消发布规则。事后分析,根据npm自己的说法和Kik发布的电子邮件线程:注册表允许任何作者删除任何版本,而不进行依赖项检查;瞬态树在每次安装时实时解析;默认情况下没有lockfile。Git blame:60% npm / 25% Kik / 15% 依赖习惯。修复的裁决:SHIP IT。

阅读书面版(英文) ↗

本视频涵盖的内容

  • 3月11日:Kik的专利代理人要求Azer Koçulu重命名`kik`;一小时后:律师“将上门找你并冻结你的账户”;Azer:30,000美元;Kik向npm支持部门发送电子邮件
  • 3月18-20日:npm的CEO将名称转让给Kik(“会合理地认为它与kik.com相关”);Azer要求删除他所有的模块
  • 3月22日,世界协调时21:30-23:55:273个包被取消发布;Babel、Atom、Node项目中[email protected]出现404错误;21:42出现fork 1.0.0;npm的CTO于23:03发推文称“撤销取消发布”;0.0.3于23:55从备份恢复——共2.5小时
  • 3月23日和3月29日:npm的事后分析(“我们犯了错误”)和新政策:只能在24小时内取消发布,已删除名称的安全占位符(2020年起为72小时)

翻译的文字记录

译自英文原版旁白。可用音频和字幕由 YouTube 控制。

0:00 一位开发者删除了十一行 JavaScript 代码,几分钟之内,Babel、 React 和 Node 的构建在全球范围内失败,每分钟数百次。 这个函数就是 left-pad。 它用空格填充字符串,到了晚上 npm 做了它说不能做的一件事: 重新发布一个已删除的版本。 它是如何发生的,为什么可能发生,以及谁该承担责任。 这是 The Daily Diff,事后分析。 3月11日。即时通讯应用 Kik 的一位专利代理人,

0:26 给 Azer Koçulu 发送邮件:请重命名您的 npm 包,kik 是我们的品牌。 Azer 说不。 一小时后:我们的商标律师将上门找你, 并冻结你的账户。 Azer 开了一个价格,三万美元, Kik 将邮件转发给 npm 支持部门。3月18日。 npm 的 CEO 裁定,任何输入 npm install kik 的人都会期望安装这个即时通讯

0:48 应用,并将这个名字交了出去。 Azer 要求删除他所有的东西。 两天后他自己动手了:两百七十三个包。 3月22日,世界协调时 21:30。 每个需要 left-pad 的构建都得到了 404 错误。 十分钟后,一个陌生人将其重新发布为 1.0.0, 但什么也没改变,因为 Babel 和 Atom 通过一个名为 line-numbers 的包加载它,该包精确地需要 0.0.3 版本。

1:13 23:03,npm 的 CTO 发推文:un-un-publishing(撤销取消发布)。 23:55,0.0.3 版本从备份中恢复了。 两个半小时。 为什么一个人能做到这一点? 三个原因。npm 上的任何版本都可以被其作者立即删除, 而无需检查谁依赖它。 其次,依赖是传递性的:Babel 不知道 left-pad 存在, 它知道 line-numbers,并且整个依赖树在每次安装时都是实时解析的。

1:36 第三,在 2016 年,默认情况下没有任何东西会锁定这个依赖树;lockfile 是选择加入的, 因此每次 CI 运行时都会重新询问互联网这十一行代码是什么样子。 一个注册表,由无人依赖它的人运行。 git blame。npm,百分之六十:它自己的事后分析说,不受限制的取消发布 导致了痛苦,并且,引用原文,我们犯了错误。 Kik,百分之二十五:一个专利代理人,而不是律师, 就一个 Kik 已经决定不使用的名字威胁要让律师上门。 依赖习惯,百分之十五:每个 npm 安装了十一行代码而不是

2:06 自己输入的人。 包括 Kik,他们的构建也中断了。 影响范围:两百七十三个包被删除, 其中一个每月下载量达到两百五十万次。 修复用了两个半小时;这个函数只有十一行代码。 在 Hacker News 上,一篇询问我们是否忘记了如何编程的帖子获得了 一千七百个赞,大部分来自那些构建仍然是红色的人。 裁决,事后分析:SHIP IT。

2:26 npm 从备份中恢复,第二天发布了事后分析报告, 并在一周内发布了至今仍然有效的规则:你可以在 二十四小时内取消发布,之后你需要与人工客服沟通。 周一:提交你的 lockfile,如果一个函数只有十一行, 它应该是一个段落,而不是一个依赖项。 在评论中,或者发送到 the daily diff dot dev,把你仍然不被允许谈论的事件发给我。 在评论中,或者发送到 the daily diff dot dev。 这就是今天的 The Daily Diff。

2:48 我是 Axrisi 的 Niko。 负责任地合并。

来源

  1. npm, Inc., "kik, left-pad, and npm" (Mar 23, 2016)blog.npmjs.org
  2. npm, Inc., "changes to npm's unpublish policy" (Mar 29, 2016)blog.npmjs.org
  3. Azer Koçulu, "I've Just Liberated My Modules" (Mar 22, 2016; archive copy)web.archive.org
  4. Mike Roberts (Kik), "A discussion about the breaking of the Internet" — the full e-mail thread (Mar 23, 2016; archive copy)web.archive.org
  5. Laurie Voss (npm CTO) on X, Mar 22, 2016, 23:03 UTCx.com
  6. left-pad 0.0.3 on the npm registry (the eleven lines)registry.npmjs.org
  7. Hacker News, Mar 22, 2016 — "I've Just Liberated My Modules" (1,573 points)news.ycombinator.com
  8. Hacker News, Mar 23, 2016 — "NPM and Left-Pad: Have We Forgotten How to Program?" (1,725 points)news.ycombinator.com
  9. Hacker News, Mar 29, 2016 — "Changes to Npm's unpublish policy" (320 points)news.ycombinator.com
  10. The Register, Mar 23, 2016 — "How one developer just broke Node, Babel and thousands of projects in 11 lines of JavaScript"www.theregister.com

相关视频

postmortem · zh-CN · 2026年9月22日

一次重启让Telstra回到了2006年。九百万部手机受到影响。

墨尔本的一名工程师在凌晨2:50重新启动了一个时序机箱,到早餐时间,澳大利亚最大的移动网络竟然认为现在是2006年11月。2026年7月8日:Telstra的NTP机箱中的一张GPS卡在电源维修期间重启,其固件从未进行过GPS周翻转更新,因此它选择了旧的纪元,回到了1024周之前。由于2025年10月的一个权宜之计,这张卡成为了网络中唯一的层级1(stratum-1)时间源——并且2020年切换到

3:15 ↗