できない.dev

Vite で path alias(@/)が解決できない

`vite.config.ts` で `resolve.alias` を設定しても `@/components/...` が解決できない場合、Vite 側の alias と TypeScript の `paths` の両方を揃える必要がある。

#alias#paths#tsconfig#resolve#import

公開: 更新:

要約

Vite の path alias は Vite (resolve.alias)TypeScript (tsconfig.paths) の 2 箇所に独立した設定が必要。
片方だけだと「ビルドは通るが型エラー」または「型は通るが実行時に解決失敗」のどちらかになる。

よくある原因

  1. vite.config.tsresolve.alias 未設定、または書式ミス。
  2. tsconfig.jsonpaths 未設定で TypeScript が解決できない。
  3. ESM 環境で __dirname が無く path.resolve(__dirname, ...)ReferenceError
  4. Vitest を併用しているが Vitest 側の alias が抜けている。
  5. ESLint の import/no-unresolved が alias を知らない。

解決策

1. vite.config.ts に alias を追加(CJS / ESM)

// CJS(package.json に "type": "module" が無い場合)
import { defineConfig } from "vite";
import path from "node:path";
 
export default defineConfig({
  resolve: {
    alias: {
      "@": path.resolve(__dirname, "./src"),
    },
  },
});
// ESM("type": "module" がある場合)
import { defineConfig } from "vite";
import { fileURLToPath, URL } from "node:url";
 
export default defineConfig({
  resolve: {
    alias: {
      "@": fileURLToPath(new URL("./src", import.meta.url)),
    },
  },
});

2. tsconfig.json に paths を追加

{
  "compilerOptions": {
    "baseUrl": ".",
    "paths": {
      "@/*": ["src/*"]
    }
  }
}

設定後は VS Code の TypeScript Server を再起動する(Cmd+Shift+PTypeScript: Restart TS Server)。

3. Vitest を使うなら同じ alias を vitest.config.ts に書く

mergeConfigvite.config.ts を取り込めば二重管理を避けられる。

4. ESLint の resolver を入れる

npm install -D eslint-import-resolver-typescript

.eslintrcsettings: { 'import/resolver': { typescript: true } } を追加する。
詳細は Vite の Shared Options ドキュメント を参照。

この記事は役立ちましたか?