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