十一行JavaScript搞垮了整個互聯網。一次取消發佈。
2016年3月22日,世界標準時間21:30:一名開發人員取消發佈了他所有273個npm套件,此前npm將套件名稱「kik」交給了即時通訊應用程式Kik,Kik的專利代理人曾威脅說「律師會找上門來」。
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。
本影片涵蓋的內容
- 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個套件被取消發佈;[email protected]在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)blog.npmjs.org
- npm, Inc., "changes to npm's unpublish policy" (Mar 29, 2016)blog.npmjs.org
- Azer Koçulu, "I've Just Liberated My Modules" (Mar 22, 2016; archive copy)web.archive.org
- Mike Roberts (Kik), "A discussion about the breaking of the Internet" — the full e-mail thread (Mar 23, 2016; archive copy)web.archive.org
- Laurie Voss (npm CTO) on X, Mar 22, 2016, 23:03 UTCx.com
- left-pad 0.0.3 on the npm registry (the eleven lines)registry.npmjs.org
- Hacker News, Mar 22, 2016 — "I've Just Liberated My Modules" (1,573 points)news.ycombinator.com
- Hacker News, Mar 23, 2016 — "NPM and Left-Pad: Have We Forgotten How to Program?" (1,725 points)news.ycombinator.com
- Hacker News, Mar 29, 2016 — "Changes to Npm's unpublish policy" (320 points)news.ycombinator.com
- The Register, Mar 23, 2016 — "How one developer just broke Node, Babel and thousands of projects in 11 lines of JavaScript"www.theregister.com



