JavaScript の新しいバンドラ Rolldown について
はじめに
2024年3月8日に Rolldown がオープンソースになりました。
Rolldown は Rust で書かれた JavaScript バンドラで、将来 Vite で使われることを念頭に開発されています。名前からも想像できますが、Rollup 互換の API になっています。現在は開発段階であり、本番で使用することはまだできません。
この記事ではそんな Rolldown について簡単に紹介します。ほぼ公式サイトの要約です。
Rolldown の開発背景
Rolldown が開発された理由には、Vite のバンドル方法が影響しています。 Vite は内部的に 2 つのバンドラに依存しています。
esbuild
Go で書かれたバンドラです。esbuild は依存関係の事前バンドルや TypeScript / JSX のトランスパイル、minify などを行っています。高速で機能も豊富な反面、チャンク分割の制限という点で、アプリケーションをバンドルするには理想的ではない、と Rolldown の公式サイトでは述べられています。
依存関係の事前バンドル?なにそれ?という方は Vite 公式サイトがわかりやすいため、そちらを参照してください。
Rollup
Vite はプロダクションビルドに Rollup を使用しています。エコシステムが成熟している反面、Rust や Go などネイティブコードにコンパイルされる言語で書かれたツールと比べると遅い、という問題があります。
Vite がプロダクションビルドに esbuild を使わない理由は公式サイトにて以下のように述べられています。
esbuild の方が速いにもかかわらず、Vite は Rollup の柔軟なプラグイン API とインフラストラクチャーを採用し、エコシステムでの成功に大きく貢献しました。当面は、Rollup の方がパフォーマンスと柔軟性のトレードオフに優れていると考えています。
Vite の問題点
異なるバンドラを使うことは次のような問題を引き起こします。
- それぞれの出力の微妙な違いが、開発ビルドと本番ビルドの間で動作の違いを生む可能性がある。
- 本番ビルドの間、さまざまなツールによって繰り返し解析、変換、シリアライズされることによるパフォーマンスの低下や複雑度の増加。
このような問題を解決するために Rolldown が開発されました。ネイティブレベルのパフォーマンス、パース / シリアライズのオーバーヘッドを回避する組み込みのトランスフォーム、Rollup との互換性を持つプラグインインターフェース、大規模アプリケーションに適した高度なビルド出力制御を提供する単一のバンドラを目指しています。
Vite ユーザーはどうすればいいのか
公式サイトの言葉をそのまま引用します。
Rolldown は、Rollup の API やプラグイン・インターフェイスと可能な限り一致させ、簡単に導入できることを目指しています。単純なユースケースであれば、そのまま置き換えられるでしょう。しかし、エッジケース、特に高度なオプションが含まれる場合、細かな違いが生じる可能性もあります。
単純なユースケースであれば、Vite のバージョンを上げるだけで対応できるかもしれません。しかし、続いて次のように述べています。
私たちは JS を Rust に移植するつもりで始めましたが、可能な限り最高のパフォーマンスを達成するためには、Rust の仕組みに沿った方法でコードを書くことを優先しなければならないことにすぐに気づきました。Rolldown の内部アーキテクチャは Rollup よりも esbuild に近く、チャンクの分割ロジックは Rollup のものとは異なるかもしれません。
これはどちらかというとプラグイン開発者寄りの話かもしれませんが、既存の Rollup プラグインが動かなくなる可能性がありそうです。
ただ、開発ビルドと本番ビルドで動作がより近くなることは、我々 Vite ユーザーにとっては大きなメリットです。Vite が Rolldown に移行することを楽しみにしましょう。
Discussion