2024年8月28日
Rspack 1.0をリリースしました!
RspackはRustで書かれた次世代のJavaScriptバンドラーで、webpackのAPIとエコシステムに互換性があり、webpackの10倍の速度を実現します。
18か月前、Rspack 0.1をオープンソース化し、コミュニティから多くのフィードバックと貢献をいただきました。この期間中、170人のコントリビューターがRspackの開発に参加し、5000件以上のプルリクエストと2000件以上のIssueを提出していただき、Rspackは80以上のバージョンをリリースすることができました。そして、Rspackのnpmでの週間ダウンロード数は10万件を超えました🎉。
本日、Rspackは新たなマイルストーンである1.0に到達しました。これは、Rspackが本番環境に対応できるようになり、webpackのAPIと機能の大部分を網羅し、より多くのユーザーをサポートする準備が整ったことを意味します。
Rspackがオープンソース化されて以来、多くの企業や開発者が本番環境でRspackを使用しています。Rspackのnpmでの週間ダウンロード数は10万件を超えています。
ByteDance社内では、Rspackの週間ダウンロード数は40万件を超え、TikTok、Douyin、Lark、Cozeなど、1000以上のWebアプリケーションでRspackが使用されています。これらのプロジェクトは、Rspackを使用することでビルド時間とイテレーション効率を大幅に向上させています。これはまた、Rspackの初期設計上の問題を特定するのに役立ち、アーキテクチャを改善し、移移コスト、パフォーマンス、柔軟性のバランスを取るきっかけとなりました。
また、Microsoft、Amazon、Alibaba、Intuit、Bit.dev、Discordなど、Rspackを使い始める企業ユーザーが増えています。Rspackがこれらの企業ユーザーの段階的な移行を支援できることを嬉しく思っており、今後、より多くの企業や開発者との協力とコミュニケーションを期待しています。
0.1のリリース以降、Rspackには、以下を含む多くの重要な機能と最適化が導入されています。
Rustベースのバンドラーとして、パフォーマンスは常にRspackの中心的な焦点でした。Rspack 0.1のリリース以来、私たちは数多くのパフォーマンス改善を行い、さまざまなシナリオに合わせてパフォーマンスを最適化し、遅延コンパイルなどの主要な機能を追加して、大規模プロジェクトでのパフォーマンスを向上させました。
ベンチマークから、Rspack 0.1とRspack 1.0のビルドパフォーマンスを比較しました。Rspackは、多くの新機能を追加しながら、ビルドパフォーマンスを大幅に向上させました。
Rspackの現在のアーキテクチャと実装には、まだ大きな最適化の余地があることに注意してください。1.0リリース後、大規模アプリケーションをより適切にサポートするために、パフォーマンスをさらに数倍向上させる予定です。
0.1が最初にリリースされたとき、Rspackはまだ多くのwebpack APIとフックを実装しておらず、webpackプラグインとローダーとの互換性が制限されていました。そのため、@rspack/plugin-html、@rspack/plugin-minify、@rspack/plugin-node-polyfillの初期バージョンなど、一部のコミュニティライブラリをフォークしてRspackに適応させる必要がありました。
APIのサポートが徐々に改善されるにつれて、Rspackはますます多くのwebpackプラグインとローダーのサポートを追加しました。現在、Rspackはコミュニティのほぼすべてのローダーと互換性があります。ダウンロード数上位50のwebpackプラグインでは、80%以上がRspackで使用できるか、代替手段があります。
この基盤に基づいて、RspackはReact、Preact、Vue、Solid、Svelte、NestJSなど、より多くのライブラリとフレームワークをサポートしています。unpluginやnode-polyfill-webpack-pluginなど、多くのコミュニティプラグインのメンテナーがRspackに積極的に適応してくれたことに感謝します。webpackの主要メンテナーの1人であるAlexander Akait氏には、多くのwebpackローダーとプラグインのサポートにご尽力いただき、特に感謝いたします。
私たちはまた、webpackとRspackのエコシステムをさらに豊かにするために、より多くのコミュニティプラグインをサポートし、作成したいと考えています。
Rspackは、本番ビルドのバンドルサイズを最小限に抑えることを常に優先してきました。0.1のリリース以来、Rspackは徐々に最適化機能をwebpackと連携させ、split chunks、tree shaking、scope hoisting、mangle exportsなどの機能を実装しました。
プロジェクトがwebpackからRspackに移行する場合、これらの機能により、DXを向上させながら、バンドルサイズをwebpackと同じに保つことができます。場合によっては、Rspackの出力サイズがwebpackをわずかに上回ることもあります。
たとえば、実際の中規模Webアプリケーションでは、Rspack 1.0のバンドルサイズは、Rspack 0.1と比較して6600KBから5900KBに最適化されており、これはwebpackと同等です。今後、Rspackはバンドルサイズを最適化するためのより高度なソリューションを模索していきます。
Module Federationは、エコシステムで広く使用されているマイクロフロントエンドアーキテクチャパターンです。Rspackチームは、Module Federationチームと協力してModule Federation 2.0を開発してきました。この新しいバージョンでは、動的なTSタイプヒント、Chrome devtools、ランタイムプラグイン、プリロードなどの機能が提供されています。これらの機能により、Module Federationは大規模Webアプリケーションでマイクロフロントエンドアーキテクチャとして使用するのにより適したものになります。
Rspackは、Module Federation 1.0との下位互換性とサポートも提供しており、webpackプロジェクトの移行を容易にします。
1.0では、設定、JavaScript API、プラグインAPIの安定性を向上させました。これにより、上位レベルのツールとフレームワークがRspackとより簡単に統合できるようになります。また、公式WebサイトのガイドとAPIドキュメントも改善しました。
Rspack 1.0には、真新しいホームページも含まれています。デザイナーのEmily JacksonとチームメンバーのZack Jacksonには、この実現にご尽力いただき、感謝申し上げます。
過去2年間で、コミュニティではRustベースのバンドラーがいくつか誕生し、すべてが優れたパフォーマンスを発揮しています。Rspackは、一流のパフォーマンスを提供するだけではありません。柔軟性と互換性の面でもコミュニティをリードしています。
Rspackの現在の目標は次のとおりです。
Rstackは「Rspack Stack」の略で、Rspackを中心に構築された技術スタックを表します。以下のツールで構成されています。
これらのツールは、Rstackを構成しています。私たちは、開発者とユーザーの両方に最高のエクスペリエンスを提供する、統合されたWeb開発ツールセットを提供することを目指しています。
Rspack 1.0は、webpack v5との互換性を持つように設計されており、webpackを使用している多くのプロジェクトがRspackにスムーズに移行するのに役立ちます。 webpackとの互換性を維持しながら、Rspack 1.0は最新のWeb標準を採用し、究極のビルドパフォーマンスを目指しています。
今後のメジャーリリースでは、Rspackはwebpack APIに基づいて進化し、最新のWeb開発のニーズをより適切に満たします。
Rspack 0.7以前のバージョンを使用している場合、1.0にはいくつかの破壊的な変更が含まれていることに注意してください。アップグレードを支援するための詳細なドキュメントを用意しました。 Rspack 0.xからの移行を参照してください。
Rspackを初めて使用する場合は、クイックスタートを参照してRspackを使い始めてください。また、Rspack GitHubリポジトリにスター🌟を付けることをお勧めします。
Rspack 1.0は新たな始まりを告げるものです。このリリースに続き、Rspackチームは次の目標に焦点を当てます。
Rspack 1.xでサポート予定の主な機能を以下に示します。
Rspackは現在、ほとんどのプロジェクトのパフォーマンス要件を満たすことができますが、パフォーマンスの最適化にはまだ大きな余地があります。開発中、Rspackはmakeフェーズですでにほぼ一定レベルのインクリメンタルビルドを実現しています。ただし、sealフェーズでは、プロジェクトの規模が大きくなるにつれて、一部の計算が遅くなる可能性があります。 Rspackはsealフェーズの計算を段階的に最適化し、HMR時間を一定レベルに保ちます。
Rspackのキャッシュ機能の進化パスは、メモリキャッシュ、永続キャッシュ、ポータブルキャッシュの順次実装に従います。現在、Rspackは優れたHMRパフォーマンスを提供するメモリキャッシュを実装しています。次のステップは、この基盤に基づいて永続キャッシュを実装し、大規模プロジェクトの長いコールドスタートアップ時間に対処し、webpackと機能的に整合させることです。
その後、ポータブルキャッシュの実装を継続する予定です。これは、Rspackのビルドキャッシュが永続的であるだけでなく、環境やマシン間でポータブルになることを意味します。これにより、チームはキャッシュをより有効に活用し、分散ビルドの基盤を築くことができます。
現在、RspackはTypeScriptモジュールを処理する際に、ローダーを介してJavaScriptに変換してからさらに処理を行います。これは柔軟性を提供しますが、ビルド出力のさらなる最適化を妨げます。たとえば、開発者は`const enum`ではなく`enum`を使用する必要がありますが、`enum`は定数として最適化するのが困難です。将来的には、TypeScriptをRspackのファーストクラスシチズンとして扱い、TypeScriptの静的情報を利用して、ビルド出力のより高度なコンパイル時最適化(タイプベースのプロパティ名前変更など)を提供する予定です。
現在、上位レベルのツールはJS APIを使用してRspackを統合でき、優れた拡張性を備えています。ただし、RustとJavaScript間の通信オーバーヘッドにより、Rspackのパフォーマンスが制限されます。また、拡張機能をサポートするためにSWC Wasmプラグインも提供していますが、そのパフォーマンスはネイティブ言語よりも遅くなっています。上位レベルのツールにより柔軟な統合オプションとより優れたパフォーマンスを提供するために、統合用にRspackのRust APIを公開する予定です。
ByteDanceでは、Rspackに基づいてRSC(React Server Components)を実験的にサポートし、大規模なWebアプリケーションで検証しました。将来的には、RspackはRSCをファーストクラスでサポートし、RSCの実装を容易にするためのより多くのコア機能を提供します。たとえば、Rspackは現在、layer機能をサポートしており、1回の実行で複数の環境向けにビルドできます。
ESMはJavaScriptモジュールの標準です。現在、RspackとwebpackのESM出力のサポートを改善し、Rslibと呼ばれるRspackに基づくライブラリ構築ツールを作成しています。これにより、開発者はnpmパッケージをビルドする際にESMの静的分析とツリーシェイキングをより有効に活用できるようになります。
Rspackの開発は、素晴らしいコミュニティの貢献とサポートなしには実現できませんでした。特に感謝します。
オープンソースコミュニティでは、Rspackは2024年のBreakthrough of the Year Awardを受賞しました。これはRspackチームにとって大きな励みです。Rspackに投票してくれたすべての開発者に感謝します。
0.1リリース以降、いくつかのコミュニティチームと良好な協力関係を築いてきました。
また、Bazel、Storybook、Electronなど、より広範なエコシステムでRspackが使用または統合されていることを嬉しく思います。
最後に、Rspackエコシステムに貢献してくれたすべての開発者に感謝いたします ❤️
1.0リリースは、RspackがWebpackのコア機能を実装し、APIの安定性を達成したことを意味します。今後12~18か月間、Rspack 1.x APIの安定性を確保し、開発者が自信を持ってフレームワークやツールを構築できるようにします。1.xのイテレーション中は、Rspackで改善が必要な設計が見つかる可能性があります。これらの問題は、future flagsを使用して段階的にアップグレードすることで対処します。
現在、Rsbuild 1.0のリリースに向けて準備を進めており、9月上旬にリリース予定です。
Rsbuild 1.0 RCバージョンもリリースしました。Rsbuildにはこれ以上の破壊的な変更は加えられません。Rsbuild 0.xからの移行を参照して、Rsbuild 1.0 RCにアップグレードしてください。
Rspackはセマンティックバージョニング(semver)に従っており、マイナーリリースまたはパッチリリースでパブリックAPIに破壊的な変更を加えることはありません。ただし、いくつかの例外があります。
プロジェクトにセマンティックバージョニングの厳密な要件がある場合は、Rspackをマイナーバージョンに固定することができます。
Rspackは、experiments設定を介して使用できるいくつかの実験的な機能を提供しています。マイナーリリースでは、Rspackはこれらの実験的な機能のAPIに変更を加え、リリースノートでこれらの変更について詳細な説明を提供することがあります。そのため、実験的な機能を使用している場合は、マイナーリリースノートにご注意ください。
Rspackは現在プレ1.0フェーズにあるSWC上に構築されています。SWCの修正と改善に対応するため、SWCのバージョンを定期的に更新しています。これには、SWCの破壊的な変更や、一部のバージョンのSWC Wasmプラグインの破壊が含まれる場合があります。このような場合は、Rspackのマイナーバージョンをリリースし、変更ログに注記を追加します。SWCのアップグレードに破壊的な変更が含まれていない場合は、パッチまたはマイナーリリースでSWCをアップグレードすることがあります。
マイナーリリースでは、Rspackによってエクスポートされる型は、以下の理由により変更される場合があります。
以前のバージョンのRspackでWebpack APIが誤って実装されていた場合、Webpack APIの動作に合わせて、メジャーバージョン以外で修正することがあります。