Rolldown について
TL;DR
Rolldownは、Rustで書かれたJavaScriptバンドラーであり、Viteで使用される将来のバンドラーとして機能することを目的としています。Rollup互換のAPIとプラグインインターフェースを提供しますが、スコープはesbuildにより類似します。
🚧 開発中
Rolldownは現在開発中で、本番環境で使用できる状態ではありません。しかし、コミュニティの貢献者と協力し始めるために、現在オープンソース化しています。
Rolldownを開発する理由
Rolldownは、Viteで使用される将来の低レベルバンドラーとして機能するように設計されています。
現在、Viteは内部的に2つのバンドラーに依存しています。
esbuild(Evan Wallace作成)。Viteは、依存関係のプリバンドリング、TypeScript/JSX変換、ターゲットローワーリング、そしてミニファイのためのesbuildを使用しています。
Rollup(Rich Harris作成、Lukas Taegert-Atkinsonがメンテナンス)。Viteは本番ビルドにRollupを使用し、Rollup互換のプラグインインターフェースをサポートしています。
Viteは、両方とも素晴らしいものですが、それぞれが他方が提供するものを欠いているため、**2つの異なるバンドラーを使用する必要があります**。
esbuildは非常に高速で機能豊富ですが、特にチャンク分割の制限に関して、アプリケーションのバンドリングには最適ではありません。
Rollupは成熟しており、アプリケーションのバンドリングで実績がありますが、コンパイル済みネイティブ言語で記述されたバンドラーよりも大幅に遅いです。
2つの異なるバンドラーを使用することは、いくつかの点で最適ではありません。
出力における微妙な違いにより、開発ビルドと本番ビルドの動作に違いが生じることがあります。
ユーザーソースは、本番ビルド全体で異なるツールによって繰り返し解析、変換、シリアル化されるため、回避できる多くのオーバーヘッドが発生します。
理想的には、Viteは、ネイティブレベルのパフォーマンス、解析/シリアル化オーバーヘッドを回避する組み込み変換、Rollupとの互換性のあるプラグインインターフェース、大規模アプリケーションに適した高度なビルド出力制御を提供する単一のバンドラーを活用できることを期待しています。
これが、私たちがRolldownを開発している理由です。
RolldownはRustで記述され、Oxcの上に構築されており、現在はそのパーサーとリゾルバーを活用しています。将来的にOxcのトランスフォーマーおよびミニファイアが利用可能になった場合にも活用する予定です。
私たちの長期的な目標は、Viteユーザー(フレームワークを介して直接的または間接的に)が、内部的にRolldownを使用するViteバージョンに最小限の摩擦で移行できるようにすることです。
同時に、Rolldownはスタンドアロンバンドラーとしても直接使用できます。
Rollupとの互換性と違い
Rolldownは、採用を容易にするために、できる限りRollupのAPIとプラグインインターフェースに合わせることを目指しています。単純なユースケースでは、ドロップイン置換として機能する可能性が高いです。ただし、特に高度なオプションが関与する場合、エッジケースでわずかな違いが生じる可能性もあります。
当初はJSからRustへの移植を意図していましたが、可能な限り最高の性能を達成するためには、Rustの動作に合わせた方法でコードを記述することを優先する必要があることにすぐに気づきました。Rolldownの内部アーキテクチャはRollupよりもesbuildにより近く、チャンク分割ロジックはRollupのものとは異なる可能性があります。
RolldownのスコープはRollupよりも大きく、esbuildにより類似しています。組み込みのCommonJSサポート、`node_modules`解決が含まれており、将来的にはTypeScript/JSX変換とミニファイもサポートする予定です。
なぜRollupを段階的に改善しないのか?
Viteは巨人の肩の上に立っており、その成功の多くはRollupのおかげです。私たちはRollupの現在のメインテナーであるLukasと良好な協力関係にあり、彼の素晴らしい仕事に非常に感謝しています。Rolldownの作業を開始する前にLukasに連絡を取り、彼がこの件を知っており、問題ないことを確認しました。合意事項は、段階的な改善(Lukasによる)とゼロからの再実装(私たちによる)の両方を並行して探求することが良いということです。
私たちの仮説は、JavaScriptのシングルスレッド性質とバンドラーの複雑さを考えると、段階的な変更によって目指しているパフォーマンスレベルを達成することは非常に困難であるということです。コンポーネントの一部をRustに移行することによるパフォーマンス向上は、Rollup 4によるRustベースのSWCパーサーの採用に見られるように、RustとJavaScript間でデータをやり取りするコストによって大幅に相殺されることがよくあります。最適なパフォーマンスを達成するには、解析/変換/コード生成パイプライン全体をネイティブ側で行い、できる限り並列化することが必要です。これは、ゼロからの実装でのみ実現可能です。
ロードマップ
GitHubのディスカッションでロードマップをご覧ください。
ご参加ください!
Rolldownはまだ初期段階です。多くの課題がありますが、コミュニティの貢献者なしではこれを行うことはできません。また、Rustを使用してJavaScriptツールの改善に長期的に取り組むことができるチームメンバーも積極的に探しています。