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