# Mười một dòng JavaScript đã phá vỡ internet. Một lần hủy xuất bản.

Published: 2026-09-13

Ngày 22 tháng 3 năm 2016, 21:30 UTC: một nhà phát triển hủy xuất bản toàn bộ 273 gói npm của mình sau khi npm giao tên gói "kik" cho Kik, ứng dụng nhắn tin, mà đại diện bằng sáng chế của họ đã hứa hẹn "luật sư sẽ gõ cửa nhà bạn". Một trong 273 gói đó là left-pad: mười một dòng mã đặt khoảng trắng trước một chuỗi, được tải xuống 2,5 triệu lần mỗi tháng. Trong vòng vài phút, các bản dựng Babel, React và Node trên toàn thế giới thất bại, hàng trăm lần mỗi phút. Một bản fork xuất hiện trong mười phút và không thay đổi gì, vì Babel kéo left-pad thông qua line-numbers, vốn đã ghim chính xác phiên bản 0.0.3. Vào lúc 23:55, npm khôi phục phiên bản đã xóa từ bản sao lưu — lần "hủy-hủy-xuất bản" đầu tiên trong lịch sử registry — và một tuần sau đó ban hành quy tắc hủy xuất bản trong 24 giờ. Phân tích sau sự cố, từ chính tài khoản của npm và chuỗi email do Kik công bố: registry cho phép bất kỳ tác giả nào xóa bất kỳ phiên bản nào mà không kiểm tra các phần phụ thuộc, cây phụ thuộc được giải quyết trực tiếp trên mỗi lần cài đặt, không có lockfile theo mặc định. Git blame: 60 npm / 25 Kik / 15 thói quen phụ thuộc. Phán quyết về bản sửa lỗi: SHIP IT.

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

## Nội dung video này đề cập

- Ngày 11 tháng 3: Đại diện bằng sáng chế của Kik yêu cầu Azer Koçulu đổi tên \`kik\`; một giờ sau: luật sư "sẽ gõ cửa nhà bạn và khóa tài khoản của bạn"; Azer: 30.000 đô la; Kik gửi email hỗ trợ npm
- Ngày 18–20 tháng 3: CEO của npm chuyển tên cho Kik ("sẽ hợp lý khi mong đợi nó liên quan đến kik.com"); Azer yêu cầu xóa tất cả các module của mình
- Ngày 22 tháng 3, 21:30–23:55 UTC: 273 gói bị hủy xuất bản; left-pad@0.0.3 bị lỗi 404 trong các dự án Babel, Atom, Node; fork 1.0.0 lúc 21:42; CTO của npm tweet "un-un-publishing" lúc 23:03; 0.0.3 được khôi phục từ bản sao lưu lúc 23:55 — 2,5 giờ
- Ngày 23 và 29 tháng 3: Phân tích sau sự cố của npm ("chúng tôi đã bỏ lỡ") và chính sách mới: chỉ có thể hủy xuất bản trong vòng 24 giờ, trình giữ chỗ bảo mật cho các tên đã xóa (72 giờ kể từ năm 2020)

## Bản ghi đã dịch

Được dịch từ lời tường thuật tiếng Anh gốc. Âm thanh và phụ đề có sẵn được điều khiển bởi YouTube.

0:00 Một nhà phát triển xóa mười một dòng JavaScript, và trong vòng vài phút, Babel, các bản dựng React và Node đang gặp lỗi trên toàn thế giới, hàng trăm lỗi mỗi phút. Hàm đó là left-pad. Nó đệm một chuỗi bằng các khoảng trắng, và đến cuối buổi tối npm làm điều mà nó nói rằng không thể làm: tái xuất bản một phiên bản đã xóa. Nó xảy ra như thế nào, tại sao có thể, và ai phải chịu trách nhiệm. Đây là The Daily Diff, phân tích sau sự cố. Ngày 11 tháng 3. Một đại diện bằng sáng chế tại Kik, ứng dụng nhắn tin,

0:26 gửi email cho Azer Koçulu: đổi tên gói npm của bạn, kik là thương hiệu của chúng tôi. Azer nói không. Một giờ sau: luật sư thương hiệu của chúng tôi sẽ gõ cửa nhà bạn và khóa tài khoản của bạn. Azer đưa ra một mức giá, ba mươi nghìn đô la, và Kik chuyển tiếp cuộc trò chuyện đến bộ phận hỗ trợ của npm. Ngày 18 tháng 3. CEO của npm ra phán quyết rằng bất kỳ ai gõ npm install kik đều mong đợi ứng dụng nhắn tin đó,

0:48 và giao tên đó. Azer yêu cầu xóa tất cả các gói của mình. Hai ngày sau, anh ấy tự mình làm điều đó: hai trăm bảy mươi ba gói. Ngày 22 tháng 3, 21:30 UTC. Mỗi bản dựng yêu cầu left-pad đều nhận được lỗi 404. Mười phút sau, một người lạ tái xuất bản nó dưới dạng 1.0.0, và không có gì thay đổi, vì Babel và Atom tải nó thông qua một gói gọi là line-numbers, vốn chỉ muốn chính xác 0.0.3.

1:13 Vào lúc 23:03, CTO của npm tweet: un-un-publishing (hủy-hủy-xuất bản). Vào lúc 23:55, 0.0.3 đã trở lại từ bản sao lưu. Hai tiếng rưỡi. Tại sao một người có thể làm điều này? Ba lý do. Bất kỳ phiên bản nào trên npm đều có thể bị tác giả xóa, ngay lập tức, mà không kiểm tra xem ai phụ thuộc vào nó. Thứ hai, các phụ thuộc là bắc cầu: Babel không biết left-pad tồn tại, nó biết line-numbers, và toàn bộ cây được giải quyết trực tiếp trên mỗi lần cài đặt.

1:36 Thứ ba, vào năm 2016, không có gì ghim cây đó theo mặc định; lockfile là tùy chọn, vì vậy mỗi lần chạy CI đều hỏi lại internet xem mười một dòng mã trông như thế nào. Một registry, do không ai phụ thuộc vào nó vận hành. Git blame. npm, sáu mươi phần trăm: phân tích sau sự cố của chính họ nói rằng việc hủy xuất bản không hạn chế đã gây ra sự cố, và, trích lời, chúng tôi đã bỏ lỡ. Kik, hai mươi lăm: một đại diện bằng sáng chế, không phải luật sư, hứa hẹn luật sư sẽ gõ cửa vì một cái tên mà Kik đã quyết định không sử dụng. Thói quen phụ thuộc, mười lăm: tất cả những người đã npm-install mười một dòng thay vì

2:06 gõ chúng. Bao gồm cả Kik, mà các bản dựng của họ cũng bị lỗi. Phạm vi ảnh hưởng: hai trăm bảy mươi ba gói đã bị gỡ bỏ, một trong số đó được tải xuống hai triệu rưỡi lần mỗi tháng. Bản sửa lỗi mất hai tiếng rưỡi; hàm đó chỉ có mười một dòng. Trên Hacker News, một bài đăng hỏi liệu chúng ta đã quên cách lập trình chưa, đạt mười bảy trăm điểm, chủ yếu từ những người có bản dựng vẫn bị lỗi. Phán quyết, phân tích sau sự cố: SHIP IT.

2:26 npm khôi phục từ bản sao lưu, đăng báo cáo sau sự cố vào ngày hôm sau, và trong vòng một tuần ban hành quy tắc vẫn còn hiệu lực: bạn có thể hủy xuất bản trong hai mươi bốn giờ, sau đó bạn phải nói chuyện với một người. Thứ Hai: cam kết lockfile của bạn, và nếu một hàm có mười một dòng, nó là một đoạn văn, không phải là một phụ thuộc. Hãy gửi cho tôi sự cố mà bạn vẫn chưa được phép nói về, trong phần bình luận, hoặc tại the daily diff dot dev. Và đó là The Daily Diff của ngày hôm nay.

2:48 Tôi là Niko từ Axrisi. Hợp nhất một cách có trách nhiệm.

## Nguồn

- [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
