Rspack 1.0リリースのお知らせ

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 Stats

本日、Rspackは新たなマイルストーンである1.0に到達しました。これは、Rspackが本番環境に対応できるようになり、webpackのAPIと機能の大部分を網羅し、より多くのユーザーをサポートする準備が整ったことを意味します。

Rspackの利用者

Rspackがオープンソース化されて以来、多くの企業や開発者が本番環境でRspackを使用しています。Rspackのnpmでの週間ダウンロード数は10万件を超えています。

Rspack downloads

ByteDance社内では、Rspackの週間ダウンロード数は40万件を超え、TikTok、Douyin、Lark、Cozeなど、1000以上のWebアプリケーションでRspackが使用されています。これらのプロジェクトは、Rspackを使用することでビルド時間とイテレーション効率を大幅に向上させています。これはまた、Rspackの初期設計上の問題を特定するのに役立ち、アーキテクチャを改善し、移移コスト、パフォーマンス、柔軟性のバランスを取るきっかけとなりました。

また、Microsoft、Amazon、Alibaba、Intuit、Bit.dev、Discordなど、Rspackを使い始める企業ユーザーが増えています。Rspackがこれらの企業ユーザーの段階的な移行を支援できることを嬉しく思っており、今後、より多くの企業や開発者との協力とコミュニケーションを期待しています。

Who is using

新機能

0.1のリリース以降、Rspackには、以下を含む多くの重要な機能と最適化が導入されています。

パフォーマンスの向上

Rustベースのバンドラーとして、パフォーマンスは常にRspackの中心的な焦点でした。Rspack 0.1のリリース以来、私たちは数多くのパフォーマンス改善を行い、さまざまなシナリオに合わせてパフォーマンスを最適化し、遅延コンパイルなどの主要な機能を追加して、大規模プロジェクトでのパフォーマンスを向上させました。

ベンチマークから、Rspack 0.1とRspack 1.0のビルドパフォーマンスを比較しました。Rspackは、多くの新機能を追加しながら、ビルドパフォーマンスを大幅に向上させました。

Rspack benchmark

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など、より多くのライブラリとフレームワークをサポートしています。unpluginnode-polyfill-webpack-pluginなど、多くのコミュニティプラグインのメンテナーがRspackに積極的に適応してくれたことに感謝します。webpackの主要メンテナーの1人であるAlexander Akait氏には、多くのwebpackローダーとプラグインのサポートにご尽力いただき、特に感謝いたします。

私たちはまた、webpackとRspackのエコシステムをさらに豊かにするために、より多くのコミュニティプラグインをサポートし、作成したいと考えています。

バンドルサイズの縮小

Rspackは、本番ビルドのバンドルサイズを最小限に抑えることを常に優先してきました。0.1のリリース以来、Rspackは徐々に最適化機能をwebpackと連携させ、split chunkstree shakingscope hoistingmangle exportsなどの機能を実装しました。

プロジェクトがwebpackからRspackに移行する場合、これらの機能により、DXを向上させながら、バンドルサイズをwebpackと同じに保つことができます。場合によっては、Rspackの出力サイズがwebpackをわずかに上回ることもあります。

たとえば、実際の中規模Webアプリケーションでは、Rspack 1.0のバンドルサイズは、Rspack 0.1と比較して6600KBから5900KBに最適化されており、これはwebpackと同等です。今後、Rspackはバンドルサイズを最適化するためのより高度なソリューションを模索していきます。

Module Federation 2.0のサポート

Module Federationは、エコシステムで広く使用されているマイクロフロントエンドアーキテクチャパターンです。Rspackチームは、Module Federationチームと協力してModule Federation 2.0を開発してきました。この新しいバージョンでは、動的なTSタイプヒント、Chrome devtools、ランタイムプラグイン、プリロードなどの機能が提供されています。これらの機能により、Module Federationは大規模Webアプリケーションでマイクロフロントエンドアーキテクチャとして使用するのにより適したものになります。

Rspackは、Module Federation 1.0との下位互換性とサポートも提供しており、webpackプロジェクトの移行を容易にします。

安定したAPIと新しいWebサイト

1.0では、設定、JavaScript API、プラグインAPIの安定性を向上させました。これにより、上位レベルのツールとフレームワークがRspackとより簡単に統合できるようになります。また、公式WebサイトのガイドとAPIドキュメントも改善しました。

Rspack 1.0には、真新しいホームページも含まれています。デザイナーのEmily JacksonとチームメンバーのZack Jacksonには、この実現にご尽力いただき、感謝申し上げます。

Rspack Homepage

Rspackを選ぶ理由

過去2年間で、コミュニティではRustベースのバンドラーがいくつか誕生し、すべてが優れたパフォーマンスを発揮しています。Rspackは、一流のパフォーマンスを提供するだけではありません。柔軟性と互換性の面でもコミュニティをリードしています。

Rspackの現在の目標は次のとおりです。

  • 既存のwebpackプロジェクトが高性能バンドラーに段階的に移行できるよう支援することで、ビルドのパフォーマンスが高速なイテレーションのボトルネックにならないようにします。
  • Rspackは、私たちがよく知っているブラウザやNode.jsのような環境に適しているだけではありません。その目標は、JavaScriptが実行されるすべての環境をカバーすることです。つまり、RspackはDeno、Electron、クロスプラットフォームアプリケーション、ミニアプリ、その他のJavaScriptランタイムを簡単にサポートできます。
  • 1つのツールで「柔軟性」と「すぐに使える」ことのバランスをとるのは難しい作業であることがわかりました。そこで、Rspackをオープンソース化した後、Rsbuild、Rspress、Rsdoctor、Rslibなどのプロジェクトを含むRstackツールチェーンを開発し、それぞれが異なるユースケースをターゲットにしました。たとえば、Rspackの設定の複雑さと高い障壁を軽減するために、すぐに使える開発エクスペリエンスのためのRsbuildを提供しています。

Rspackスタック

Rspack Stack

Rstackは「Rspack Stack」の略で、Rspackを中心に構築された技術スタックを表します。以下のツールで構成されています。

  • Rspack:高性能バンドラーの実装に重点を置き、パフォーマンスと柔軟な設定のバランスを取っています。
  • Rsbuild:Webアプリケーションの構築に重点を置き、すぐに使える開発体験を提供します。
  • Rslib:ライブラリの構築に重点を置き、高品質なESMおよびCJS出力を提供します。
  • Rspress:静的サイトの生成に重点を置き、ドキュメントサイトやブログの構築にMDXをサポートします。
  • Rsdoctor:ビルド分析に重点を置き、開発者がビルド関連の問題を解決するのを支援します。

これらのツールは、Rstackを構成しています。私たちは、開発者とユーザーの両方に最高のエクスペリエンスを提供する、統合されたWeb開発ツールセットを提供することを目指しています。

Webpackとの互換性

Rspack 1.0は、webpack v5との互換性を持つように設計されており、webpackを使用している多くのプロジェクトがRspackにスムーズに移行するのに役立ちます。 webpackとの互換性を維持しながら、Rspack 1.0は最新のWeb標準を採用し、究極のビルドパフォーマンスを目指しています。

  • Web標準に関しては、Rspackは最新のWeb標準の進化とTC39およびWeb標準の最新の開発に積極的に従っています。たとえば、Rspackはすでにnew Worker()によるWeb Workersの使用、Import AttributesによるJSONモジュールのインポート、CSS Module Scripts仕様に基づくCSSのインポートをサポートしています。
  • パフォーマンスに関しては、1.0で多くの最適化を導入しました。たとえば、JavaScript側のフックが使用されていない場合、Rust側はJavaScript側との通信を呼び出しません。また、Rspackは多くのメッセージオブジェクトに対して遅延読み込みを実行します。メッセージオブジェクトが大きくても、JavaScriptがそのプロパティのサブセットのみを使用する場合、Rspackは使用されたデータのみを転送し、RustとJavaScript間の通信オーバーヘッドを最小限に抑えます。そして、Rspackは将来的にさらに軽量なフックを提供して、RustとJavaScript間のより効率的な通信を実現する予定です。

今後のメジャーリリースでは、Rspackはwebpack APIに基づいて進化し、最新のWeb開発のニーズをより適切に満たします。

1.0の使い方

Rspack 0.7以前のバージョンを使用している場合、1.0にはいくつかの破壊的な変更が含まれていることに注意してください。アップグレードを支援するための詳細なドキュメントを用意しました。 Rspack 0.xからの移行を参照してください。

Rspackを初めて使用する場合は、クイックスタートを参照してRspackを使い始めてください。また、Rspack GitHubリポジトリにスター🌟を付けることをお勧めします。

今後の予定

Rspack 1.0は新たな始まりを告げるものです。このリリースに続き、Rspackチームは次の目標に焦点を当てます。

  • Rspack 1.xの開発。 Rspack 1.xは12〜18か月かけてイテレーションを行い、より多くの新機能と改善をもたらします。
  • Rsbuild 1.0のリリース。 Rspack 1.0をベースにしており、複数環境ビルドをサポートします。現在、Rsbuildはバージョン1.0 RCをリリースしており、正式リリースは9月に予定されています。
  • Rsdoctor 1.0のリリース。このリリースでは、Vueのサポートが改善され、CI/CD用のレポート形式が提供されます。
  • Rslib 0.xの開発。 RslibはRsbuildに基づくライブラリ構築ツールです。詳細はRslibリポジトリを参照してください。
  • Rspress 2.0の開発。 React 19をベースにしており、API設計の一部が改善されます。詳細はRspress v2.0計画を参照してください。

Rspack 1.xでサポート予定の主な機能を以下に示します。

より高速なHMR

Rspackは現在、ほとんどのプロジェクトのパフォーマンス要件を満たすことができますが、パフォーマンスの最適化にはまだ大きな余地があります。開発中、Rspackはmakeフェーズですでにほぼ一定レベルのインクリメンタルビルドを実現しています。ただし、sealフェーズでは、プロジェクトの規模が大きくなるにつれて、一部の計算が遅くなる可能性があります。 Rspackはsealフェーズの計算を段階的に最適化し、HMR時間を一定レベルに保ちます。

ポータブルキャッシュ

Rspackのキャッシュ機能の進化パスは、メモリキャッシュ、永続キャッシュ、ポータブルキャッシュの順次実装に従います。現在、Rspackは優れたHMRパフォーマンスを提供するメモリキャッシュを実装しています。次のステップは、この基盤に基づいて永続キャッシュを実装し、大規模プロジェクトの長いコールドスタートアップ時間に対処し、webpackと機能的に整合させることです。

その後、ポータブルキャッシュの実装を継続する予定です。これは、Rspackのビルドキャッシュが永続的であるだけでなく、環境やマシン間でポータブルになることを意味します。これにより、チームはキャッシュをより有効に活用し、分散ビルドの基盤を築くことができます。

TypeScriptベースの最適化

現在、RspackはTypeScriptモジュールを処理する際に、ローダーを介してJavaScriptに変換してからさらに処理を行います。これは柔軟性を提供しますが、ビルド出力のさらなる最適化を妨げます。たとえば、開発者は`const enum`ではなく`enum`を使用する必要がありますが、`enum`は定数として最適化するのが困難です。将来的には、TypeScriptをRspackのファーストクラスシチズンとして扱い、TypeScriptの静的情報を利用して、ビルド出力のより高度なコンパイル時最適化(タイプベースのプロパティ名前変更など)を提供する予定です。

安定したRust API

現在、上位レベルのツールはJS APIを使用してRspackを統合でき、優れた拡張性を備えています。ただし、RustとJavaScript間の通信オーバーヘッドにより、Rspackのパフォーマンスが制限されます。また、拡張機能をサポートするためにSWC Wasmプラグインも提供していますが、そのパフォーマンスはネイティブ言語よりも遅くなっています。上位レベルのツールにより柔軟な統合オプションとより優れたパフォーマンスを提供するために、統合用にRspackのRust APIを公開する予定です。

React Server Componentsのサポート

ByteDanceでは、Rspackに基づいてRSC(React Server Components)を実験的にサポートし、大規模なWebアプリケーションで検証しました。将来的には、RspackはRSCをファーストクラスでサポートし、RSCの実装を容易にするためのより多くのコア機能を提供します。たとえば、Rspackは現在、layer機能をサポートしており、1回の実行で複数の環境向けにビルドできます。

ESM出力の改善

ESMはJavaScriptモジュールの標準です。現在、RspackとwebpackのESM出力のサポートを改善し、Rslibと呼ばれるRspackに基づくライブラリ構築ツールを作成しています。これにより、開発者はnpmパッケージをビルドする際にESMの静的分析とツリーシェイキングをより有効に活用できるようになります。

謝辞

Rspackの開発は、素晴らしいコミュニティの貢献とサポートなしには実現できませんでした。特に感謝します。

  • オープンソース段階の初期にRspackを信頼し、統合してくれたNXチーム
  • Rspackのプロモーションを支援してくれたZack ChappleZephyrチーム
  • Rspackの統合とプラグインエコシステムの充実化に積極的に取り組んでくれたUnpluginチーム
  • DiscordでRspackを使用し、口コミを広めるのを手伝ってくれたBrandon Dail
  • GitHubとDiscordで精力的にユーザーを支援し、Rspack関連の質問に答えてくれたKaffi Y
  • Kelvin OmereshoneYannik PeschkeRussell CanfieldKyryloなど、ByteDanceのRspackイノベータープロジェクトに参加しているすべての開発者。彼らは早期のフィードバックとアドバイスを提供してくれました。
  • バージョン0.x以降、Rspackを使用してきたすべての企業とユーザー。彼らの貴重な提案は、Rspackの進歩に役立ちました。

オープンソースコミュニティでは、Rspackは2024年のBreakthrough of the Year Awardを受賞しました。これはRspackチームにとって大きな励みです。Rspackに投票してくれたすべての開発者に感謝します。

Rspack OSS Awards

0.1リリース以降、いくつかのコミュニティチームと良好な協力関係を築いてきました。

  • Webpackとの連携を進める中で、Webpackチームと協力して、ネイティブCSSとESM出力のサポートを改善しました。その過程で、RspackチームはWebpackに100件以上のコミットを送信しました。レビューフィードバックを提供してくれたAlexander Akait氏に特に感謝いたします。
  • また、SWCチームとも協力し、Preact Refresh SWCプラグインを提供し、SWCの変換と縮小に関するいくつかのバグを修正しました。レビューフィードバックを提供してくれたkdy氏に感謝いたします。
  • Rspackはunpluginエコシステムを採用し、unplugin APIを完全にサポートしています。レビューフィードバックを提供してくれたsxzz氏と、優れた創造性を発揮してくれたantfu氏に感謝いたします。

また、BazelStorybookElectronなど、より広範なエコシステムでRspackが使用または統合されていることを嬉しく思います。

最後に、Rspackエコシステムに貢献してくれたすべての開発者に感謝いたします ❤️

Rspack Contributors

FAQ

1.0リリースの意味は?

1.0リリースは、RspackがWebpackのコア機能を実装し、APIの安定性を達成したことを意味します。今後12~18か月間、Rspack 1.x APIの安定性を確保し、開発者が自信を持ってフレームワークやツールを構築できるようにします。1.xのイテレーション中は、Rspackで改善が必要な設計が見つかる可能性があります。これらの問題は、future flagsを使用して段階的にアップグレードすることで対処します。

Rsbuild 1.0はいつリリースされますか?

現在、Rsbuild 1.0のリリースに向けて準備を進めており、9月上旬にリリース予定です。

Rsbuild 1.0 RCバージョンもリリースしました。Rsbuildにはこれ以上の破壊的な変更は加えられません。Rsbuild 0.xからの移行を参照して、Rsbuild 1.0 RCにアップグレードしてください。

Rspackはセマンティックバージョニングに従っていますか?

Rspackはセマンティックバージョニング(semver)に従っており、マイナーリリースまたはパッチリリースでパブリックAPIに破壊的な変更を加えることはありません。ただし、いくつかの例外があります。

プロジェクトにセマンティックバージョニングの厳密な要件がある場合は、Rspackをマイナーバージョンに固定することができます。

実験的な機能

Rspackは、experiments設定を介して使用できるいくつかの実験的な機能を提供しています。マイナーリリースでは、Rspackはこれらの実験的な機能のAPIに変更を加え、リリースノートでこれらの変更について詳細な説明を提供することがあります。そのため、実験的な機能を使用している場合は、マイナーリリースノートにご注意ください。

Rspackは現在プレ1.0フェーズにあるSWC上に構築されています。SWCの修正と改善に対応するため、SWCのバージョンを定期的に更新しています。これには、SWCの破壊的な変更や、一部のバージョンのSWC Wasmプラグインの破壊が含まれる場合があります。このような場合は、Rspackのマイナーバージョンをリリースし、変更ログに注記を追加します。SWCのアップグレードに破壊的な変更が含まれていない場合は、パッチまたはマイナーリリースでSWCをアップグレードすることがあります。

マイナーリリースでは、Rspackによってエクスポートされる型は、以下の理由により変更される場合があります。

  • TypeScript自体はsemverに従っていません。マイナーリリースで破壊的な変更が導入される場合があり、Rspackはそれに合わせて型を調整する必要があります。
  • Rspackは、上位バージョンのTypeScriptで導入された機能を使用することがあり、下位バージョンのTypeScriptを使用しているプロジェクトに影響を与える可能性があります。

Webpack互換性のためのバグ修正

以前のバージョンのRspackでWebpack APIが誤って実装されていた場合、Webpack APIの動作に合わせて、メジャーバージョン以外で修正することがあります。