Node.js 官方發(fā)布新工具,助力穩(wěn)定 TypeScript 支持!
在現(xiàn)代前端工程體系中,TypeScript 已成為開發(fā)者提高代碼可維護性、可讀性和團隊協(xié)作效率的重要利器。然而,長期以來,Node.js 對 TypeScript 的支持卻遠遠跟不上,這種不對稱的現(xiàn)狀給廣大開發(fā)者帶來了諸多痛點。
6 月 10 日,Node.js 官方發(fā)布了 Amaro 1.0,這是 Node.js 官方的 TypeScript “類型剝除加載器”,可以讓開發(fā)者直接在 Node.js 中運行 .ts 文件,不需要先轉(zhuǎn)成 .js。
Node.js 對 TS 的支持問題
雖然 TypeScript 的使用越來越普遍,很多大項目已經(jīng)默認使用,但在 Node.js 中直接運行 .ts 文件一直不容易:
- 缺乏原生支持:開發(fā)者不得不依賴如 ts-node、tsx 等工具進行運行時編譯。
- 啟動慢、調(diào)試復(fù)雜:這些工具通常帶有一定的啟動成本,并增加了調(diào)試配置的復(fù)雜度。
- 生態(tài)割裂:當 Node 核心本身不支持 TS 時,整個開發(fā)工具鏈難以形成統(tǒng)一的開發(fā)體驗。
而與此同時,TypeScript 版本快速演進,語言能力不斷增強,與 Node.js 的支持進度產(chǎn)生嚴重錯位,成為社區(qū)長期關(guān)注的“短板”。
Node.js 開始支持 TS的過程
Node.js 團隊逐步意識到原生支持 TypeScript 的必要性,從 2024 年起開始改進:
- 2024 年 6 月(Node v22.6):引入 --experimental-strip-types標志,首次實現(xiàn)對 TypeScript 類型注釋的移除,可直接運行簡單 TS 文件。
- 2024 年 7 月(Node v22.7):加入 --experimental-transform-types標志,開始支持如 enum、namespace 等需要代碼轉(zhuǎn)換的語法。
- 2025 年 3 月(Node v23.6):默認開啟類型剝除,.ts 文件可以直接運行,不用加任何參數(shù)。
Amaro 1.0:打通 TS 支持最后一公里
6 月 10 日,Node.js 推出 Amaro 1.0,這意味著 TypeScript 的原生支持終于要穩(wěn)定了!
Amaro 是用 Rust 寫的,并通過 WebAssembly 在 Node.js 中運行的 類型剝除加載器。它的主要功能有:
- 極速性能:基于 SWC 引擎,運行快速,占用資源小。
- 有兩種模式:
a.strip-types:只移除類型,不轉(zhuǎn)換語法(適用于常見場景)
b.transform-types:轉(zhuǎn)換復(fù)雜語法,如枚舉、命名空間等。
- 支持依賴剝除:可用于剝除 node_modules 中的 .ts 文件,適合 monorepo 項目。
- 版本獨立更新:Amaro 作為單獨模塊存在,可獨立于 Node.js 升級。
類型剝離:在轉(zhuǎn)譯過程中從 TypeScript 代碼中刪除類型注釋,使其能夠直接在 JavaScript 環(huán)境中運行。
Node.js vs Bun vs Deno
在現(xiàn)代 JavaScript 運行時中,Bun 與 Deno 都提供了對 TypeScript 的原生支持,但它們與 Node.js + Amaro 的實現(xiàn)方式有 明顯差異:
- Node.js:
a.支持方式:通過 Amaro 實現(xiàn)“類型剝離”,只移除 .ts 文件中的類型注釋,不執(zhí)行完整 TypeScript 編譯。
b.局限:僅支持 TS 的“語法超集”部分,不支持完整的 TS 類型檢查或語義分析,需要搭配 IDE 或構(gòu)建工具單獨做類型檢查。
- Bun:
a.支持方式:使用自己的 超快速 TS 編譯器,內(nèi)置 TypeScript 支持,可以直接運行 .ts 和 .tsx。
b.優(yōu)勢:無需配置直接支持 TS,支持 TS 語言大部分語法和類型語義,效果近似于 tsc。
- Deno:
a.支持方式:直接以 TypeScript 作為一等公民語言,從開始就支持 TS。內(nèi)部使用 swc 做 TS 編譯,提供強類型校驗。
b.優(yōu)勢:.ts、.tsx 無需配置可直接運行,支持類型檢查與運行分離,靈活性好。
Node.js 選擇“類型剝離”這種方式,是為了保留現(xiàn)有生態(tài)的兼容性,代價更?。籅un 和 Deno 是從底層支持 TS,功能更全。對于傳統(tǒng) Node 項目,Amaro 是更穩(wěn)妥的方案。如果想要更先進的開發(fā)體驗,Bun 和 Deno 可能更適合。
未來展望
Node.js 和 TypeScript 的整合已經(jīng)邁出關(guān)鍵一步。Amaro 讓“直接用 Node 跑 TS”變得可行。未來開發(fā)時,.js 和 .ts 之間的區(qū)別會越來越小,開發(fā)方式會更加統(tǒng)一、高效,也更安全。