brand logo

ドキュメント

Import meta

import.meta を使用してコードがどこで実行されているかを理解する。

import.meta オブジェクト

ESモジュールを使用すると、ESモジュールをインポートまたはコンパイルするコードからいくつかのメタデータを取得できます。 これは import.meta を通じて行われ、コードにこの情報を提供するオブジェクトです。 Nuxtのドキュメント全体で、コードが現在クライアント側またはサーバー側で実行されているかどうかを判断するためにこれを使用するスニペットを見ることができます。

こちらも参照 developer.mozilla.org > en-US > docs > Web > JavaScript > Reference > Operators > import.meta

ランタイム(アプリ)プロパティ

これらの値は静的に注入され、ランタイムコードのツリーシェイクに使用できます。

プロパティ説明
import.meta.clientbooleanクライアント側で評価された場合に true。
import.meta.browserbooleanクライアント側で評価された場合に true。
import.meta.serverbooleanサーバー側で評価された場合に true。
import.meta.nitrobooleanサーバー側で評価された場合に true。
import.meta.devbooleanNuxt開発サーバーを実行している場合に true。
import.meta.testbooleanテストコンテキストで実行している場合に true。
import.meta.prerenderbooleanビルドのプレンダーステージでサーバー上でHTMLをレンダリングしている場合に true。

ビルダープロパティ

これらの値はモジュールと nuxt.config の両方で利用可能です。

プロパティ説明
import.meta.envobjectprocess.env と等しい
import.meta.urlstring現在のファイルの解決可能なパス。

モジュール内のファイルを解決するための import.meta.url の使用

modules/my-module/index.ts
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.envprocess.envと同等)
  • 実行環境の判別が不要なロジック
  • 過剰に細かく環境判別を行い、コードが複雑化する場合

実務でよくあるユースケースとサンプルコード

1. クライアント限定の処理を安全に実行する

ブラウザのwindowdocumentを使う処理はサーバーでは動作しません。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アプリケーションの品質向上と開発効率アップにつながります。