Import meta
import.meta を使用してコードがどこで実行されているかを理解する。
import.meta オブジェクト
ESモジュールを使用すると、ESモジュールをインポートまたはコンパイルするコードからいくつかのメタデータを取得できます。
これは import.meta を通じて行われ、コードにこの情報を提供するオブジェクトです。
Nuxtのドキュメント全体で、コードが現在クライアント側またはサーバー側で実行されているかどうかを判断するためにこれを使用するスニペットを見ることができます。
ランタイム(アプリ)プロパティ
これらの値は静的に注入され、ランタイムコードのツリーシェイクに使用できます。
| プロパティ | 型 | 説明 |
|---|---|---|
import.meta.client | boolean | クライアント側で評価された場合に true。 |
import.meta.browser | boolean | クライアント側で評価された場合に true。 |
import.meta.server | boolean | サーバー側で評価された場合に true。 |
import.meta.nitro | boolean | サーバー側で評価された場合に true。 |
import.meta.dev | boolean | Nuxt開発サーバーを実行している場合に true。 |
import.meta.test | boolean | テストコンテキストで実行している場合に true。 |
import.meta.prerender | boolean | ビルドのプレンダーステージでサーバー上でHTMLをレンダリングしている場合に true。 |
ビルダープロパティ
これらの値はモジュールと nuxt.config の両方で利用可能です。
| プロパティ | 型 | 説明 |
|---|---|---|
import.meta.env | object | process.env と等しい |
import.meta.url | string | 現在のファイルの解決可能なパス。 |
例
モジュール内のファイルを解決するための import.meta.url の使用
import { createResolver } from 'nuxt/kit'
// 現在のファイルから相対的に解決
const resolver = createResolver(import.meta.url)
export default defineNuxtModule({
meta: { name: 'myModule' },
setup() {
addComponent({
name: 'MyModuleComponent',
// '/modules/my-module/components/MyModuleComponent.vue' に解決される
filePath: resolver.resolve('./components/MyModuleComponent.vue')
})
}
})
tips
このセクションは公式ドキュメントの翻訳ではなく、本サイト独自の補足記事です。
はじめに:import.metaがもたらす利便性と課題解決
Nuxtを使った開発では、コードがクライアント側(ブラウザ)で動いているのか、サーバー側(Node.jsなど)で動いているのかを判別することが非常に重要です。これにより、環境に応じた処理の切り替えやパフォーマンス最適化が可能になります。
import.meta はESモジュールの標準機能で、実行環境に関するメタ情報を提供します。Nuxtではこれを活用して、コードの実行場所を判別し、適切なロジックを実装できます。これにより、例えばサーバーサイドレンダリング(SSR)とクライアントサイドレンダリング(CSR)で異なる処理を安全に行うことができ、バグやパフォーマンス問題を未然に防げます。
本記事では、Nuxtにおけるimport.metaの使い方を丁寧に解説し、実務での具体的なユースケースや注意点も紹介します。
まず結論:import.metaのポイントまとめ
import.meta.client/import.meta.browserはクライアント側での実行を判別するために使うimport.meta.server/import.meta.nitroはサーバー側での実行を判別するために使うimport.meta.devは開発モードかどうかを判別できるimport.meta.prerenderはプリレンダリング時の判別に便利- 実行環境に応じてコードを分岐させることで、SSR/CSRの違いによる問題を回避できる
import.meta.urlはモジュールのファイルパス解決に役立つ- 過度な環境判別はコードの複雑化を招くため、必要最低限に留めることが望ましい
いつ使うべきか・使わない方がよいケース
使うべきケース
- SSRとCSRで異なる処理を行いたいとき
例:ブラウザAPIを使う処理はクライアント側のみで実行したい場合 - 開発モードと本番モードで挙動を変えたいとき
例:ログ出力やデバッグ用コードの切り替え - プリレンダリング時に特別な処理をしたいとき
- モジュールやプラグインのファイルパスを動的に解決したいとき
使わない方がよいケース
- 単純に環境変数で十分な場合(
import.meta.envはprocess.envと同等) - 実行環境の判別が不要なロジック
- 過剰に細かく環境判別を行い、コードが複雑化する場合
実務でよくあるユースケースとサンプルコード
1. クライアント限定の処理を安全に実行する
ブラウザのwindowやdocumentを使う処理はサーバーでは動作しません。import.meta.clientを使ってクライアント側のみで実行する例です。
if (import.meta.client) {
// ブラウザAPIを使った処理
console.log('This runs only on the client side.')
}
2. 開発モード限定のログ出力
開発中だけ詳細なログを出したい場合にimport.meta.devを使います。
if (import.meta.dev) {
console.debug('Debug info: 開発モードでのみ表示されます。')
}
3. モジュール内でのファイルパス解決
import.meta.urlを使って、モジュールの相対パスからコンポーネントやファイルを解決する例です。
import { createResolver } from 'nuxt/kit'
const resolver = createResolver(import.meta.url)
export default defineNuxtModule({
meta: { name: 'myModule' },
setup() {
addComponent({
name: 'MyModuleComponent',
filePath: resolver.resolve('./components/MyModuleComponent.vue')
})
}
})
よくある落とし穴・注意点
SSRとCSRの違いによるHydrationエラー
import.meta.clientでクライアント限定処理を行う際、サーバー側でのレンダリング結果とクライアント側の初期化結果が異なるとHydrationエラーが発生します。状態の同期や表示内容の差異に注意しましょう。
パフォーマンスへの影響
環境判別を多用すると、コードの分岐が増えて可読性が下がり、メンテナンスコストが増加します。必要な箇所に絞って使うことが重要です。
ビルド時の静的解析との関係
import.metaの値はビルド時に静的に注入されるため、条件分岐はツリーシェイクされやすいですが、動的に変わる値ではありません。動的な環境判別には向きません。
テスト環境での挙動
import.meta.testはテスト実行時にtrueになるため、テストコード内で環境依存の処理を切り替えたい場合に活用できます。ただし、テストフレームワークの設定によっては動作しないこともあるため注意してください。
まとめ
Nuxtにおけるimport.metaは、実行環境を判別して適切な処理を行うための強力なツールです。特にSSR/CSRの違いを意識したコード設計や、開発・テスト環境の切り替えに役立ちます。
ただし、過剰な環境判別はコードの複雑化を招くため、必要な箇所に絞って使うことが重要です。import.meta.urlを使ったファイルパス解決も、モジュール開発で非常に便利な機能です。
これらを理解し活用することで、Nuxtアプリケーションの品質向上と開発効率アップにつながります。
※このページは Nuxt.js 公式ドキュメントの翻訳ページです。
公式ドキュメントの該当ページはこちら:
https://nuxt.com/docs/3.x/api/advanced/import-meta