swc-node, 最快的TypeScript/JavaScript compiler

blank

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各種生態有更好的支持,比如jestswc-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 嚇死人我從來沒見過的量級。

如果你對前端的性能/體驗/監控或者工程化感興趣,可以直接通過 job.toutiao.com/s/Jjd16 直接投遞簡歷,也可以先加我微信我們先聊聊: Brooooooklyn - Overview

What do you think?

Written by marketer

blank

Web Worker 文獻綜述

blank

一個簡易的預渲染自動骨架屏方案