辛宝Otto

辛宝Otto 的玄酒清谈

北漂前端程序员儿 / 探索新事物 / Web Worker 主播之一/内向话痨
xiaoyuzhou
email

速通-Rspack 相関技術共有

image.png

Rspack は非常に興味深い技術トピックであり、将来のポッドキャストのゲストでもあります。ここでは、クイックレビューを行います。

今回は、バイトダンスの Rspack の原理と実践を読み込みます。バイトダンスの杨健
杨健 - 字节跳动 Rspack の原理与实践

公式ウェブサイト:rspack.dev

いくつかの共有コンテンツの原文と感想がありますが、原文は明記し、感想を主にします。

image.png

原稿の概要

  • Rspack の理由
  • 特徴
  • エコシステムの互換性
  • プラグアンドプレイの能力
  • ビジネスパフォーマンスの利益
  • アーキテクチャ設計
  • 移行ガイド

Rspack の理由#

webpack は十分に優れていない#

会社内には多くの巨大なアプリケーションがあり、プロジェクトの起動が遅く、冷起動が遅く、ビルドが遅いです。

従来の webpack の最適化手法は、古い手法であり、例えば babel -> swc-loader、esbuild/vite などがあります。

これらの解決策には利点がありますが、完全に解決することはできません。たとえば、swc-loader はローダーを高速化できますが、完全ではありません。

vite は dev が速いですが、rollup のビルドは webpack よりも速くありません。

esbuild はプロダクションの最適化が速いですが、dev-hmr をサポートしていませんし、パッケージングの能力も制限されています。

ここで、vite と rspack のどちらが良いかという質問に答えましたが、答えはありません。シーンと極端なパフォーマンスによります。たとえば、開発体験、ssr ですが、重いプロジェクトのビルドには違いがあります。

ただし、rspack 自体は低レベルであり、vue-cli の移行は少し手間がかかります。

良いビルドツールの特徴#

それは開発者の要望です

  • パフォーマンスが良く、冷起動が速く、hrm が速く、ビルドが速く、数十回のビルドがある場合でも。
  • 柔軟性、設定が柔軟で、さまざまな使用シナリオに対応できること。toC のビルドアーティファクトのサイズ、toB の巨大なアプリケーションのスケーラビリティ
  • プロダクションのパフォーマンス:コード分割、treeShaking、初期表示など
  • アプリケーションのシナリオ、webapp+node.js + クロスプラットフォーム
  • 移行コストが低く、ビジネス側が抵抗しない

このように見ると、webpack が最も優れています。たとえば、swc/esbuild/vite などのツールは、伝統的なプロジェクト、クロスプラットフォームプロジェクトに対してまだ多くの改善の余地があります。

rspack がやってくれる!#

rspack には多くの利点があります:

  • rust による実装で、ネイティブ能力が強い
  • インクリメンタルコンパイル、高速な hrm
  • webpack エコシステムの互換性
  • プラグアンドプレイで ts/tsx/css/css modules をサポートし、プラグインを探す必要はありません
  • デフォルトでさまざまな最適化戦略があり、tree shaking/code splitting などのコードの圧縮など

互換性が良く、一部を紹介しました。そして、一般的なプラグインも見ました。

image.png

また、自分で試行錯誤する必要がなくなったので、ts を使う必要はありません。babel-loader/ts-loader は必要ありません。かつての悪夢です。

CSS も以前は面倒でしたが、パッケージ化、css/style loader などが組み込まれています。ただし、less/sass の設定が必要です。比較スクリーンショットがあり、rspack の方が簡単です。主に、less-loader が css と css/module を終了させ、組み込み処理を行います。

互換性が語られ、パフォーマンスの利益が良いということです。3 つの指標、dev の冷起動、hrm、プロダクションのビルド。

グラフィックがありますが、省略します。rspack のパフォーマンスは非常に良いです。特にプロダクションのビルドでは rollup はまだ対応していません。

利益#

ベンチマークを終えたので、実装について話しましょう。内部プロジェクトでは、webpack に比べて大幅な改善があります。

webpack では 1 つの hrm に 20 秒かかりますが、想像できません...、最適化後は 1 秒です。

よくある質問#

よくある質問に答えることができます:

なぜ node + js ではないのですか?#

  • webpack は長年にわたるシングルスレッドの努力で、パフォーマンスの限界があります
  • node 自体はシングルスレッドであり、マルチスレッドではありません
  • マルチスレッドをサポートするために worker-thread を使用し、新しい v8 インスタンスを作成してシングルスレッドをシミュレートします。通信プロセスにはシリアライズとデシリアライズが必要であり、データ共有の効率が低いです
  • 並行エコシステムが不足しています。v8 のマルチスレッドサポートが十分に良くないため、パフォーマンスの消費が大きく、並行プログラミングのエコシステムが不足しています

なぜ golang - esbuild ではないのですか?#

  • golang のパフォーマンスは十分です
  • napi のサポートが不十分であり、満足のいく結果を得ることができません
  • esbuild には ast を操作するための API が提供されておらず、es5 へのダウングレードがサポートされていません

なぜ rust なのですか?#

  • パフォーマンスが良い
  • napi のサポートが良く、rust マクロのサポートがあり、テンプレートコードを少なく書くことができます
  • rust は webAssembly をサポートしており、rust はより進んだリードを推進しています
  • rust の swc は ast の操作を豊富にサポートしており、es5 へのダウングレードもサポートしています

swc だけではダメですか?#

大企業が力を発揮しました。

  • swc の並行解析が悪いことがわかり、dev のプロファイラでパーシングがボトルネックであることがわかりました。さらに、低レベルのライブラリのバグも見つかりました。

なぜまだ js をプラグイン拡張に使用するのですか#

  • js は馴染みがあり、rust は馴染みがなく、コストが高く、柔軟性に欠けます
  • ダイナミックな機能、rust は js ほどダイナミックではなく、コンパイルアーティファクトはマシン環境に依存する可能性があり、差異があるかもしれません。クロスプラットフォームの処理が面倒で、10 以上のプラットフォームのアーティファクトをコンパイルする必要があるかもしれません。ハードルが高く、安定性も十分ではありません

速い原理#

  • アーキテクチャは Webpack 5 に基づいています
  • rust を採用する
  • babel を swc に変更し、loader が遅いため、一般的には swc/esbuild を使用して高速化します。
  • rust と js の通信には napi-rs を使用し、v8 はバッファ文字列に基づいて通信し、マルチスレッドのサポートが不十分で、複雑なデータ構造の通信が困難です。たとえば、ast はシリアライズ通信しか選択できません。シリアライズとデシリアライズのオーバーヘッドは非常に大きいです。しかし、rust のマルチスレッド共有はシンプルで、ほとんどオーバーヘッドがありません。マルチコアのパフォーマンスが優れています。

アーキテクチャ図がありますが、見たことがありません。Webpack のアーキテクチャ図と似ていると言われています。(私は経験がないので、2 回聞きました)

make pase ビルド依存グラフモジュールグラフ
/seal フェーズ。依存グラフからチャンクを生成します

  • 最適化分析、モジュールの使用、副作用の分析
  • チャンクグラフの作成
    • パッケージング、モジュールグラフ
  • ID の生成
    • モジュール ID の生成
    • チャンク ID の生成
  • モジュールコードの生成
  • ランタイムモジュール
  • チャンクリソースの生成
  • リソースの生成

パッケージキャッシュ戦略はビジネスと区別する必要があり、パッケージを並列にロードします。
ユーザー設定の polyfill es5-es6-esnext など
この部分は非常に興味深いです、初めて聞きました。

image.png

黄色の部分は並列に処理できますが、rust の方が速いです。webpack はマルチスレッドの処理がうまくいかず、thread-loader を使用しても通信が困難ですが、rspack は 2 つの欠点を解決しました。

核心:並列処理できるすべての場所で並列処理します。マルチコアで 1.7 倍のパフォーマンス向上がありますが、まだオーバーヘッドがあります。ただし、webpack の限定的なパフォーマンス向上(1.1 倍 - 1.2 倍)よりも優れています。

既存のビジネスの移行#

  • 組み込まれた機能を使用する、例えば js/ts/css/file-loader/html-plugin など
  • たとえば、html-plugin プラグインの柔軟性が十分ではないため、js バージョンのプラグインも組み込まれており、拡張が容易ですが、少し遅いです
  • サードパーティのプラグインはサポートされていませんが、追加できます

ロードマップの展望

  • webpack エコシステムの互換性
  • より多くのフレームワークのサポート
  • 永続キャッシュのサポート、遅延コンパイル
  • より多くのプロダクション最適化
  • mf のサポート

聞いた展望

うーん、webpack のアーキテクチャを読み込み、最適化の方向性を指摘しましたので、rspack はそれを実現しています。

尊敬すべき経験があり、詳細はわかりませんが、もっと見る必要があります。

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。