Vite 02 開発の基本(TS・CSS・静的ファイル・環境変数)
更新日:
npm パッケージの import
import { format } from 'date-fns' // ブラウザ単体では動かない書き方を Vite が解決- 依存は事前バンドル(CommonJS → ESM 変換も)され、
node_modules/.vite/deps/にキャッシュ - 依存を更新したのに反映されない →
vite --force(キャッシュ再作成)
TypeScript
.ts.tsxをそのまま import できる(Oxc で超高速に変換)- ⚠️ Vite は型チェックをしない(変換だけ)。型エラーがあってもビルドは通る
- エディタで確認 + ビルド時に
tsc --noEmit(テンプレートの build スクリプトはtsc -b && vite build) - 開発中も見たいなら別ターミナルで
tsc --noEmit --watch、またはvite-plugin-checker
- エディタで確認 + ビルド時に
tsconfig.jsonで"isolatedModules": trueを必ず- 型だけの import は
import type { User } from './types' vite/clientの型: 画像 import、import.meta.env、import.meta.hotの型を提供- tsconfig の
pathsを使いたい → 設定でresolve.tsconfigPaths: true(またはresolve.alias)
CSS
import './styles.css' // ページに注入(HMR 対応)
import styles from './Button.module.css' // CSS Modules(クラス名が衝突しない)
<button className={styles.primary} />- PostCSS 設定があれば自動適用(Tailwind v4 は
@tailwindcss/viteプラグインが定番) - Sass/Less:
npm add -D sass-embeddedを入れるだけで.scssが使える ?inlineを付けると注入せず文字列として取得- 本番の CSS 圧縮は Lightning CSS
静的ファイル(画像など)
import して使う(推奨)
import logoUrl from './assets/logo.png' // ビルド時にハッシュ付きファイル名になる
<img src={logoUrl} alt="logo" />- 小さいファイルは自動で base64 インライン化
?url(URL として)、?raw(文字列として)、?inline、?worker(Web Worker として)
public/ に置く
- import せずに
/favicon.icoのようにルートパスで参照。そのままdist/にコピー(名前変更なし) - 用途:
robots.txt、favicon、ファイル名を変えてはいけないもの
環境変数とモード
# .env
VITE_API_URL=https://api.example.com # ← ブラウザのコードから読める
DB_PASSWORD=foobar # ← 読めない(undefined)console.log(import.meta.env.VITE_API_URL)
if (import.meta.env.DEV) { console.log('開発中だけ') } // 本番ビルドでは消えるVITE_付きの値はビルド時に JS に埋め込まれ、誰でも見られる → API キーなどの秘密は入れない(秘密が必要な処理はサーバー側で)- 値は常に文字列(数値・真偽値は自分で変換)
- 組み込み:
import.meta.env.MODEBASE_URLPRODDEVSSR
.env ファイルの読み込み順
.env # 常に
.env.local # 常に・git 除外
.env.[mode] # そのモードだけ(例 .env.production)
.env.[mode].local # そのモードだけ・git 除外- モード別 > 共通。実行時にシェルで渡した変数が最優先
.envを変えたら開発サーバーを再起動*.localを.gitignoreに- モード:
viteは development、vite buildは production、vite build --mode stagingで任意 - 型を付ける:
src/vite-env.d.tsでinterface ImportMetaEnv { readonly VITE_API_URL: string }
その他の便利機能
- glob import:
import.meta.glob('./posts/*.md')でフォルダ内のファイルをまとめて読み込む - 動的 import:
const mod = await import('./heavy')→ 自動でコード分割 - JSON import:
import data from './data.json' - Web Workers:
new Worker(new URL('./worker.ts', import.meta.url), { type: 'module' }) - WebAssembly:
import init from './x.wasm?init'