フロントエンド開発を始めようとしたとき、「開発サーバーの起動が遅い」「ファイルを保存してから反映されるまで時間がかかる」「設定が複雑すぎる」と感じたことはありませんか?
「WebpackやCreate React Appは便利だけど、もっと速くならないの?」「最新の開発体験を味わいたい」と思っている方も多いはずです。
実は、Viteは、次世代のフロントエンドビルドツールで、開発サーバーの起動が一瞬、ホットリロードも超高速、しかもシンプルな設定で使える革新的なツールなんです。まるで、新幹線に乗り換えたように、開発速度が劇的に向上するんですよ。
この記事では、Viteの基本から実践的な使い方まで、フロントエンド初心者の方にも分かりやすく丁寧に解説していきます。
具体的なコマンドやプロジェクト例をたくさん見ながら、最新のフロントエンド開発環境を構築していきましょう!
Viteとは?その基本を知ろう

基本的な説明
Vite(ヴィート)は、モダンなフロントエンド開発のための高速なビルドツールです。
2020年にVue.jsの作者であるEvan You氏によって開発され、瞬く間にフロントエンド界隈で人気を集めました。
名前の由来:
「Vite」はフランス語で「速い」という意味。その名の通り、圧倒的な速さが特徴なんです。
何ができるの?
主な機能:
超高速な開発サーバー:
起動が数秒(大規模プロジェクトでも)、ファイル変更の反映が瞬時。
ホットモジュール置換(HMR):
コードを変更すると、ページをリロードせずに即座に反映されます。
最適化されたビルド:
本番用ビルドは、Rollupベースで高度に最適化されています。
フレームワーク非依存:
React、Vue、Svelte、バニラJSなど、何でも使えます。
プラグインエコシステム:
豊富なプラグインで機能を拡張できます。
TypeScriptネイティブサポート:
設定不要でTypeScriptが使えます。
従来のツールとの違い
Webpack(従来の主流):
- 起動:10秒〜数分
- HMR:数秒かかることも
- 設定:複雑
Create React App(React用):
- 起動:数十秒
- HMR:まあまあ速い
- 設定:カスタマイズが難しい
Vite:
- 起動:1〜2秒
- HMR:ほぼ瞬時
- 設定:シンプル
この差は、プロジェクトが大きくなるほど顕著になります。
日常の例で理解しよう
料理の準備:
Webpack = 食材をすべて下ごしらえしてから調理開始
野菜を全部切って、肉も全部下味をつけて…準備に時間がかかる
Vite = 必要な分だけ都度準備
最初に炒める野菜だけ切って、すぐに調理開始。他は必要になったら準備
Webpackの仕組み:
すべてのファイルをバンドル(まとめる)してから開発サーバーを起動
Viteの仕組み:
ブラウザのネイティブESモジュール機能を使って、必要なファイルだけオンデマンドで読み込む
だから圧倒的に速いんですね。
なぜViteが速いのか
開発時:ESモジュールを活用
従来のバンドラー(Webpack等):
1000個のファイル → すべてバンドル → 開発サーバー起動
(数十秒〜数分かかる)
Vite:
エントリーファイルだけ準備 → 開発サーバー起動(数秒)
↓
ブラウザが必要なファイルをリクエスト
↓
Viteが該当ファイルを変換して返す(瞬時)
ブラウザのimport構文を直接使うので、バンドル不要なんです。
本番ビルド:Rollupで最適化
開発時:
ESモジュール(バンドル不要)
本番ビルド時:
Rollupで最適化してバンドル
開発と本番で異なる戦略を取ることで、両方のメリットを享受しています。
依存関係の事前バンドル
node_modules内のライブラリ:
初回起動時に一度だけ事前バンドル(esbuild使用、超高速)
自分のコード:
オンデマンドで変換
依存ライブラリは変更されないので、キャッシュして再利用できるんですね。
インストール方法
Node.jsのバージョン確認
Viteには、Node.js 14.18+または16+が必要です。
node --version
v14.18.0以上、またはv16以上であればOKです。
プロジェクトの作成(最も簡単)
公式のプロジェクト作成ツール:
npm create vite@latest
対話形式で質問されます:
? Project name: › my-vite-project
? Select a framework: ›
❯ Vanilla
Vue
React
Preact
Lit
Svelte
Others
? Select a variant: ›
❯ TypeScript
JavaScript
フレームワークとバリアント(TypeScript/JavaScript)を選択すると、自動でプロジェクトが作成されます。
フレームワーク別の作成コマンド
すべて一行で指定することもできます:
Vanilla JavaScript:
npm create vite@latest my-app -- --template vanilla
React + TypeScript:
npm create vite@latest my-app -- --template react-ts
Vue 3 + TypeScript:
npm create vite@latest my-app -- --template vue-ts
Svelte:
npm create vite@latest my-app -- --template svelte
プロジェクトのセットアップ
作成されたプロジェクトに移動:
cd my-app
依存関係をインストール:
npm install
開発サーバーを起動:
npm run dev
出力例:
VITE v5.0.0 ready in 315 ms
➜ Local: http://localhost:5173/
➜ Network: use --host to expose
➜ press h + enter to show help
ブラウザでhttp://localhost:5173/を開くと、アプリが表示されます。
起動が速い!わずか数百ミリ秒ですね。
プロジェクト構造を理解する
基本的な構造(React + TypeScript例)
my-app/
├── node_modules/ # 依存パッケージ
├── public/ # 静的ファイル(そのままコピーされる)
│ └── vite.svg
├── src/ # ソースコード
│ ├── App.tsx
│ ├── App.css
│ ├── main.tsx # エントリーポイント
│ └── index.css
├── index.html # HTMLテンプレート(重要!)
├── package.json # プロジェクト設定
├── tsconfig.json # TypeScript設定
└── vite.config.ts # Vite設定
index.html(エントリーポイント)
Viteの特徴:index.htmlがプロジェクトのルートにあり、これがエントリーポイントになります。
index.html:
<!doctype html>
<html lang="ja">
<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Vite + React + TS</title>
</head>
<body>
<div id="root"></div>
<script type="module" src="/src/main.tsx"></script>
</body>
</html>
ポイント:<script type="module">でJavaScript/TypeScriptファイルを直接読み込んでいます。
package.json
主要なスクリプト:
{
"name": "my-app",
"private": true,
"version": "0.0.0",
"type": "module",
"scripts": {
"dev": "vite", // 開発サーバー起動
"build": "tsc && vite build", // 本番ビルド
"preview": "vite preview" // ビルド結果のプレビュー
},
"dependencies": {
"react": "^18.2.0",
"react-dom": "^18.2.0"
},
"devDependencies": {
"@types/react": "^18.2.43",
"@types/react-dom": "^18.2.17",
"@vitejs/plugin-react": "^4.2.1",
"typescript": "^5.2.2",
"vite": "^5.0.0"
}
}
vite.config.ts(設定ファイル)
React用の基本設定:
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'
export default defineConfig({
plugins: [react()],
})
シンプルですね。プラグインを読み込むだけです。
開発サーバーの使い方
起動とオプション
基本的な起動:
npm run dev
ポート番号を指定:
npm run dev -- --port 3000
外部からのアクセスを許可:
npm run dev -- --host
これで、同じネットワーク内の他のデバイスからもアクセスできます。
HTTPSで起動:
npm run dev -- --https
ホットモジュール置換(HMR)
ファイルを編集すると、自動的にブラウザに反映されます。
例:App.tsx を編集
function App() {
return (
<div>
<h1>Hello, Vite!</h1> {/* ここを変更 */}
</div>
)
}
保存すると、ページをリロードせずに即座に変更が反映されます。
Reactの場合:
- 状態(state)も保持されたまま
- フォームに入力した内容も消えない
開発体験が格段に良くなりますね。
環境変数
.envファイルを作成:
VITE_API_URL=https://api.example.com
VITE_APP_TITLE=My Awesome App
重要: 環境変数にはVITE_プレフィックスが必要です。
コードから参照:
const apiUrl = import.meta.env.VITE_API_URL
const title = import.meta.env.VITE_APP_TITLE
console.log(apiUrl) // https://api.example.com
環境別の設定
ファイルを分ける:
.env # すべての環境
.env.local # ローカル(Gitにコミットしない)
.env.development # 開発環境
.env.production # 本番環境
開発時:.env → .env.development → .env.localの順で読み込まれます。
本番ビルド時:.env → .env.production
ビルドとデプロイ
本番用ビルド
ビルド実行:
npm run build
何が起きる?
- TypeScriptのコンパイル(
tsc) - Viteによる本番ビルド(Rollup使用)
distディレクトリに出力
出力例:
vite v5.0.0 building for production...
✓ 34 modules transformed.
dist/index.html 0.45 kB │ gzip: 0.29 kB
dist/assets/index-a1b2c3d4.css 1.23 kB │ gzip: 0.65 kB
dist/assets/index-e5f6g7h8.js 143.21 kB │ gzip: 46.15 kB
✓ built in 1.23s
ビルド結果の確認
プレビューサーバーで確認:
npm run preview
本番環境と同じ状態で動作確認できます。
静的ホスティングへのデプロイ
distディレクトリをデプロイするだけです。
Netlify:
# Netlify CLIをインストール
npm install -g netlify-cli
# デプロイ
netlify deploy --prod --dir=dist
Vercel:
# Vercel CLIをインストール
npm install -g vercel
# デプロイ
vercel --prod
GitHub Pages:
# gh-pagesをインストール
npm install -D gh-pages
# package.jsonにスクリプト追加
"scripts": {
"deploy": "gh-pages -d dist"
}
# デプロイ
npm run deploy
Firebase Hosting:
# Firebase CLIをインストール
npm install -g firebase-tools
# 初期化
firebase init hosting
# デプロイ
firebase deploy
設定のカスタマイズ
vite.config.tsの詳細設定
カスタマイズ例:
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'
import path from 'path'
export default defineConfig({
// プラグイン
plugins: [react()],
// 開発サーバー設定
server: {
port: 3000,
open: true, // 起動時に自動でブラウザを開く
proxy: {
// APIリクエストをプロキシ
'/api': {
target: 'http://localhost:8080',
changeOrigin: true,
rewrite: (path) => path.replace(/^\/api/, '')
}
}
},
// ビルド設定
build: {
outDir: 'dist',
sourcemap: true, // ソースマップを生成
minify: 'terser', // minifyツール('terser' or 'esbuild')
chunkSizeWarningLimit: 1000 // チャンクサイズの警告閾値
},
// パスエイリアス
resolve: {
alias: {
'@': path.resolve(__dirname, './src'),
'@components': path.resolve(__dirname, './src/components'),
'@utils': path.resolve(__dirname, './src/utils')
}
},
// 環境変数の設定
define: {
__APP_VERSION__: JSON.stringify('1.0.0')
}
})
パスエイリアスの使用
設定後、コードで使用:
// 従来
import Button from '../../../components/Button'
// エイリアス使用
import Button from '@components/Button'
パスが短くなって、分かりやすいですね。
TypeScriptの設定も必要:
tsconfig.json:
{
"compilerOptions": {
"baseUrl": ".",
"paths": {
"@/*": ["src/*"],
"@components/*": ["src/components/*"],
"@utils/*": ["src/utils/*"]
}
}
}
プラグインの活用

公式プラグイン
React:
npm install -D @vitejs/plugin-react
import react from '@vitejs/plugin-react'
export default defineConfig({
plugins: [react()]
})
Vue:
npm install -D @vitejs/plugin-vue
import vue from '@vitejs/plugin-vue'
export default defineConfig({
plugins: [vue()]
})
よく使うコミュニティプラグイン
vite-plugin-pwa(PWA対応):
npm install -D vite-plugin-pwa
import { VitePWA } from 'vite-plugin-pwa'
export default defineConfig({
plugins: [
react(),
VitePWA({
registerType: 'autoUpdate',
manifest: {
name: 'My App',
short_name: 'App',
description: 'My awesome app',
theme_color: '#ffffff'
}
})
]
})
vite-plugin-compress(圧縮):
npm install -D vite-plugin-compression
import viteCompression from 'vite-plugin-compression'
export default defineConfig({
plugins: [
react(),
viteCompression({
algorithm: 'gzip',
ext: '.gz'
})
]
})
vite-tsconfig-paths(tsconfig paths対応):
npm install -D vite-tsconfig-paths
import tsconfigPaths from 'vite-tsconfig-paths'
export default defineConfig({
plugins: [react(), tsconfigPaths()]
})
実践例:実際のプロジェクトを作ろう
例1:シンプルなToDoアプリ(React + TypeScript)
プロジェクト作成:
npm create vite@latest todo-app -- --template react-ts
cd todo-app
npm install
src/App.tsx:
import { useState } from 'react'
import './App.css'
interface Todo {
id: number
text: string
completed: boolean
}
function App() {
const [todos, setTodos] = useState<Todo[]>([])
const [input, setInput] = useState('')
const addTodo = () => {
if (input.trim()) {
setTodos([...todos, {
id: Date.now(),
text: input,
completed: false
}])
setInput('')
}
}
const toggleTodo = (id: number) => {
setTodos(todos.map(todo =>
todo.id === id ? { ...todo, completed: !todo.completed } : todo
))
}
const deleteTodo = (id: number) => {
setTodos(todos.filter(todo => todo.id !== id))
}
return (
<div className="App">
<h1>ToDoリスト</h1>
<div className="input-container">
<input
type="text"
value={input}
onChange={(e) => setInput(e.target.value)}
onKeyPress={(e) => e.key === 'Enter' && addTodo()}
placeholder="新しいタスクを入力"
/>
<button onClick={addTodo}>追加</button>
</div>
<ul className="todo-list">
{todos.map(todo => (
<li key={todo.id} className={todo.completed ? 'completed' : ''}>
<input
type="checkbox"
checked={todo.completed}
onChange={() => toggleTodo(todo.id)}
/>
<span>{todo.text}</span>
<button onClick={() => deleteTodo(todo.id)}>削除</button>
</li>
))}
</ul>
</div>
)
}
export default App
実行:
npm run dev
動作するToDoアプリが完成しました!
例2:APIを使うアプリ
プロジェクト作成:
npm create vite@latest weather-app -- --template react-ts
cd weather-app
npm install
npm install axios
src/App.tsx:
import { useState } from 'react'
import axios from 'axios'
import './App.css'
interface WeatherData {
name: string
main: {
temp: number
humidity: number
}
weather: Array<{
description: string
}>
}
function App() {
const [city, setCity] = useState('')
const [weather, setWeather] = useState<WeatherData | null>(null)
const [loading, setLoading] = useState(false)
const [error, setError] = useState('')
const API_KEY = import.meta.env.VITE_WEATHER_API_KEY || 'YOUR_API_KEY'
const fetchWeather = async () => {
if (!city) return
setLoading(true)
setError('')
try {
const response = await axios.get(
`https://api.openweathermap.org/data/2.5/weather?q=${city}&appid=${API_KEY}&units=metric&lang=ja`
)
setWeather(response.data)
} catch (err) {
setError('天気情報の取得に失敗しました')
} finally {
setLoading(false)
}
}
return (
<div className="App">
<h1>天気予報アプリ</h1>
<div className="search-box">
<input
type="text"
value={city}
onChange={(e) => setCity(e.target.value)}
onKeyPress={(e) => e.key === 'Enter' && fetchWeather()}
placeholder="都市名を入力"
/>
<button onClick={fetchWeather} disabled={loading}>
{loading ? '取得中...' : '検索'}
</button>
</div>
{error && <p className="error">{error}</p>}
{weather && (
<div className="weather-info">
<h2>{weather.name}</h2>
<p className="temp">{Math.round(weather.main.temp)}°C</p>
<p>{weather.weather[0].description}</p>
<p>湿度: {weather.main.humidity}%</p>
</div>
)}
</div>
)
}
export default App
.env(環境変数):
VITE_WEATHER_API_KEY=your_openweathermap_api_key
APIを使ったアプリも簡単に作れますね。
例3:CSS Modulesを使う
src/Button.module.css:
.button {
padding: 10px 20px;
background-color: #4CAF50;
color: white;
border: none;
border-radius: 4px;
cursor: pointer;
font-size: 16px;
}
.button:hover {
background-color: #45a049;
}
.button.primary {
background-color: #2196F3;
}
.button.primary:hover {
background-color: #0b7dda;
}
src/Button.tsx:
import styles from './Button.module.css'
interface ButtonProps {
children: React.ReactNode
variant?: 'default' | 'primary'
onClick?: () => void
}
function Button({ children, variant = 'default', onClick }: ButtonProps) {
const className = variant === 'primary'
? `${styles.button} ${styles.primary}`
: styles.button
return (
<button className={className} onClick={onClick}>
{children}
</button>
)
}
export default Button
使用:
<Button>通常ボタン</Button>
<Button variant="primary">プライマリボタン</Button>
CSS Modulesは、Viteでそのまま使えます。設定不要です!
トラブルシューティング
問題1:ポートが既に使用されている
症状:
Port 5173 is in use, trying another one...
解決策:
別のポートを指定:
npm run dev -- --port 3000
設定ファイルで変更:
export default defineConfig({
server: {
port: 3000
}
})
問題2:node_modulesの依存関係エラー
症状:
Error: Cannot find module 'some-package'
解決策:
依存関係を再インストール:
rm -rf node_modules package-lock.json
npm install
キャッシュをクリア:
rm -rf node_modules/.vite
npm run dev
問題3:本番ビルドでパスが正しくない
症状:
デプロイすると、ファイルが404になる。
原因:
ベースパスの設定が必要。
解決策:
vite.config.ts:
export default defineConfig({
base: '/my-project/' // GitHub Pagesなど、サブディレクトリにデプロイする場合
})
ルートにデプロイする場合は:
base: '/'
問題4:環境変数が読み込まれない
原因:VITE_プレフィックスがない。
解決策:
.env:
# 誤り
API_KEY=xxx
# 正しい
VITE_API_KEY=xxx
コード:
// 誤り
const key = import.meta.env.API_KEY
// 正しい
const key = import.meta.env.VITE_API_KEY
問題5:TypeScriptのパスエイリアスが効かない
解決策:
vite-tsconfig-pathsをインストール:
npm install -D vite-tsconfig-paths
vite.config.ts:
import tsconfigPaths from 'vite-tsconfig-paths'
export default defineConfig({
plugins: [react(), tsconfigPaths()]
})
パフォーマンス最適化
コード分割
動的インポートを使う:
import { lazy, Suspense } from 'react'
// 遅延読み込み
const Dashboard = lazy(() => import('./pages/Dashboard'))
const Settings = lazy(() => import('./pages/Settings'))
function App() {
return (
<Suspense fallback={<div>Loading...</div>}>
<Routes>
<Route path="/dashboard" element={<Dashboard />} />
<Route path="/settings" element={<Settings />} />
</Routes>
</Suspense>
)
}
ページごとに分割されて、必要なときだけ読み込まれます。
プリフェッチ
vite.config.ts:
export default defineConfig({
build: {
modulePreload: {
polyfill: true
}
}
})
イメージの最適化
vite-plugin-imagemin:
npm install -D vite-plugin-imagemin
import viteImagemin from 'vite-plugin-imagemin'
export default defineConfig({
plugins: [
react(),
viteImagemin({
gifsicle: { optimizationLevel: 7 },
optipng: { optimizationLevel: 7 },
mozjpeg: { quality: 80 },
svgo: { plugins: [{ removeViewBox: false }] }
})
]
})
よくある質問
Q1: WebpackからViteに移行すべき?
A: 新しいプロジェクトなら、絶対にViteがおすすめです。
既存のプロジェクトは、規模や複雑さによります:
- 小〜中規模:移行を検討する価値あり
- 大規模で複雑な設定:慎重に判断
メリット: 開発体験が劇的に向上
デメリット: 移行コストがかかる
Q2: Create React AppとViteの違いは?
A:
Create React App:
- Webpack使用
- 起動が遅い(大規模プロジェクトだと数分)
- カスタマイズが難しい(ejectが必要)
- Reactに特化
Vite:
- ESモジュール + Rollup使用
- 起動が超高速(数秒)
- 設定が簡単
- フレームワーク非依存
Viteの方が、現代的で柔軟性が高いです。
Q3: 本番環境でもESモジュールを使う?
A: いいえ、本番ビルドではバンドルされます。
- 開発時: ESモジュール(バンドル不要)
- 本番時: Rollupでバンドル(最適化)
ブラウザ互換性や性能のため、本番では従来のバンドル方式を使います。
Q4: IEはサポートされる?
A: Vite 3以降、IE11はサポート外です。
モダンブラウザ(Chrome、Firefox、Safari、Edge)が対象です。
IE11が必要な場合は、Webpackなど別のツールを使いましょう。
Q5: TypeScript設定は不要?
A: 基本的には不要です。そのまま使えます。
.tsや.tsxファイルを作るだけで、自動的にTypeScriptとして処理されます。
細かい設定はtsconfig.jsonでカスタマイズできます。
まとめ
Viteは、次世代のフロントエンド開発ツールで、圧倒的な速さとシンプルな設定が魅力の革新的なビルドツールです。
この記事のポイント:
- Viteは開発サーバー起動が超高速(数秒)
- ホットリロードがほぼ瞬時で開発体験が最高
- ESモジュールを活用した革新的なアーキテクチャ
- React、Vue、Svelte等あらゆるフレームワークに対応
- 設定がシンプルで初心者にも優しい
- TypeScriptがそのまま使える
- 本番ビルドはRollupで高度に最適化
- 豊富なプラグインエコシステム
- 環境変数は
VITE_プレフィックスが必要 - 静的ホスティングに簡単デプロイ可能
Viteを使うと、開発速度が劇的に向上します。ファイルを保存してから反映されるまでの待ち時間がほぼゼロなので、集中力を保ったまま開発できるんです。
WebpackやCreate React Appに慣れている方は、最初は戸惑うかもしれませんが、一度Viteを使うと、もう戻れなくなりますよ。
まずはnpm create vite@latestでプロジェクトを作って、その速さを体感してみてください。新しいフロントエンド開発の世界が待っています!
Viteをマスターして、快適で生産的なフロントエンド開発を楽しんでいきましょう!


コメント