5
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

WebpackからViteに移行するとどのくらい速くなるのか

Last updated at Posted at 2024-10-17

この記事を3行で

  • Viteの速さの秘訣と、webpackと比較してどのくらい速くなるか比較
  • ホットリロードの時間は87%削減、開発サーバーの立ち上げ時間は89%削減、ビルドの時間は74%削減できた
  • 今回対象のSPAにおいてFCP(First Contentful Paint)は速くならなかった

はじめに

2019年にCreate React App(CRA)で作成された大規模Webアプリケーション(SPA)をViteに移行したら、めちゃくちゃ速くなりました。何がどのくらい速くなったのか、なぜ速くなったのかを見ていきましょう!

前提条件

  • vite: v5.3.4
  • webpack: v4.44.2
  • react-scripts: v4.0.3
  • 開発規模
    • 全体で95画面
    • src以下のコード 74,771行
    • src以下のファイル 1,156個

ホットモジュールリロード

webpack: 8秒 → vite: 1秒

なんでこんなに速いの?

ネイティブ ESMが速さの秘訣です!
最近のブラウザはES modulesのコードを直接実行できるから、viteはバンドルせずにブラウザに渡しています。
なので、コードが変更されたモジュールだけをブラウザに再送信するだけで良いのです!
変更されてないモジュールのリクエストには304 Not Modified ヘッダー使ってキャッシュすることで高速化しています!

webpackは変更されたモジュールと他のモジュールをバンドルしてブラウザに渡しているので、コードが大きければ大きいほど遅くなってしまいます。

開発サーバーの立ち上げ

初回 webpack: 92.6秒 → vite: 9.5秒
2回目 webpack: 30.2秒 → vite: 6.3秒

  • 上:webpack 下:vite (初回)
    webpack_first.jpg
    vite_first.jpg

  • 上:webpack 下:vite (2回目)
    webpack_second.jpg
    vite_second.jpg

なんでこんなに速いの?

バンドル戦略が速さの秘訣です!
npmパッケージなどの依存関係は事前にバンドルしておいて、私たちが書くソースコードはバンドルしません。webpackは全てバンドルするけどviteはしません!
そして、ルーティングなどによって必要になるモジュールのみを処理する事で開発サーバーの立ち上げを高速にしているのです!

ビルド

webpack: 1分13.70秒 → vite: 18.527秒

上:webpack 下:vite
webpack_build.jpg
vite_build.jpg

なんでこんなに速いの?

Rollupを使ってることが速さの秘訣です!RollupはTree-shakingとコード分割を効率的に行いつつ、使ってないコードを削除することでビルド時間を大幅に短縮しています!

速くならなかったもの

今回対象のSPAにおいてFCP(First Contentful Paint)は速くなりませんでした。
理由は、Viteのデフォルト設定ではSPAのchunk分割が最適化されていなかったのです。
ただ、Viteでchunk分割をマニュアルで設定することは簡単なので、Dynamic importと組み合わせたchunk戦略を使えばFCPも改善できます!

5
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?