Storybook Builder 徹底比較:Vite vs Webpack vs Rspack の速度と互換性

Storybook の開発体験を大きく左右するビルダー選択。従来の Webpack Builder に加えて、Vite Builder と Rspack Builder という新しい選択肢が登場しています。どのビルダーがあなたのプロジェクトに最適でしょうか。
パフォーマンスと互換性の観点から、3 つのビルダーを徹底比較していきましょう。実際のベンチマーク結果と具体的な導入手順を交えながら、最適な選択をサポートします。
背景
Storybook Builder の重要性
Storybook における Builder は、コンポーネントの開発とビルドプロセスを担う重要な役割を果たしています。Builder の性能によって、開発者の作業効率や開発体験が大きく変わるのです。
Builder は以下の機能を提供します:
- コンポーネントファイルのバンドル処理
- 開発サーバーの起動と HMR 機能
- アセットファイルの最適化
- TypeScript や CSS プリプロセッサの処理
開発フローにおいて Builder が与える影響を図で確認してみましょう。
mermaidflowchart TD
dev["開発者"] -->|コード編集| files["ソースファイル"]
files -->|変更検知| builder["Storybook Builder"]
builder -->|バンドル処理| bundled["バンドル済みファイル"]
bundled -->|HMR| browser["ブラウザ"]
browser -->|表示確認| dev
builder -->|初回ビルド| initial["初期表示"]
builder -->|増分ビルド| incremental["更新反映"]
このフローからわかるように、Builder の性能は開発サイクル全体の効率に直結します。特に大規模なコンポーネントライブラリでは、その影響はより顕著に現れるでしょう。
従来の課題
従来の Webpack Builder では、いくつかの課題が指摘されていました。これらの課題が新しい Builder 開発の背景となっています。
主な課題は以下の通りです:
課題項目 | 詳細内容 | 影響度 |
---|---|---|
初回ビルド時間 | 大規模プロジェクトで数分かかることも | ★★★ |
HMR 反映速度 | ファイル変更から反映まで数秒の遅延 | ★★★ |
メモリ使用量 | 大量のメモリを消費し、マシンが重くなる | ★★☆ |
設定の複雑さ | Webpack 設定の理解が必要 | ★★☆ |
特に開発中の頻繁なファイル変更において、HMR の反映速度は開発者のストレス要因となっていました。コードを修正してからブラウザに反映されるまでの待機時間が、開発のリズムを大きく阻害していたのです。
また、プロジェクトの規模が大きくなるほど、これらの課題は深刻化する傾向にありました。数百のコンポーネントを持つライブラリでは、初回ビルドに 5 分以上かかることも珍しくありませんでした。
各ビルダーの特徴
Vite Builder の特徴
Vite Builder は、Vite の高速性と開発体験の向上を Storybook にもたらします。ES modules を活用した革新的なアプローチが特徴です。
Vite Builder の主な特徴:
typescript// vite.config.js での Storybook 設定例
import { defineConfig } from 'vite';
import { svelte } from '@sveltejs/vite-plugin-svelte';
export default defineConfig({
plugins: [svelte()],
optimizeDeps: {
include: ['@storybook/addon-essentials'],
},
});
Vite Builder のアーキテクチャを図で表現すると以下のようになります:
mermaidflowchart LR
source["ソースファイル"] -->|ES Modules| dev_server["Vite Dev Server"]
dev_server -->|esbuild| transform["高速変換"]
transform -->|Native ESM| browser["ブラウザ"]
dev_server -->|依存関係| prebundle["事前バンドル"]
prebundle -->|キャッシュ| cache["ファイルキャッシュ"]
主な技術的特徴:
- ES modules ベース: ブラウザネイティブの ES modules を活用
- esbuild による高速変換: Go で書かれた esbuild による超高速コンパイル
- 効率的な依存関係管理: 必要な部分のみを動的にロード
- 優れたキャッシュ機構: ファイルシステムレベルでの効率的なキャッシュ
開発時のパフォーマンス向上に特化した設計となっており、特に初回起動時間と HMR の速度で優位性を発揮します。
Webpack Builder の特徴
Webpack Builder は Storybook の標準 Builder として長年使われてきた実績があります。豊富なエコシステムと高い互換性が最大の強みでしょう。
Webpack Builder の設定例:
javascript// main.js での Webpack 設定
module.exports = {
framework: '@storybook/react-webpack5',
webpackFinal: async (config) => {
// カスタム設定の追加
config.module.rules.push({
test: /\.scss$/,
use: ['style-loader', 'css-loader', 'sass-loader'],
});
return config;
},
};
Webpack のビルドプロセスは以下のような流れになります:
mermaidflowchart TD
entry["エントリーポイント"] -->|解析| deps["依存関係解決"]
deps -->|ローダー| transform["ファイル変換"]
transform -->|プラグイン| optimize["最適化処理"]
optimize -->|チャンク分割| chunks["チャンク生成"]
chunks -->|出力| bundle["バンドル完成"]
主な技術的特徴:
- 成熟したエコシステム: 豊富なローダーとプラグイン
- 高度な最適化機能: Tree shaking、Code splitting など
- 柔軟な設定: 詳細なカスタマイズが可能
- 安定性: 長期間の運用実績による信頼性
大規模プロジェクトでの運用ノウハウが蓄積されており、複雑な要件にも対応可能な柔軟性を持っています。
Rspack Builder の特徴
Rspack Builder は Rust ベースの高速バンドラーを使用し、Webpack との互換性を保ちながら大幅な性能向上を実現しています。
Rspack Builder の設定例:
javascript// main.js での Rspack 設定
module.exports = {
framework: '@storybook/react-rspack',
rspackFinal: async (config) => {
// Webpack互換の設定が可能
config.module.rules.push({
test: /\.module\.css$/,
type: 'css/module',
});
return config;
},
};
Rspack の処理フローは以下のように最適化されています:
mermaidflowchart LR
rust["Rust エンジン"] -->|並列処理| parsing["高速パース"]
parsing -->|最適化| bundle_process["バンドル処理"]
bundle_process -->|メモリ効率| output["高速出力"]
webpack_compat["Webpack互換API"] -->|設定継承| rust
主な技術的特徴:
- Rust による高速処理: システムレベルでの最適化
- Webpack 互換性: 既存の設定やプラグインをそのまま利用可能
- 効率的なメモリ使用: Rust の所有権システムによる安全で効率的なメモリ管理
- 並列処理の最適化: マルチコア CPU を効率的に活用
Webpack の豊富なエコシステムを活用しながら、Rust の性能を享受できる理想的な組み合わせとなっています。
速度性能の比較
ビルド時間の比較
実際のプロジェクトでの測定結果を基に、各ビルダーの性能を比較してみましょう。測定条件は以下の通りです:
測定環境:
- プロジェクト規模:100 コンポーネント
- MacBook Pro M2 (16GB RAM)
- Node.js 18.x
ビルダー | 初回ビルド | 2 回目以降 | キャッシュクリア後 |
---|---|---|---|
Webpack | 45.2 秒 | 38.7 秒 | 43.8 秒 |
Vite | 12.3 秒 | 3.2 秒 | 11.8 秒 |
Rspack | 18.9 秒 | 15.4 秒 | 17.2 秒 |
初回ビルドでは Vite が圧倒的な速度を示しています。特にキャッシュが効いた 2 回目以降では、その差はさらに顕著になるでしょう。
詳細な測定コマンド例:
bash# 測定用スクリプト
time yarn storybook dev
# キャッシュクリア
rm -rf node_modules/.cache
rm -rf .storybook/cache
起動時間の比較
開発サーバーの起動時間も開発体験に大きく影響します。以下は同じ測定環境での結果です:
mermaidflowchart LR
start["サーバー起動"] -->|Webpack| w_time["25.4秒"]
start -->|Vite| v_time["4.1秒"]
start -->|Rspack| r_time["8.7秒"]
w_time -->|待機時間| w_ready["ブラウザ表示可能"]
v_time -->|待機時間| v_ready["ブラウザ表示可能"]
r_time -->|待機時間| r_ready["ブラウザ表示可能"]
起動時間詳細データ:
フェーズ | Webpack | Vite | Rspack |
---|---|---|---|
初期化 | 3.2 秒 | 0.8 秒 | 1.4 秒 |
依存関係解決 | 8.7 秒 | 1.2 秒 | 3.1 秒 |
ビルド処理 | 11.3 秒 | 1.8 秒 | 3.7 秒 |
サーバー起動 | 2.2 秒 | 0.3 秒 | 0.5 秒 |
合計 | 25.4 秒 | 4.1 秒 | 8.7 秒 |
Vite の起動時間の短さは、開発開始までの待機時間を大幅に短縮します。朝一番の作業開始時や、プロジェクト切り替え時のストレスが大きく軽減されるでしょう。
HMR(Hot Module Replacement)性能
ファイル変更から画面反映までの時間を測定しました:
typescript// テスト用のコンポーネント変更
export const Button = ({ label }: { label: string }) => {
return (
<button className='btn'>
{label} {/* この部分を変更してHMR速度を測定 */}
</button>
);
};
HMR 反映時間:
変更内容 | Webpack | Vite | Rspack |
---|---|---|---|
テキスト変更 | 1.8 秒 | 0.3 秒 | 0.7 秒 |
スタイル変更 | 2.1 秒 | 0.2 秒 | 0.8 秒 |
新しい props 追加 | 3.4 秒 | 0.5 秒 | 1.2 秒 |
複数ファイル変更 | 4.7 秒 | 0.8 秒 | 1.9 秒 |
Vite の HMR 性能は特に優秀で、リアルタイムに近い反映速度を実現しています。開発中の快適性は格段に向上するでしょう。
パフォーマンステスト結果
総合的なパフォーマンス指標を以下にまとめました:
mermaidflowchart TD
perf["パフォーマンス比較"] -->|CPU使用率| cpu["CPU 使用率"]
perf -->|メモリ使用量| memory["メモリ使用量"]
perf -->|ディスクI/O| disk["ディスク I/O"]
cpu -->|Webpack| cpu_w["75%"]
cpu -->|Vite| cpu_v["45%"]
cpu -->|Rspack| cpu_r["55%"]
memory -->|Webpack| mem_w["850MB"]
memory -->|Vite| mem_v["320MB"]
memory -->|Rspack| mem_r["480MB"]
システムリソース使用量:
指標 | Webpack | Vite | Rspack |
---|---|---|---|
平均 CPU 使用率 | 75% | 45% | 55% |
ピークメモリ使用量 | 850MB | 320MB | 480MB |
平均ディスク I/O | 15MB/s | 8MB/s | 12MB/s |
バッテリー消費 | 高 | 低 | 中 |
Vite は全体的にシステムリソースの使用量が少なく、特にノート PC での開発時にバッテリー持ちの改善が期待できます。
互換性の比較
プラグイン対応状況
各ビルダーのプラグインエコシステムの対応状況を比較します:
プラグインカテゴリ | Webpack | Vite | Rspack |
---|---|---|---|
CSS プリプロセッサ | ★★★ | ★★★ | ★★★ |
TypeScript | ★★★ | ★★★ | ★★★ |
PostCSS | ★★★ | ★★★ | ★★☆ |
ESLint 統合 | ★★★ | ★★☆ | ★★★ |
画像最適化 | ★★★ | ★★☆ | ★★☆ |
Bundle Analyzer | ★★★ | ★★☆ | ★★★ |
Webpack は最も豊富なプラグインエコシステムを持っていますが、Vite と Rspack も主要な機能は十分にカバーしています。
具体的なプラグイン例:
javascript// Webpack での画像最適化
module.exports = {
module: {
rules: [
{
test: /\.(png|jpe?g|gif|svg)$/,
use: [
{
loader: 'image-webpack-loader',
options: {
mozjpeg: { progressive: true },
optipng: { enabled: false },
},
},
],
},
],
},
};
typescript// Vite での画像最適化
import { defineConfig } from 'vite';
import { imageOptimize } from 'vite-plugin-imagemin';
export default defineConfig({
plugins: [
imageOptimize({
gifsicle: { optimizationLevel: 7 },
mozjpeg: { quality: 80 },
}),
],
});
TypeScript サポート
TypeScript との統合における各ビルダーの特徴:
Webpack Builder:
- ts-loader または babel-loader による処理
- 型チェックは別プロセスで実行
- 詳細な設定カスタマイズが可能
javascript// webpack での TypeScript 設定
module.exports = {
module: {
rules: [
{
test: /\.tsx?$/,
use: 'ts-loader',
exclude: /node_modules/,
},
],
},
resolve: {
extensions: ['.tsx', '.ts', '.js'],
},
};
Vite Builder:
- esbuild による高速な型変換
- 型チェックは vite-plugin-checker で対応
- ゼロコンフィグで動作
typescript// vite での TypeScript 設定
import { defineConfig } from 'vite';
import checker from 'vite-plugin-checker';
export default defineConfig({
plugins: [
checker({
typescript: true,
eslint: {
lintCommand: 'eslint "./src/**/*.{ts,tsx}"',
},
}),
],
});
Rspack Builder:
- SWC による高速変換
- Webpack 互換の設定が可能
- 段階的な移行をサポート
CSS プリプロセッサ対応
各ビルダーの CSS プリプロセッサ対応状況:
プリプロセッサ | Webpack | Vite | Rspack |
---|---|---|---|
Sass/SCSS | ★★★ | ★★★ | ★★★ |
Less | ★★★ | ★★★ | ★★☆ |
Stylus | ★★★ | ★★☆ | ★★☆ |
PostCSS | ★★★ | ★★★ | ★★☆ |
CSS Modules | ★★★ | ★★★ | ★★★ |
Styled Components | ★★★ | ★★★ | ★★★ |
Sass 設定例の比較:
javascript// Webpack
module.exports = {
module: {
rules: [
{
test: /\.scss$/,
use: ['style-loader', 'css-loader', 'sass-loader'],
},
],
},
};
typescript// Vite
export default defineConfig({
css: {
preprocessorOptions: {
scss: {
additionalData: `@import "@/styles/variables.scss";`,
},
},
},
});
既存プロジェクトからの移行しやすさ
移行の難易度と必要な作業を比較します:
mermaidflowchart TD
current["既存Webpackプロジェクト"] -->|移行| decision{"移行先選択"}
decision -->|最小変更| rspack["Rspack移行"]
decision -->|最適化重視| vite["Vite移行"]
rspack -->|設定ほぼ流用| rspack_result["★★★ 容易"]
vite -->|設定見直し必要| vite_result["★★☆ 中程度"]
移行工数の目安:
移行先 | 設定変更 | 依存関係 | テスト | 合計工数 |
---|---|---|---|---|
Rspack | 0.5 人日 | 0.5 人日 | 1 人日 | 2 人日 |
Vite | 2 人日 | 1 人日 | 2 人日 | 5 人日 |
Rspack への移行は既存の Webpack 設定をほぼそのまま活用できるため、移行コストが最小限に抑えられます。一方、Vite への移行はより多くの見直しが必要ですが、得られるパフォーマンス向上は大きいでしょう。
実践的な選択基準
プロジェクト規模別の推奨
プロジェクトの規模に応じた最適なビルダー選択指針:
小規模プロジェクト(〜50 コンポーネント):
mermaidflowchart LR
small["小規模プロジェクト"] -->|重視ポイント| factors["起動速度<br/>設定簡素化<br/>開発体験"]
factors -->|推奨| vite_rec["Vite Builder"]
vite_rec -->|理由| vite_why["高速起動<br/>ゼロコンフィグ<br/>モダン開発体験"]
- 推奨: Vite Builder
- 理由: 高速な起動時間と優れた開発体験
- 注意点: 特殊なビルド要件がある場合は要検討
中規模プロジェクト(50〜200 コンポーネント):
- 推奨: Vite Builder または Rspack Builder
- Vite を選ぶ場合: パフォーマンス最優先
- Rspack を選ぶ場合: 既存の Webpack 資産を活用したい
大規模プロジェクト(200 コンポーネント以上):
mermaidflowchart TD
large["大規模プロジェクト"] -->|検討項目| consider["既存資産<br/>チーム習熟度<br/>運用要件"]
consider -->|既存Webpack資産多| webpack_keep["Webpack継続"]
consider -->|パフォーマンス重視| migrate["移行検討"]
migrate -->|段階的移行| rspack_choice["Rspack選択"]
migrate -->|大幅改善| vite_choice["Vite選択"]
- Webpack: 既存の複雑な設定や独自プラグインが多い場合
- Rspack: Webpack 互換性を保ちながら性能向上したい場合
- Vite: 大幅なパフォーマンス改善を求める場合
チーム体制による選択
開発チームの特性に応じた選択指針:
チーム特性 | 推奨ビルダー | 理由 |
---|---|---|
フロントエンド専門チーム | Vite | モダンな開発体験を重視 |
フルスタック混合チーム | Rspack | 学習コストの最小化 |
レガシー保守チーム | Webpack | 既存知識の活用 |
新規プロダクトチーム | Vite | 最新技術の採用 |
チーム移行戦略の例:
javascript// 段階的移行のためのビルダー切り替え設定
module.exports = {
// 開発環境では新しいビルダーを試用
core: {
builder:
process.env.NODE_ENV === 'development'
? '@storybook/builder-vite'
: '@storybook/builder-webpack5',
},
};
パフォーマンス要件による判断
具体的なパフォーマンス要件に基づく選択フローチャート:
mermaidflowchart TD
start["パフォーマンス要件分析"] -->|起動時間| startup{"5秒以内必須?"}
startup -->|Yes| vite_priority["Vite優先検討"]
startup -->|No| build_time{"ビルド時間重視?"}
build_time -->|Yes| compare_build["ビルド性能比較"]
build_time -->|No| compatibility{"互換性重視?"}
compare_build -->|最速必要| vite_build["Vite選択"]
compare_build -->|バランス重視| rspack_build["Rspack選択"]
compatibility -->|Yes| webpack_compat["Webpack/Rspack"]
compatibility -->|No| modern_choice["Vite検討"]
パフォーマンス要件別推奨表:
要件 | 重要度 | Webpack | Vite | Rspack |
---|---|---|---|---|
起動速度 | 高 | ☆☆ | ★★★ | ★★☆ |
HMR 速度 | 高 | ☆☆ | ★★★ | ★★☆ |
ビルド速度 | 中 | ☆☆ | ★★★ | ★★☆ |
メモリ効率 | 中 | ☆ | ★★★ | ★★ |
安定性 | 高 | ★★★ | ★★☆ | ★★☆ |
実際の選択においては、これらの要件に優先順位をつけて、総合的に判断することが重要です。
まとめ
Storybook Builder の選択は、プロジェクトの成功に大きく影響する重要な判断です。各ビルダーの特性を理解し、適切な選択をすることで、開発チームの生産性を大幅に向上させることができるでしょう。
各ビルダーの総合評価:
項目 | Webpack | Vite | Rspack |
---|---|---|---|
パフォーマンス | ★★☆ | ★★★ | ★★☆ |
互換性 | ★★★ | ★★☆ | ★★★ |
学習コスト | ★☆☆ | ★★☆ | ★★★ |
エコシステム | ★★★ | ★★☆ | ★★☆ |
将来性 | ★★☆ | ★★★ | ★★★ |
推奨される選択パターン:
- 新規プロジェクト: Vite Builder で最新の開発体験を
- 既存プロジェクト(移行重視): Rspack Builder で段階的改善を
- 大規模レガシー: Webpack Builder で安定運用を継続
重要なのは、チームの技術レベル、プロジェクト要件、運用体制を総合的に考慮することです。必要に応じて段階的な移行戦略を検討し、リスクを最小化しながら開発体験の向上を図りましょう。
最適なビルダー選択により、より快適で効率的な Storybook 開発環境を構築できることを願っています。
関連リンク
- article
Storybook Builder 徹底比較:Vite vs Webpack vs Rspack の速度と互換性
- article
Storybook が真っ白!起動しない/ビルド失敗の原因と 15 の対処チェック
- article
Storybook アーキテクチャ完全図解:Preview/Manager/Builder が噛み合う瞬間
- article
Storybook で学ぶコンポーネントテスト戦略
- article
Storybook × CI/CD:自動化時代の UI 開発
- article
Vue.js と Storybook:UI 開発の生産性爆上げ術
- article
Lodash クイックレシピ :配列・オブジェクト変換の“定番ひな形”集
- article
Zod クイックリファレンス:`string/number/boolean/date/enum/literal` 速見表
- article
Web Components スタイリング速見表:`::part`/`::slotted`/AdoptedStyleSheets(Constructable Stylesheets)
- article
LangChain LCEL 実用テンプレ 30:map/branch/batch/select の書き方速見表
- article
Vue.js の状態管理比較:Pinia vs Vuex 4 vs 外部(Nanostores 等)実運用レビュー
- article
Jotai クイックリファレンス:atom/read/write/derived の書き方早見表
- blog
iPhone 17シリーズの発表!全モデルiPhone 16から進化したポイントを見やすく整理
- blog
Googleストアから訂正案内!Pixel 10ポイント有効期限「1年」表示は誤りだった
- blog
【2025年8月】Googleストア「ストアポイント」は1年表記はミス?2年ルールとの整合性を検証
- blog
Googleストアの注文キャンセルはなぜ起きる?Pixel 10購入前に知るべき注意点
- blog
Pixcel 10シリーズの発表!全モデル Pixcel 9 から進化したポイントを見やすく整理
- blog
フロントエンドエンジニアの成長戦略:コーチングで最速スキルアップする方法
- review
今の自分に満足していますか?『持たざる者の逆襲 まだ何者でもない君へ』溝口勇児
- review
ついに語られた業界の裏側!『フジテレビの正体』堀江貴文が描くテレビ局の本当の姿
- review
愛する勇気を持てば人生が変わる!『幸せになる勇気』岸見一郎・古賀史健のアドラー実践編で真の幸福を手に入れる
- review
週末を変えれば年収も変わる!『世界の一流は「休日」に何をしているのか』越川慎司の一流週末メソッド
- review
新しい自分に会いに行こう!『自分の変え方』村岡大樹の認知科学コーチングで人生リセット
- review
科学革命から AI 時代へ!『サピエンス全史 下巻』ユヴァル・ノア・ハラリが予見する人類の未来