はじめに
「Reactを使っている場合はjsxをトランスフォームするためにbabelを使用するのはわかるが、React + TypeScriptの組み合わせを使っている場合、tscでトランスパイルすれば、tsxのトランスフォームもtscがしくてれて、babel使わなくていいんじゃないの?」と知人から聞かれて、たしかにそうだなーと思いつつ、プロダクトでは babel
や最近は esbuild
、 swc
を使っていることが多くて、tsc
を使うことは少ない気がする(というか見たことない)と思ったので調べてみました。
まずReactの環境をどう構築するのか問題
次期公式ドキュメントになるであろう React Docs beta の中では、次の方法が紹介されています。
- Create React App
- Vite
- parcel
- snowpack
- Next.js
- Gatsby
- Razzle
それぞれどういったトランスパイラーを使用しているか
- Create React App
- Vite
- esbuildを使用
- https://ja.vitejs.dev/guide/features.html#jsx
- esbuildはバンドルも可能(正確にはライブラリのみesbuildでバンドルし、アプリはrollupを使用)かつ、tscよりもトランスパイルが20~30倍高速なので、esbuildを使用しているとのこと
- esbuildを使用
- parcel
- snowpack
- snowpackのプラグインでpreact形式のjsxに変換
- preact形式のjsxはそのままブラウザで実行可能でビルドは不要
- Next.js
- Gatsby
- parcelを使用
- しかしswc対応していないライブラリがあるせいで、swc対応されてはいない。つまりbabelが使用されている模様
- Razzle
感想
やはり babel
を使用していることがそこそこ多く、 tsc
は存在しなかったですね。tsx→jsだけでなく、jsx→jsの変換もしようとすると、 babel
を採用するのは納得できるなーといった感じです。
多いですね。一方、最近出てきた esbuild
や swc
はバンドルが可能であったり、トランスパイル自体早いものの、babelのプラグインが必要だったライブラリは移行しづらく、 swc
のメンテナーをvercelが採用したのも、このbabel依存を剥がすためにはそのくらい本気で取り組まないと進まないんだなーと感じました。
今後、 esbuild
や swc
、あと、今回は出てきていませんが all-in-oneな rome
のどれがディファクトスタンダードになるか、見守っていきたいと思います