0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Vite環境変数ファイルの読み込まれ方について

Last updated at Posted at 2026-01-18

■はじめに

Viteを使って「ローカル」「dev」「本番」の3つの環境変数を使い分ける方法について、調べて見たので備忘録として残します。

■環境

  • "vite": "^7.2.4”
  • "react": "^19.2.0"

■Viteプロジェクトのセットアップ

◆プロジェクト作成

# Viteプロジェクトを作成
npm create vite@latest vite-real-estate -- --template react-ts

# プロジェクトに移動
cd vite-real-estate

# 依存関係をインストール
npm install

# 初回起動
npm run dev

プロジェクトをセットアップします。

vite.config.tsですべてのViteの設定を管理します。

Viteでは、index.htmlがルートにあります。

CreateReactAppで作成した場合は、違う場所にルートのindex.htmlファイルがあります。

■環境変数による環境分離

◆なぜ環境を分離するの?

よくある混乱として、npm run devで起動したけど、どのAPIに繋がってる?

ローカル?dev環境?かわからなくなることです。

また、APIの向き先は「local(ローカル環境)」「dev(staging環境)」「prod(本番環境)」で違います。

そこで、envファイルを分けて、コマンド名で明確にわかるようにします。

例えば、以下のような感じです。

  • npm run dev → local-devモード → localhost:8000(localのAPIを叩く)
  • npm run dev:remote → developmentモード → dev-api.example.com(devのAPIを叩く)
  • npm run build → productionモード → api.example.com(本番のAPIを叩く)

今回は、以下のようなenvファイルの構成にします。

vite-real-estate/
├── .env                    # 全環境共通
├── .env.development        # ローカル開発専用
├── .env.staging            # dev(staging)環境専用
├── .env.production         # 本番環境専用
└── .gitignore

◆環境変数ファイルを作成

.envファイルは、全環境で共通で読み込まれます。

そこで、アプリ名やバージョンなど環境に依存しない環境変数を定義します。

# .env(全環境で共通の設定)
VITE_APP_NAME=〇〇アプリ
VITE_VERSION=1.0.0

.env.developmentはローカル開発専用で使う環境変数を定義します。

# .env.development(ローカル開発専用)
VITE_API_URL=http://localhost:8000
VITE_ENV_NAME=ローカル環境
VITE_DEBUG=true

staging環境のAPIなどを環境変数として持つ.env.stagingファイルを作成します。

staging環境は「本番に近い環境でテストできる場所」で「デプロイ前の最終確認」を行います。

# .env.staging(dev・staging環境)
VITE_API_URL=https://dev-api.example.com
VITE_ENV_NAME=開発環境
VITE_DEBUG=true

.env.productionは、実際のユーザーが使うAPI定義などをするファイルです。

DEBUG=falseにすることで、内部情報を表示しないや、不要なログを出さない設定をします。

# .env.production(本番環境用)
VITE_API_URL=https://api.example.com
VITE_ENV_NAME=本番環境
VITE_DEBUG=false

◆package.jsonのスクリプト設定

ローカル、dev、本番で環境を分けるためのscriptsをpackage.jsonに追加します。

各コマンドの意味は、以下になります。

  • dev系:HMR有効、ソースコードをそのまま実行
  • build系:ビルド・バンドル・圧縮・最適化してdistディレクトリ配下に出力
  • preview系:build後のdistフォルダを静的サーバーで確認
コマンド モード 読み込む環境変数ファイル 用途
npm run dev development .env + .env.development ローカル開発サーバー
npm run dev:staging staging .env + .env.staging staging環境変数で開発サーバー
npm run build production .env + .env.production 本番用ビルド
npm run build:staging staging .env + .env.staging staging用ビルド
npm run preview production .env + .env.production or env.staging ビルド結果をローカルでプレビュー
npm run previewを実行する前に、npm run buildを実行するか、npm run build:stagingを実行するかで変わる。
{
  "name": "vite-real-estate",
  "private": true,
  "version": "1.0.0",
  "type": "module",
  "scripts": {
		"dev": "vite",
		"dev:staging": "vite --mode staging",
		"build": "vite build",
		"build:staging": "vite build --mode staging",
		"preview": "vite preview",
	},
}

機密情報を守るためにenvファイルは.gitignoreに追加した方がいいです。

代わりに.env.staging.exampleや、.env.production.exampleなどテンプレートファイルを作成して、これをgit管理する方が良いです。
テンプレートファイルには、VITE_API_URL=など変数名だけ記載して、中身は書かないように注意が必要です。

本番の機密情報はCI/CD(Vercel, Netlify, SecretManager等)の環境変数設定で管理するのがより安全だと思います。

ファイル 内容 gitignore
.env 公開可能な共通設定 しない
.env.development ローカルAPIパスのみ しなくてもOK
.env.staging stagingのAPIキー等 する
.env.production 本番のAPIキー等 する

■環境情報を表示するコンポーネントを作成と、動作確認

環境情報ごとの表示するためのコンポーネントを作成します。

  • src/App.tsx

    import './App.css';
    
    function App() {
    	// 環境変数を取得
    	const env = import.meta.env;
    	const apiUrl = env.VITE_API_URL;
    	const envName = env.VITE_ENV_NAME;
    	const appName = env.VITE_APP_NAME;
    	const version = env.VITE_VERSION;
    	const showDebug = env.VITE_DEBUG === 'true';
    
    	return (
    		<div
    			style={{
    				padding: '20px',
    				maxWidth: '1200px',
    				margin: '0 auto',
    				fontFamily: 'system-ui, -apple-system, sans-serif',
    			}}
    		>
    			{/* ヘッダー */}
    			<div
    				style={{
    					background: 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)',
    					color: 'white',
    					padding: '30px',
    					borderRadius: '10px',
    					marginBottom: '30px',
    					boxShadow: '0 4px 6px rgba(0,0,0,0.1)',
    				}}
    			>
    				<h1 style={{ margin: '0 0 10px 0' }}>{appName}</h1>
    				<h2 style={{ margin: 0, fontWeight: 'normal', opacity: 0.9 }}>
    					{envName} (v{version})
    				</h2>
    			</div>
    
    			{/* デバッグ情報 */}
    			{showDebug && (
    				<div
    					style={{
    						background: '#fff3cd',
    						padding: '20px',
    						borderRadius: '8px',
    						marginBottom: '30px',
    						border: '2px solid #ffc107',
    						boxShadow: '0 2px 4px rgba(0,0,0,0.1)',
    					}}
    				>
    					<h3 style={{ marginTop: 0, display: 'flex', alignItems: 'center' }}>🔍 環境情報</h3>
    					<table
    						style={{
    							width: '100%',
    							borderCollapse: 'collapse',
    							background: 'white',
    							borderRadius: '5px',
    							overflow: 'hidden',
    						}}
    					>
    						<tbody>
    							<tr>
    								<td
    									style={{
    										padding: '12px',
    										border: '1px solid #ddd',
    										fontWeight: 'bold',
    										background: '#f8f9fa',
    									}}
    								>
    									モード
    								</td>
    								<td style={{ padding: '12px', border: '1px solid #ddd' }}>
    									<code
    										style={{
    											background: '#e9ecef',
    											padding: '2px 8px',
    											borderRadius: '3px',
    										}}
    									>
    										{env.MODE}
    									</code>
    								</td>
    							</tr>
    							<tr>
    								<td
    									style={{
    										padding: '12px',
    										border: '1px solid #ddd',
    										fontWeight: 'bold',
    										background: '#f8f9fa',
    									}}
    								>
    									API URL
    								</td>
    								<td style={{ padding: '12px', border: '1px solid #ddd' }}>{apiUrl}</td>
    							</tr>
    							<tr>
    								<td
    									style={{
    										padding: '12px',
    										border: '1px solid #ddd',
    										fontWeight: 'bold',
    										background: '#f8f9fa',
    									}}
    								>
    									環境名
    								</td>
    								<td style={{ padding: '12px', border: '1px solid #ddd' }}>{envName}</td>
    							</tr>
    							<tr>
    								<td
    									style={{
    										padding: '12px',
    										border: '1px solid #ddd',
    										fontWeight: 'bold',
    										background: '#f8f9fa',
    									}}
    								>
    									本番ビルド
    								</td>
    								<td style={{ padding: '12px', border: '1px solid #ddd' }}>
    									{env.PROD ? '✅ はい' : '❌ いいえ'}
    								</td>
    							</tr>
    							<tr>
    								<td
    									style={{
    										padding: '12px',
    										border: '1px solid #ddd',
    										fontWeight: 'bold',
    										background: '#f8f9fa',
    									}}
    								>
    									開発モード
    								</td>
    								<td style={{ padding: '12px', border: '1px solid #ddd' }}>
    									{env.DEV ? '✅ はい' : '❌ いいえ'}
    								</td>
    							</tr>
    						</tbody>
    					</table>
    				</div>
    			)}
    		</div>
    	);
    }
    
    export default App;
    
    

    ◆ローカル開発(npm run dev

npm run devでサーバーを起動すると、画面の表示内容から、.env + .env.developmentファイルが読み込まれていることがわかります。

なので、ローカル開発ができることになります。

image.png

image (1).png

◆dev・staging環境(npm run dev:staging

npm run dev:stagingでサーバー起動すると、画面の表示内容から、.env + .env.stagingファイルが読み込まれていることがわかります。

なので、dev・staging環境のAPIを叩いて開発できることになります。

image (2).png

◆dev・staging環境(npm run build:staging と npm run preview

npm run build:stagingは、staging(dev)環境にデプロイする時に使います。

stagingサーバーにデプロイする前にnpm run build:stagingでビルドします。

そうすると、distフォルダにstagingのAPIパスでビルドされたファイルが出力されます。

image (3).png

その後にnpm run previewでstagingビルドが正しく動くかローカルで確認する時に使います。

具体的なワークフローとして、以下のようになります。

  • ローカル開発
    • npm run dev → 動作確認
  • stagingにデプロイ前
    • npm run build:staging
    • npm run preview → ビルド結果をローカルで確認。問題なければstagingサーバーにデプロイ
  • 本番にデプロイ前
    • npm run build
    • npm run preview → ビルド結果をローカルで確認。問題なければ本番サーバーにデプロイ

npm run build:stagingnpm run previewを実行すると、以下のように表示されます。

.env + .env.stagingファイルが読み込まれている事がわかりますが、さらにPROD: trueで本番ビルドされていることがわかります。

image (4).png

◆本番ビルド(npm run buildnpm run preview

npm run buildnpm run previewを実行すると、以下のように表示されます。

デバッグ情報が表示されていないので、showDebugがfalseになっている事がわかります。

.env + .env.productionが読み込まれていることがわかります。

image (5).png

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?