Nuxt4のプロジェクトにVitestを導入する
はじめに
今回は、Nuxt4のプロジェクトにVitestを導入した際に遭遇したインポートエイリアスのエラー対処法をまとめます。
なお、今回は説明のためにテスト対象をapp/utils配下のTSファイルに限定しています。
Vueファイルのテストも実施する場合は、以下ページを参考に@nuxt/test-utilsなどを追加で導入してください。
実施環境
- Node.js v22.18.0
- パッケージマネージャ: pnpm
- nuxt: v4.2.2
- vitest: v4.0.16
- @nuxt/eslint: v1.12.1
手順
まずVitestを依存関係に追加します。
> pnpm add -D vitestnpmやyarnなどを使っている場合は適宜読み替えてください
次に、以下のようにconfigファイルを作成します。
import { defineConfig } from "vitest/config";
export default defineConfig({
test: {
globals: true,
// 今回はテスト対象をTSファイルに限定しているため、nodeを指定
environment: "node",
},
});これでひとまずの環境はできたので、テストファイルを作成してみます。
import { expect, test } from "vitest";
import { formatNumber } from "@/utils/index";
test("formatNumber", () => {
expect(formatNumber(1000)).toBe("1K");
expect(formatNumber(1234567)).toBe("1.2M");
});すると、2行目のインポート部分で、以下のようなエラーが発生します。
モジュール '@/utils/index' またはそれに対応する型宣言が見つかりません。
どうやらテストファイルでエイリアス(@)が上手く機能していないようです。
エラー原因
ここで注意すべきなのは、vitest.config.tsファイルにエイリアス設定をしても意味がないということです。
実際の原因は、tsconfig.jsonの設定でtestsディレクトリが型チェック対象になっていないためです。
ではtsconfig.jsonに"include": ["tests"]を追加すればよいのかというと、ここにもう1つ罠があります。
対処法
プロジェクトルート直下に配置されているtsconfig.jsonは、.nuxt/tsconfig.jsonを継承しています。
このincludeは、継承先であるプロジェクトルート直下のtsconfig.jsonでincludeを設定した場合、上書きになってしまいます。
決してマージしてくれる訳ではありません。
なので、ここでincludeを設定してしまうと、app配下のファイル群でインポートエラーが発生してしまいます。
では.nuxt/tsconfig.jsonのincludeで設定されているパスも含めて./tsconfig.jsonで設定し直せばよいかというと、まず数が多すぎますし、.nuxt配下のファイルは自動生成されるもののため、そのようなことはしたくありません。
ではどうするのが正解かというと、この.nuxt配下のファイル群の元となっているnuxt.config.tsに設定する、というものです。
以下のように設定を追加します。
export default defineNuxtConfig({
...
typescript: {
tsConfig: {
// .nuxt/tsconfig.jsonからの相対パスを書く
include: ["../tests/**/*.ts"],
},
},
});上記の設定を追記できたら、ターミナルでpnpm devなどで開発サーバーを起動させ.nuxt配下を再生成させます。
すると、テストファイルでもエイリアスが効くようになったかと思います。
——「Vitest環境」これにて完成!
おわりに
Nuxt4からデフォルトのディレクトリ構造が変わり、ほとんどのファイルはapp配下に配置されるようになったため、以前と同じやり方では上手くいきませんでした。
そもそもtestsディレクトリをapp配下に置いていればこんな苦労はなかったかもしれませんが、参考になれば幸いです。