# 十一行JavaScript搞垮了整個互聯網。一次取消發佈。

Published: 2026-09-13

2016年3月22日，世界標準時間21:30：一名開發人員取消發佈了他所有273個npm套件，此前npm將套件名稱「kik」交給了即時通訊應用程式Kik，Kik的專利代理人曾威脅說「律師會找上門來」。這273個套件之一是left-pad：十一行程式碼，用於在字串前加上空格，每月下載量達250萬次。幾分鐘內，全球範圍內的Babel、React和Node構建失敗，每分鐘數百次。一個分支在十分鐘內出現並未做任何更改，因為Babel通過行號引入left-pad，精確地鎖定0.0.3版本。在23:55，npm從備份中恢復了已刪除的版本——這是註冊表歷史上首次「取消取消發佈」——一週後推出了24小時取消發佈規則。事後分析，來自npm自己的說明和Kik發佈的電子郵件線程：該註冊表允許任何作者刪除任何版本，而無需檢查其依賴項，傳遞樹在每次安裝時實時解析，預設情況下沒有鎖定文件。Git blame：60% npm / 25% Kik / 15% 依賴習慣。修復的裁決：SHIP IT。

Canonical: https://thedailydiff.dev/zh-HK/video/2026-09-13-left-pad/

## 本影片涵蓋的內容

- 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個套件被取消發佈；left-pad@0.0.3在Babel、Atom、Node專案中出現404錯誤；1.0.0版本的分支在21:42出現；npm的CTO在23:03發推文「un-un-publishing」；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年，預設情況下沒有任何東西鎖定該樹；鎖定文件是可選的， 所以每次CI運行都會重新詢問互聯網十一行程式碼長什麼樣子。 一個註冊表，卻沒有人依賴它來運行。 git blame。npm，百分之六十：它自己的事後分析稱不受限制的取消發布 造成了痛苦，引述說，我們失職了。 Kik，百分之二十五：一個專利代理人，而非律師， 威脅律師會上門，針對Kik已決定不使用的名稱。 依賴習慣，百分之十五：所有那些npm安裝了十一行程式碼而非自己輸入的人。

2:06 包括Kik，他們的構建也失敗了。 影響範圍：兩百七十三個套件被拉下， 其中一個每月下載量達兩百五十萬次。 修復用了兩個半小時；這個函式只有十一行程式碼。 在Hacker News上，一篇質疑我們是否忘記了如何編程的貼文 獲得了一千七百點讚，大部分來自那些構建仍然失敗的人。 裁決，事後分析：SHIP IT。 npm從備份中恢復，第二天發布事後分析報告，

2:26 並在一週內推出了至今仍然有效的規則：你可以在二十四小時內取消發布， 之後你需要與真人溝通。 星期一：提交你的鎖定文件，如果一個函式只有十一行， 那它就是一個段落，而不是一個依賴。 在評論中或發送到thedailydiff.dev， 告訴我你仍然不被允許談論的事件。 這就是今天的diff。 我是Axrisi的Niko。

2:48 負責任地合併。 負責地合併。

## 來源

- [npm, Inc., "kik, left-pad, and npm" (Mar 23, 2016)](https://blog.npmjs.org/post/141577284765/kik-left-pad-and-npm) — blog.npmjs.org
- [npm, Inc., "changes to npm's unpublish policy" (Mar 29, 2016)](https://blog.npmjs.org/post/141905368000/changes-to-npms-unpublish-policy) — blog.npmjs.org
- [Azer Koçulu, "I've Just Liberated My Modules" (Mar 22, 2016; archive copy)](https://web.archive.org/web/20160323201305/https://medium.com/@azerbike/i-ve-just-liberated-my-modules-9045c06be67c) — web.archive.org
- [Mike Roberts (Kik), "A discussion about the breaking of the Internet" — the full e-mail thread (Mar 23, 2016; archive copy)](https://web.archive.org/web/20170112194445/https://medium.com/@mproberts/a-discussion-about-the-breaking-of-the-internet-3d4d2a83aa4d) — web.archive.org
- [Laurie Voss (npm CTO) on X, Mar 22, 2016, 23:03 UTC](https://x.com/seldo/status/712414400808755200) — x.com
- [left-pad 0.0.3 on the npm registry (the eleven lines)](https://registry.npmjs.org/left-pad/0.0.3) — registry.npmjs.org
- [Hacker News, Mar 22, 2016 — "I've Just Liberated My Modules" (1,573 points)](https://news.ycombinator.com/item?id=11340510) — news.ycombinator.com
- [Hacker News, Mar 23, 2016 — "NPM and Left-Pad: Have We Forgotten How to Program?" (1,725 points)](https://news.ycombinator.com/item?id=11348798) — news.ycombinator.com
- [Hacker News, Mar 29, 2016 — "Changes to Npm's unpublish policy" (320 points)](https://news.ycombinator.com/item?id=11382885) — news.ycombinator.com
- [The Register, Mar 23, 2016 — "How one developer just broke Node, Babel and thousands of projects in 11 lines of JavaScript"](https://www.theregister.com/2016/03/23/npm_left_pad_chaos/) — www.theregister.com
