JS・TS向けビルドツールは結局何を使えばいいのか
目次
※ 主にブラウザで動かすためのバンドルについてなので、Nodeなどの環境に関しては言及していない
RustやGoによるツールの書き換えが流行って久しいが、JS・TS向けビルドツールにおいてはまだ最適解が見つからない、あるいは最適ではないが現状これでいいが確立されてきつつあるので、今一度どういったツールが出ていて今後どうなっていくのか簡単に書き置きした。
現状
個人的に考える、現状これ使っておけばいいツール。ほぼViteだが、好みや場面で他も使う。
完全に新規
- アプリケーション:Vite, rspack
- ライブラリ:Vite, tsup
既存の置き換え
- webpackを使用している
- configが膨大:rspack
- configが薄い:Vite
- webpack以外:Vite
ツールごとの所感
esbuild
- そのまま使えるのが理想ではあるが…
- JSは無理だがhmrある
- css modules は compose が使えるように なり、完全なサポートに向かいつつある
- Webpackのような細かいoptimizeはまだできない
- 個人プロジェクト故の懸念
- evanw 1人・スポンサー受け付けていない → 怖い
- 間にViteなど1つ挟んでおけば、もし頓挫しかけたとき巻き取られそう
Vite
- hmrある。jsもhmrできる
- esbuildではなくてrollup
- devとprodの差が
- rolldownが出てくるのを待てと、vite confでevanが言ってた
rspack
- Webpack互換
- webpack.config.jsを見ながら、他のコンフィグに書き換えがきついプロジェクトに
- builtin使うの控えればWebpackに帰るのも容易
- production readyという感じはまだない
- packageいれるとまあまあ壊れる
- issue立てればその都度修正されるが持続可能なのか
tsup
- esbuildのラッパー
- ほぼゼロコンフィグで、入れて動けばそのままいけそう
- CSSサポートはexperimental
- ちなみに、これの作者が他の esbuild ラッパーも紹介している
- rollup相当がほしいならもはやこれでいい感
- chakraやhono(node-server)で見た
Turbopack
- Webpackの後継(を名乗っている)
- Webpack互換を目指すより、Vercelのやりたいキャッシュゴリゴリ効かせたツールになる
- Next.js以外で使えるようになってから次第
Farm(farm-fe)
- “build tool written in rust, go” でググったら見つけた
- rspackよりも速いことを謳っている
- esbuildラッパーではないが、Vite互換
- esbuildが危うい感じになったときの選択肢にはなりそう
swc
- Vite入れられないプロジェクトに入ってる印象
- トランスパイラではあるが、一応言及したい
- rollupがparserこれにした
- rspackが推奨しているが、reactビルドできなくてswc-loader剥がしてbabel-loaderにしたことある
今後
Vite中心で回っていく
- esbuild直の敷居は高い
- Vite以外
- 薄くesbuild使いたいならtsup
- Webpack 時代の遺産を使いたいなら rspack
- esbuildを使いたくないならFarmと思っているが、特にこれで何か運用したことない
Native ESM 時代 が…
→ 来る
- バンドルしていない esm でいいなら esbuild で dev prod も1つに
- 結局hmrがほしいからViteになる気はする
- CDN Edgeで esm 吐くものを動かす
- esm.sh のようなもの
- バンドル時間短くなりそうなので、配信時にesmに変換できるのでは
- jsあんまり書きたくない層(hotwireとかalpineやってる層)は救われそう
→ まだ来ない
- rolldown.rs が開けないが…現状どうなってるんだ
おわりに
そもそもJS・TS周りのツール実装にJS以外の言語を使う意義
- wasm吐き出すならまだしも、バイナリ吐き出すために使う意味
- JS・TSの遺産を捨てて、パフォーマンスを求める覚悟
- node の SEA でバイナリ吐かせて配るで良いのでは?
- 先祖返りするんじゃないかと思っている
- 書き換えに頓挫しているものもある
- stcみたくコンパイラレベルになると、Rust書き換えには相当な体力が要る
いつでも剥がせるようにしておこうね
- (ビルドツールに限らずではあるが)4年前から言われてる
- Native ESM時代が来る保証はないが、備えるのは◯
- でも今バンドルせずにWebで動かすのは違う
- Module DeclarationsやBundle Preloadingのproposals動向次第(参考)