swc-node, 最快的TypeScript/JavaScript compiler
2020.09.17 更新
swc-node/core
的異步API性能已經基本與esbuild
持平了,大部分場景下略微慢10%
以內,作者還在非常用力的優化性能,預計不久的將來性能會有一波質的提升。
2020.08.01 更新
昨天@尤雨溪提醒我,esbuild的同步API ( transformSync
) overhead挺大的,我去看了下源碼然後又用異步API ( transform
)測試了一下, esbuild
的異步API大概是@swc-node/core
的5 倍左右性能,而且CPU 佔用更少。
但是@swc-node/core
還是有實際意義的。就以jest
為例, jest
的transformer只能使用同步的API,這種場景下@swc-node/core
依然是最快的選擇。
原始內容
如果大家對deno有所關注會發現deno圍繞TypeScript生態擴展了很多用Rust實現的高性能工具鏈,比如deno_lint和deno_fmt。
而這些工具鏈都是建立swc-project/swc項目上,swc是用Rust實現的一套TypeScript/JavaScript compiler,性能較babel/ts快5~20倍。
swc 官方提供了node binding,但是官方版本使用起來有幾個問題:
- 使用neon來實現NodeJS的binding,neon在binding層性能相較於NodeJS的n-api有一定的劣勢,並且不是ABI stable。這意味著針對多個Node/V8 版本要編譯多個binary。
- prebuilt 的binary 在postinstall 的時候從Github assets 下載進行分發,在+86 地區會被GFW 制裁。
- 在native 層做了太上層的抽象,(Class 封裝,參數的一層層serialize/deserialize)進一步降低了性能。
為了解決這些問題,誕生了swc-node 項目:
與官方的@swc/core 相比,swc-node 有以下幾個優勢:
- 使用n-api 實現,兼容8.9+ 所有的NodeJS 版本
- 沒有postinstall,所有的內容都最小化的從npm 下載,很方便的使用各種npm 源加速
- 性能更強
- 對node各種生態有更好的支持,比如jest和swc-register (未來還會有swc-loader等其它工具鏈的支持)
在性能上,Github 的項目中有一個簡單的benchmark,將RxJS 的AjaxObservable.ts 編譯成ES2015 + CommonJS 的JavaScript(這裡不用ES5 target 是因為esbuild 不支持target ES5):
@swc-node/core x 151 ops/sec ±3.74% ( 77 runs sampled ) @swc/core x 107 ops/sec ±0.51% ( 78 runs sampled ) esbuild x 52.89 ops/sec ±1.58% ( 67 runs sampled ) typescript x 21.08 ops/sec ±9.68% ( 40 runs sampled ) Transform rxjs/AjaxObservable.ts benchmark bench suite: Fastest is @swc-node/core
而使用@swc-node/jest之後,我目前在公司負責的一個純TypeScript項目測試運行時間也大大降低:
// jest.config.js module . exports = { verbose : true , transform : { '^.+.(t|j)sx?$' : '@swc-node/jest' , }, }
ts-jest:
Test Suites: 48 passed, 48 total Tests: 239 passed, 239 total Snapshots: 49 passed, 49 total Time: 49.808 s Ran all test suites. ✨ Done in 54.35s.
@swc-node/jest:
Test Suites: 49 passed, 49 total Tests: 250 passed, 250 total Snapshots: 53 passed, 53 total Time: 9.921 s Ran all test suites. ✨ Done in 15.79s.
問題:
雖然swc 又快又好,但是還是有一些毛病的,在使用之前你需要有一些取捨:
編譯產物還沒有經過大規模驗證:
由於是從零開始編寫的TypeScript 編譯器,swc 畢竟被使用的時間還太短了,在我接入公司項目的過程中就發現了好幾個編譯bug,所以目前不推薦用來編譯生產環境代碼,用在dev 環境或者用來編譯測試代碼都是不錯的選擇。
在@swc-node項目中,如果使用過程中發現編譯有問題的文件,可以通過fallbackToTs選項讓特定的文件fallback到TypeScript編譯。
目前只支持linux-gnu-64/ macOS / Win 64三個平台
如果你想在Android 設備,linux musl 環境或者Windows ARM 上使用@swc-node 可能需要等上一段時間了
招聘時間:
我所在的團隊是字節跳動IES 的前端架構團隊,團隊方向是前端性能/體驗/監控,對接的業務都是DAU 嚇死人我從來沒見過的量級。
如果你對前端的性能/體驗/監控或者工程化感興趣,可以直接通過https:// job.toutiao.com/s/Jjd16 j5直接投遞簡歷,也可以先加我微信我們先聊聊: Brooooooklyn - Overview