Viteの概要と基本概念を理解しよう
Viteの概要と基本概念を理解しよう
Viteは、モダンなフロントエンド開発のための次世代ビルドツールです。従来のビルドツールと比較して、開発サーバーの起動が非常に高速で、ホットモジュールリプレースメント(HMR)も瞬時に反映される特徴があります。
本記事では、Viteの基本概念と特徴について詳しくまとめました。
Viteとは
Vite(フランス語で「速い」という意味)は、Evan You(Vue.jsの作者)によって開発された、モダンなフロントエンド開発のためのビルドツールです。
従来のWebpackやRollupなどのビルドツールとは異なるアプローチで、開発体験を大幅に向上させます。
主な特徴
- 超高速な開発サーバー: ネイティブESMを活用した即座の起動
- 瞬時のHMR: 変更が即座に反映されるホットモジュールリプレースメント
- 最適化されたビルド: 本番環境ではRollupを使用した最適化されたバンドル
- 豊富なテンプレート: Vue、React、Svelte、Vanilla JSなどに対応
- TypeScriptサポート: 設定不要でTypeScriptをサポート
- プラグインエコシステム: 豊富なプラグインで機能拡張が可能
Viteの基本概念
1. 開発サーバーとプロダクションビルドの分離
Viteは、開発時と本番ビルド時で異なるアプローチを取ります。
開発時:
- ネイティブESM(ES Modules)を直接ブラウザに提供
- 依存関係は事前にバンドル(esbuildを使用)
- ソースコードは必要に応じて変換
本番ビルド時:
- Rollupを使用した最適化されたバンドル
- コード分割、ツリーシェイキング、ミニファイなど
2. ネイティブESMの活用
Viteは、モダンブラウザのネイティブESMサポートを活用します。
// 開発時、ブラウザが直接ESMを読み込む
import { createApp } from 'vue'
import App from './App.vue'
createApp(App).mount('#app')
3. 依存関係の事前バンドル
開発サーバー起動時に、node_modules内の依存関係をesbuildで事前にバンドルします。
これにより、開発サーバーの起動が高速化されます。
プロジェクトの作成
Viteプロジェクトは、公式のスキャフォールディングツールで簡単に作成できます。
Vueプロジェクトの作成
npm create vite@latest my-vue-app -- --template vue
cd my-vue-app
npm install
npm run dev
Reactプロジェクトの作成
npm create vite@latest my-react-app -- --template react
cd my-react-app
npm install
npm run dev
TypeScriptテンプレート
npm create vite@latest my-app -- --template vue-ts
npm create vite@latest my-app -- --template react-ts
ディレクトリ構造
Viteプロジェクトの典型的なディレクトリ構造は以下の通りです。
project/
├── public/ # 静的ファイル
├── src/ # ソースコード
│ ├── assets/ # アセット(画像、CSSなど)
│ ├── components/ # コンポーネント
│ ├── App.vue # ルートコンポーネント
│ └── main.js # エントリーポイント
├── index.html # HTMLエントリーポイント
├── vite.config.js # Vite設定ファイル
└── package.json
設定ファイル
vite.config.js
Viteの設定はvite.config.js(またはvite.config.ts)で行います。
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
export default defineConfig({
plugins: [vue()],
// 開発サーバー設定
server: {
port: 3000,
open: true,
proxy: {
'/api': {
target: 'http://localhost:8080',
changeOrigin: true
}
}
},
// ビルド設定
build: {
outDir: 'dist',
sourcemap: true,
rollupOptions: {
output: {
manualChunks: {
vendor: ['vue', 'vue-router']
}
}
}
},
// パスエイリアス
resolve: {
alias: {
'@': '/src'
}
}
})
TypeScript設定
TypeScriptを使用する場合、tsconfig.jsonでパスエイリアスを設定できます。
{
"compilerOptions": {
"target": "ES2020",
"useDefineForClassFields": true,
"module": "ESNext",
"lib": ["ES2020", "DOM", "DOM.Iterable"],
"skipLibCheck": true,
"moduleResolution": "bundler",
"allowImportingTsExtensions": true,
"resolveJsonModule": true,
"isolatedModules": true,
"noEmit": true,
"jsx": "preserve",
"strict": true,
"noUnusedLocals": true,
"noUnusedParameters": true,
"noFallthroughCasesInSwitch": true,
"baseUrl": ".",
"paths": {
"@/*": ["src/*"]
}
},
"include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue"],
"references": [{ "path": "./tsconfig.node.json" }]
}
主要機能
1. 環境変数
Viteは、.envファイルから環境変数を読み込みます。
# .env
VITE_API_URL=https://api.example.com
VITE_APP_TITLE=My App
// コード内で使用
const apiUrl = import.meta.env.VITE_API_URL
const appTitle = import.meta.env.VITE_APP_TITLE
2. 静的アセットのインポート
Viteは、静的アセットをインポートできます。
import logo from './assets/logo.png'
import styles from './styles.css'
3. CSSの処理
Viteは、CSS、SCSS、Less、Stylusなどをサポートしています。
// main.js
import './styles/main.css'
import './styles/variables.scss'
4. プラグインシステム
Viteは豊富なプラグインエコシステムを持っています。
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import vueJsx from '@vitejs/plugin-vue-jsx'
import { VitePWA } from 'vite-plugin-pwa'
export default defineConfig({
plugins: [
vue(),
vueJsx(),
VitePWA({
registerType: 'autoUpdate'
})
]
})
パフォーマンスの特徴
開発サーバーの起動速度
従来のビルドツール(Webpackなど)と比較して、Viteの開発サーバーは非常に高速です。
- Webpack: 数秒〜数十秒かかる場合がある
- Vite: 通常1秒以内で起動
HMRの速度
ViteのHMRは、変更されたモジュールのみを更新するため、非常に高速です。
// コンポーネントを変更すると、即座に反映される
// ページ全体のリロードは不要
HMR(Hot Module Replacement)とは
HMRは、アプリケーションの実行中にモジュールを追加・削除・置き換えることができる機能です。
従来の開発では、コードを変更するたびにページ全体をリロードする必要がありましたが、HMRを使用することで、変更された部分のみを更新できます。
ViteのHMRの仕組み
- ファイル変更の検知: Viteはファイルシステムの変更を監視し、ファイルが変更されると即座に検知します
- 変更されたモジュールの特定: 変更されたファイルとその依存関係を特定します
- モジュールの更新: WebSocket経由でブラウザに変更を通知し、該当モジュールのみを更新します
- 状態の保持: アプリケーションの状態(変数の値、フォームの入力内容など)を保持したまま更新されます
フレームワーク別のHMR対応
Viteは、各フレームワークに最適化されたHMRを提供します。
Vue.js:
<!-- コンポーネントを変更すると、コンポーネントの状態を保持したまま更新される -->
<template>
<div>
<p>カウント: {{ count }}</p>
<button @click="increment">+1</button>
</div>
</template>
<script setup>
import { ref } from 'vue'
const count = ref(0)
const increment = () => count.value++
</script>
React:
// React Fast Refreshにより、コンポーネントの状態を保持したまま更新される
import { useState } from 'react'
function Counter() {
const [count, setCount] = useState(0)
return (
<div>
<p>カウント: {count}</p>
<button onClick={() => setCount(count + 1)}>+1</button>
</div>
)
}
HMRの利点
- 開発効率の向上: ページリロードが不要なため、開発速度が向上します
- 状態の保持: フォーム入力やスクロール位置などの状態が保持されます
- 即座の反映: 変更が即座に反映されるため、フィードバックループが短縮されます
- デバッグの容易さ: エラーが発生した場合も、状態を保持したまま修正できます
HMRが動作しない場合
一部の変更では、HMRではなくページ全体のリロードが必要な場合があります:
- HTMLファイル(
index.html)の変更 - Vite設定ファイル(
vite.config.js)の変更 - グローバルなCSSファイルの追加・削除
- プラグインの追加・削除
これらの変更は、開発サーバーの再起動が必要になります。
他のビルドツールとの比較
Webpackとの比較
| 項目 | Webpack | Vite |
|---|---|---|
| 開発サーバー起動 | 遅い | 非常に速い |
| HMR | 中程度 | 非常に速い |
| 設定の複雑さ | 複雑 | シンプル |
| バンドルサイズ | 大きい | 最適化されている |
Create React Appとの比較
Create React Appは、Webpackを使用しているため、Viteと比較して開発サーバーの起動が遅いです。
Viteを使用することで、開発体験が大幅に向上します。
実践的な使用例
Vue 3 + TypeScript + Vite
npm create vite@latest my-app -- --template vue-ts
React + TypeScript + Vite
npm create vite@latest my-app -- --template react-ts
カスタムテンプレートの使用
npm create vite@latest my-app -- --template vanilla-ts
NuxtやVueプロジェクトでのViteの扱い
NuxtプロジェクトでのVite
Nuxt 3では、Viteがデフォルトのビルドツールとして採用されています。
そのため、Nuxt 3プロジェクトでは、Viteを直接意識する必要は基本的にありません。
# Nuxt 3プロジェクトの作成(内部でViteが使用される)
npx nuxi@latest init my-nuxt-app
Nuxt 3では、Viteの設定はnuxt.config.ts内で行います:
export default defineNuxtConfig({
vite: {
// Vite固有の設定をここに記述
server: {
port: 3000
},
build: {
// ビルド設定
}
}
})
Nuxt 2では、デフォルトでWebpackが使用されますが、@nuxtjs/viteモジュールを使用することでViteに切り替えることができます。
Vue CLIプロジェクトでのVite
Vue CLI(vue create)で作成されたプロジェクトは、デフォルトでWebpackを使用します。
Viteに移行する場合は、以下の選択肢があります:
-
新規プロジェクトを作成:
npm create vite@latestを使用してViteベースのプロジェクトを作成 - 既存プロジェクトを移行: 手動でViteに移行する(設定ファイルの書き換えが必要)
通常の開発でViteを意識する必要があるか?
意識する必要がある場合
-
Viteを直接使用するプロジェクト:
npm create vite@latestで作成したプロジェクト -
カスタムビルド設定が必要な場合:
vite.config.jsで詳細な設定を行う場合 - Viteプラグインを使用する場合: 特定のプラグインの設定や使用方法を理解する必要がある場合
- パフォーマンス最適化: ビルドの最適化や開発サーバーの設定を調整する場合
意識する必要がない場合
- Nuxt 3プロジェクト: Viteが内部で使用されているが、通常の開発では意識する必要がない
- フレームワークの標準機能を使用する場合: フレームワークが提供する機能のみを使用する場合
- 基本的な開発作業: コンポーネントの作成やルーティングなど、フレームワークの標準機能を使用する場合
まとめ
- Nuxt 3: Viteがデフォルトで使用されるが、通常の開発では直接意識する必要はない
- Vue CLI: Webpackがデフォルト。Viteを使用する場合は新規プロジェクト作成時に選択するか、移行が必要
-
Vite直接使用:
npm create vite@latestで作成したプロジェクトでは、Viteの設定を理解する必要がある
基本的には、フレームワーク(Nuxt 3など)を使用している場合は、フレームワークの設定に従って開発を進めればよく、Viteの詳細を理解する必要はありません。
ただし、カスタムビルド設定やパフォーマンス最適化が必要な場合は、Viteの設定を理解しておくと便利です。
まとめ
Viteは、モダンなフロントエンド開発のための次世代ビルドツールです。
開発サーバーの起動速度とHMRの速度が非常に速く、開発体験を大幅に向上させます。
特に以下のような場面でViteの真価を発揮します:
- 高速な開発体験を求めるプロジェクト
- モダンなフレームワーク(Vue、React、Svelteなど)を使用するプロジェクト
- TypeScriptを使用するプロジェクト
- シンプルな設定で始めたいプロジェクト
Viteを学ぶことで、より快適で効率的なフロントエンド開発が可能になります。
Discussion