你按下的那個 build,心臟已經換成 Rust 了:npm 生態的一場無聲換心手術
2026年9月npm生態核心工具鏈大面積被Rust重寫,pnpm 12、Vite 8、Oxlint全面換心,本文回顧這場前端圈的靜默革命與社羣討論樣貌。
這件事沒有發表會,沒有倒數,也沒有一張所有人都轉發的圖。2026 年 9 月,有開發者在掘金上把前後端的工具清單並排一列,才發現一件事:pnpm 12 用 Rust 重寫了,Vite 8 的打包引擎換成 Rolldown,Rolldown 底層是 Oxc,Oxc 是純 Rust。連 linter 和 formatter 都是 Biome 與 Oxfmt,同樣是 Rust。
換句話說,許多開發者每天敲的 npm run build、npm run lint、npm run format,每一條指令背後的核心邏輯,大概率已經和 JavaScript 沒有直接關係。整個 npm 生態的心臟,在大多數人沒注意到的情況下,被換過了一輪。
先回到 2020 年那種「等它想清楚」的日子
要把這場換心手術看懂,得先把記憶拉回幾年前的前端日常。
2020 年前後,一個十萬行等級的 monorepo 是什麼體感?原文名場景給了具體數字:Webpack 熱更新等 8 秒,ESLint 全量檢查 12 秒,代碼壓縮再 8 秒。改一行代碼,等工具「想清楚」的時間,比寫代碼還長。
這不是工具寫得爛,是 Node.js 的先天限制。解析語法樹、型別檢查、代碼轉換,這些都是 CPU 密集任務,而 Node.js 上的 JavaScript 基本上只能喫到一個核。大型專案的全量構建超過五分鐘,在當年是常態而非例外。
開發者當然抱怨過,但抱怨歸抱怨,工具照用。誰也沒想到,解法不是把 JavaScript 寫得更快,而是換一個語言。
從 45 秒到 3.2 秒:實測數據長什麼樣
原文提供了一組中型 React 專案的對照,約五萬行代碼、三百多個組件。這些數字來自開發者在 GitHub Issues 與技術部落格上反覆驗證的實測,可以當作一個量級參考。
全量構建,Webpack 5 要 45 秒,Rspack 是 3.2 秒,差了十四倍。熱更新從 2.8 秒壓到 50 毫秒。全量檢查從 ESLint 的 12 秒到 Oxlint 的 0.3 秒。代碼壓縮從 Terser 的 8 秒到 SWC 的 0.4 秒。差距最誇張的是 TypeScript 解析,tsc 要 15 秒,oxc-parser 只要 0.15 秒,一百倍。
對坐在電腦前的人來說,這些數字翻譯成一句話就是:你改完代碼按儲存,畫面幾乎是立刻回應的。那種「按下去然後滑手機等一下」的肌肉記憶,正在被悄悄取消。
換心換到了哪一步:一張覆蓋清單
把 2026 年 9 月的 Rust 覆蓋情況列開,會發現幾乎沒有漏網之魚。
代碼解析有 SWC 與 Oxc parser。轉譯有 SWC 與 Rolldown。檢查有 Oxlint,壓縮有 SWC Minifier。打包有 Rspack 和 Rolldown,後者已經是 Vite 8 的預設引擎。格式化是 Oxfmt,CSS 處理有 Lightning CSS 和 Tailwind v4 的 Oxide 引擎。往上一層,套件管理有 pnpm 12,執行環境則有 Bun 2.x 這種把執行時、打包、套件管理全包的選手。
這也是為什麼有人用「生態的心臟被換了」來形容。上層介面沒變,你打的還是 npm 指令,讀的還是 JavaScript,但引擎室裡的機器已經整批更新。這種「介面不動、底層全換」的改法,對一般使用者來說幾乎無感,無感也正是它能一夜完成的原因。
三個名字,撐起整場手術
如果要挑代表人物,Rolldown 和 Oxc 繞不開。
Rolldown 是用 Rust 重寫的 Rollup,目標很實際:讓所有 Rollup 插件一行不改就能跑,同時把性能拉高一到三個數量級。它現在是 Vite 8 的預設引擎,而且內建了 minify、JSX 和 WASM 支援,以前要裝一堆插件才能拼起來的功能,現在開箱即用。實際專案的回饋也具體:Linear 的生產構建從 46 秒降到 6 秒,Ramp 構建時間下降 57%,Beehiiv 優化幅度 64%。
Oxc 則不是單一工具,是一整個工具箱,parser、linter、transformer、formatter 全用 Rust 寫。它快的理由也不神祕:傳統 ESLint 用 V8 解析 JavaScript,而 Rust 沒有 GC 停頓,記憶體布局是確定的,同樣的解析任務就是能快上一到兩個數量級。Oxlint 還做了 ESLint 相容層,大部分 .eslintrc 規則可以直接搬過來。Shopify、Airbnb、Mercedes-Benz 都已經在 CI 裡把 Oxlint 當第一道門禁。8 月 18 日,Oxc 團隊宣布正式支援 React Compiler,又一塊拼圖歸位。
這種「用 Rust 重寫既有協定與工具」的路數,其實近兩年在各種開發者社羣都看得到。像先前介紹過的WinAirCast 用 Rust 拆 AirPlay 那道牆,走的也是同一條路:語言換掉,痛點才被真正處理。
社羣為什麼安靜,又為什麼突然討論起來
有趣的是這場革命的傳播方式。
它從來沒有「開始」的那一刻。Rspack 上線的時候,一部分人換了;SWC 成熟之後,又一批人換了;Vite 8 把 Rolldown 設為預設,等於替最後一批觀望者做了決定。每一步都夠小,小到不值得上熱搜,加起來卻是整個生態的位移。
等到有人把清單並排出來,那種「原來已經全換了」的後知後覺,才讓文章開始被轉。技術社羣的討論也分幾路:一路在算自己專案還能省多少秒,一路在問 JavaScript 工具作者的出路,還有一路比較冷靜地提醒,這些數據來自中型專案的實測,你的專案能不能喫到同樣的加速,還是得自己跑一遍。
至於「JavaScript 是不是要完了」這種標題黨式焦慮,多數討論其實不太買單。寫業務的還是在寫 JavaScript,瀏覽器裡跑的還是 JavaScript。被換掉的是那些需要榨乾 CPU 的底層環節,而這些環節本來就不該用一個單執行緒的 runtime 來扛。
換完之後,等待本身成了被淘汰的東西
回頭看,這場換心手術最耐人尋味的地方,是它推翻了一個大家默默接受的預設:等工具跑完,是開發者生活的一部分。
等 8 秒熱更新、等 12 秒 lint、等 5 分鐘構建,這些等待曾經被寫進段子、寫進工具選型考量,甚至寫進「順便休息一下」的工作節奏。2026 年 9 月的這批工具把它們批量刪除之後,剩下的問題反而是人的:當每一個指令都秒回,你拿那些原本用來滑手機的空檔做什麼?
工具鏈的問題,工具鏈自己解決了。至於開發者要不要學 Rust、要不要讀 Oxc 的原始碼,那是另一場還沒有標準答案的討論。可以確定的是,下次你按下去那個 build 按鈕,畫面很快跳回來的時候,引擎室裡跑的,大概率已經不是你以為的那個語言了。
主題