Vite Buildの概要
今までなんとなくで使っていたBuildって何してるんだっけー
なんのためにBuildが行われているのか
私たちが書いたソースコードを、Webブラウザが効率的かつ正確に動作するように変換・最適化するため。ブラウザが理解し、効率的に実行できる『実行可能ファイル』を作成するため。
Buildすると何が起こるのか? (ビルドプロセス)
ざっくり、、主に5つのことが行われる。
- トランスパイル(Transpile)
- JavaScript(ES6以降)、TypeScript、JSXなどの構文を、より広くブラウザがサポートしているJavaScript(主にES5)に変換
- バンドル(Bundle)
- アプリケーションを構成する複数のJavascriptファイル、CSSファイルなどのアセットファイルを最終的にブラウザがロードする少数の大きなファイルに結合
- ミニファイ/ 圧縮(Minify/Comperess)
- バンドルされたコードから、空白、改行を削除しファイルサイズを削減
- 最適化(Optimize)
- デッドコードを最終的なバンドルから削除 (ツリーシェイキング)
- 画像の圧縮, WebPなどへ変換。リサイズを行いファイルサイズを削減
- アセットの処理とハッシュ化
- 画像、フォント、その他の性的なアセットを適切に処理、ファイル名にユニークなハッシュ値を追加する。hoge.png → hoge.1wfu3sa.png
こららのプロセスを、一つずつ私たちが行うのは複雑で時間もかかるため、「ビルドツール」によって自動化されている。便利だ〜
Viteとは?
フロントエンドビルドツール。Viteは大きく2つの主要な部分で構成されている。
- 非常に高速な開発サーバー(ネイティブ ES モジュール(ESM)と esbuild の活用)
- Rollup でコードをバンドルするビルドコマンド(プロダクションビルド)
ESM、esbuildとは何なのか、なぜ高速なのか、Rollupとは、、を見ていく
ESM(ECMAScript Modules)
ECMAScriptに公式に組み込まれたモジュールシステムのこと。JavaScriptのコードをモジュールに分割し、お互いにimport,exportして連携させるための標準的な方法を提供する。かつてJavaScriptには公式のモジュールシステムがなく、CommonJSなどモジュールシステムが誕生し、環境ごとで独自の書き方が必要だった。こうした問題を解決し、ブラウザとNode.jsの両方で統一的に使えるモジュールシステムとして導入された。
- ESMの特徴
- import と export キーワードを使うことができる。(今まで何気に使っていた、export, importってESMのおかげだったんだ、、、)
- HTMLの <script type="module"> を使うことで、JavaScript ファイルをモジュールとして直接ブラウザに読み込ませることができる。
// math.js (エクスポート)
export function add(a, b) {
return a + b;
}
// main.js (インポート)
import { add } from './math.js';
console.log(add(1, 2)); // 3
esbuild
ビルドプロセスの,トランスパイル、バンドル、ミニファイを行う。
なぜ esbuild はなぜ速いのか by gemini
(とにかく速いらしい、、)
Go言語で記述されている: Go言語は、JavaScriptなどのスクリプト言語よりも低レベルで、コンパイルされたコードは非常に高速に実行されます。また、Go言語の並行処理の機能(ゴルーチンなど)を最大限に活用しており、複数の処理を同時に効率的に実行できます。
ゼロ依存性: 外部ライブラリへの依存がほとんどなく、これにより軽量で高速な起動が可能です。
単一パス処理: 多くの処理を一度のパス(読み込み)で行うように設計されており、ファイルの読み書きや解析のオーバーヘッドを最小限に抑えています。
なぜViteは高速なのか?(ESMとesbuildの連携)
上の方の、
- 非常に高速な開発サーバー(ネイティブ ES モジュール(ESM)と esbuild の活用)
Viteが速い開発理由は、ESMのネイティブサポートとesbuildの連携させているから。
- ESMの活用
- Viteの開発サーバーは、ソースコードをESMとしてブラウザに直接提供する。ブラウザがESMを理解できるため、Viteは開発時に大規模なバンドル処理を行う必要がない。
- ブラウザはHTMLの<script type="module">を読み込み、そこからimport文をたどって必要なモジュールをオンデマンドでVite開発サーバーにリクエストする。
ということをしていて、プラスしてesbuildを組み合わせることでさらに早くなってるってことっぽい
Rollup
Rollupは、JavaScriptのモジュールバンドラーの一つで、特にJavaScriptライブラリやアプリケーションのコードを効率的にバンドルすることに特化している。
- ViteにおけるRollupの役割
プロダクション環境向けのビルドを生成する際に、モジュールバンドラーであるRollupをメインのバンドラーとして内部的に使用している。
なんで、プロダクションビルドでesbuildを利用しないのかなって思ったけど、ここに書いてあった。
esbuildは非常に高速ですが、Viteが採用しているRollupのプラグインAPIほど柔軟ではないとのこと。
Rolldownと呼ばれる、Rollup の Rust ポートを構築する取り組みが進行中。
へー。
最後に
今まで「なんとなく」buildしてたけど、少し言語化できた気もする。
次は、コードを紐解いて深く見ていきたい。
Discussion