
這幾年,JavaScript 執行環境的敘事一直很熱。
每隔幾個月,就會有文章告訴你 Bun 有多快,或者 Deno 又推出了什麼殺手級功能。它們主打的一體化工具鏈確實讓人眼饞:原生跑 TypeScript、內建環境變數載入、開箱即用的測試和建構。社群裡甚至出現了一種不用新執行環境就落後 的錯覺。
但在實際的商業專案中,現實往往很骨感。把一個沉澱了三年、掛滿各種 CI/CD 腳本、有著極其複雜的內網依賴的老專案,強行遷移到底層完全不同的新引擎上,往往意味著難以估量的生產風險。誰也不想為了開發時的幾秒鐘提速,去承擔線上 P0 故障的背鍋風險😖。
所以真正的問題從來不是:要不要幹掉 Node.js? 更現實的問題是:能不能繼續用穩如老狗的 Node.js,但把現代開發體驗補上來?
這正是知名型別庫 Zod 的作者 Colin McDonnell 最近開源的👉 Nub(https://github.com/nubjs/nub)想要回答的問題。

尤大大也跑來打廣告🤣🤣🤣

原生的 Node.js 存在著嚴重的基礎設施裸露問題。它就像一套毛胚房,執行環境本身非常穩固,但毫無裝修可言。為了湊齊現代化的開發體驗,我們在每個專案裡都在重複貼上同一套設定。

你要跑 TypeScript?那就裝個 tsx 或者 ts-node。 你要載入環境變數?那就引入 dotenv。 你要程式碼熱更新?那就全域裝一個 nodemon。 你要管理套件版本?還得弄個 corepack。
專案越久,這些小工具越容易變成一層層拖慢啟動速度的源頭。每次你按下 Enter,系統都在背景經過漫長的鏈路去解析這些包裝器。
Nub 的定位非常明確:它是一個用 Rust 編寫的高效能增強外殼,致力於做 Node.js 的 ++ 版本。
我們可以直觀對比一下過去和現在的開發體驗:
| 開發場景 | 傳統工具鏈 | 使用 Nub | 提速效果 |
|---|---|---|---|
| 執行 TypeScript | tsx 或 ts-node |
nub index.ts |
啟動快約 2.9 倍 |
| 載入環境變數 | dotenv 搭配啟動腳本 |
原生自動載入 .env |
零設定直連 |
| 熱更新監聽 | nodemon(基於正則) |
nub watch(基於真實依賴樹) |
精準重載,告別誤觸 |
| 執行專案腳本 | npm run dev |
nub run dev |
分發耗時縮短約 24 倍 |
| 執行暫時命令 | npx eslint |
nubx eslint |
冷啟動快約 19 倍 |

很多人看到上面 👆 幾十倍的提速數據,第一反應是:這又是一個魔改版的底層引擎嗎?
並不是。這就是 Nub 最容易被誤解的地方。它絕對不是一個 Node.js 的分支(Fork),也不會像 Bun 那樣去替換掉你系統底層的 JavaScript 引擎(V8 依然是絕對的核心)。
它的核心工作機制是高速調度與鉤子攔截。

傳統工具(如 tsx)慢,其實不是慢在編譯程式碼,而是慢在工具本身 Node.js 包裝器行程的冷啟動上。當你按下 nub app.ts 時,外層的 Rust 二進位程式會以十幾毫秒的速度完成版本校驗、解析環境變數和 tsconfig.json。隨後,它透過 Node.js 原生的底層擴充機制(module.registerHooks)將編譯器直接掛載進去。
更可怕的是,Nub 內建了基於 Rust 編寫的 oxc 極速編譯器。這意味著,你的 TypeScript 程式碼(甚至是古老的裝飾器語法)的轉譯工作是由極快的 Rust 承擔的,但最終執行核心業務邏輯的,依然是你伺服器上原裝的 Node.js 行程。
typescript 代碼解讀複製代碼// 業務程式碼完全不需要修改
import config from "./config.yaml"; // 極速解析並匯入 yaml/toml 等資料格式
import { User } from "./types"; // 無縫執行 TypeScript,不丟型別推斷
console.log('設定載入成功:', config);
作為一個在生產環境摸爬滾打的前端工程老兵,看一個工具絕不能只看 跑個 Hello World 有多快 🤷♂️。
Nub 真正讓我覺得驚豔的,是它在工程深水區做出的兜底設計。
這是我們在做複雜 CLI 工具時最容易踩坑的地方。當你用 tsx 執行入口檔案時,如果業務邏輯裡執行了 child_process.spawn('node', ['worker.ts']),由於子行程是一個全新的、純淨的 Node 行程,它通常會丟失外層 tsx 提供的編譯能力,直接丟出語法錯誤。

為了兜住這個場景,Nub 在執行時巧妙地在環境變數裡注入了一個 PATH 縫合層(Shim)。哪怕你的業務程式碼在極深的層級裡重新喚起了 node 甚至是 npm,它也會被底層的攔截器截獲,並自動路由回 Nub 的執行上下文中。這保證了整個行程樹的能力一致性,讓開發體驗不再斷層。
javascript 代碼解讀複製代碼import { spawn } from "child_process";
// 即使你在這裡呼叫原生的 node,它也會被 Nub 的 PATH shim 攔截
// 子行程依然享有 TypeScript 編譯和 .env 自動載入能力
const child = spawn("node", ["worker.ts"], { stdio: "inherit" });
每次執行 pnpm install 時,第三方依賴套件中的 postinstall 建構腳本就像一個黑盒,防不勝防。
Nub 甚至內建了一個套件管理功能(nub install)。它底層使用了極速的 aube 引擎,不僅安裝依賴比 pnpm 還要快上 2.5 倍,更重要的是它預設採取了全面阻擋的高安全策略。它預設禁止任何第三方依賴的自啟動建構腳本,把執行控制權徹底交還給開發者去逐一審核。
技術圈最怕的就是盲目造神。我們必須要清醒地認識到 Nub 的能力邊界🤔。
Nub 絕對不會讓你的業務介面突然快 10 倍。如果你的後端介面因為資料庫慢查詢卡了 2 秒,或者一個迴圈跑了 500 萬次,換上 Nub 後它依然會卡那麼久。
它優化的是工具鏈的調度開銷(冷啟動路徑),比如你按下 Enter 那一瞬間到腳本真正跑起來的時間差,或者你用 nubx eslint 分發任務時的反應速度。它解決的是開發者的體感,而不是業務邏輯的執行時卡頓。
Nub?技術選型從來不是追趕時髦,我們需要根據真實的業務現狀來做決策。

Node.js 的敘事也許不如從前了,但它離退休還早得很。只要像這種工具不斷為其續命,這套生態依然能再戰十年。
你們說呢?😁