自動インポート
Nuxtはコンポーネント、コンポーザブル、ヘルパー関数、Vue APIを自動インポートします。
Nuxtは、コンポーネント、コンポーザブル、そしてVue.js APIをアプリケーション全体で明示的にインポートすることなく使用できるように自動インポートします。
const count = ref(1) // refは自動インポートされます
Nuxtは、その意見に基づいたディレクトリ構造のおかげで、app/components/
、app/composables/
、app/utils/
を自動インポートできます。
従来のグローバル宣言とは異なり、Nuxtは型情報、IDEの補完とヒントを保持し、本番コードで使用されているものだけを含めます。
ドキュメントでは、明示的にインポートされていないすべての関数はNuxtによって自動インポートされ、コード内でそのまま使用できます。自動インポートされたコンポーネント、コンポーザブル、ユーティリティのリファレンスはAPIセクションで確認できます。
server
ディレクトリでは、Nuxtはserver/utils/
からエクスポートされた関数と変数を自動インポートします。
カスタムフォルダやサードパーティパッケージからエクスポートされた関数も、nuxt.config
ファイルのimports
セクションを設定することで自動インポートできます。
ビルトイン自動インポート
Nuxtは、データフェッチングを行ったり、アプリケーションコンテキストやランタイム設定にアクセスしたり、状態を管理したり、コンポーネントやプラグインを定義したりするための関数やコンポーザブルを自動インポートします。
/* useFetch()は自動インポートされます */
const { data, refresh, status } = await useFetch('/api/hello')
Vueは、ref
やcomputed
のようなリアクティビティAPI、ライフサイクルフック、ヘルパーを提供しており、これらはNuxtによって自動インポートされます。
/* ref()とcomputed()は自動インポートされます */
const count = ref(1)
const double = computed(() => count.value * 2)
VueとNuxtのコンポーザブル
VueとNuxtが提供するビルトインのComposition APIコンポーザブルを使用する際、多くのものが正しい_コンテキスト_で呼び出されることに依存していることに注意してください。
コンポーネントのライフサイクル中、Vueは現在のコンポーネントの一時インスタンスをグローバル変数を通じて追跡し、同様にNuxtはnuxtApp
の一時インスタンスを追跡し、同じティックでそれを解除します。これは、サーバーレンダリング時に、クロスリクエストの状態汚染(2人のユーザー間で共有参照が漏れること)を避け、異なるコンポーネント間の漏洩を避けるために重要です。
つまり、(非常に少数の例外を除いて)Nuxtプラグイン、Nuxtルートミドルウェア、Vueセットアップ関数の外でそれらを使用することはできません。さらに、それらを同期的に使用する必要があります。つまり、<script setup>
ブロック内、defineNuxtComponent
で宣言されたコンポーネントのセットアップ関数内、defineNuxtPlugin
またはdefineNuxtRouteMiddleware
内を除いて、コンポーザブルを呼び出す前にawait
を使用することはできません。これらの場所では、await
の後でも同期コンテキストを保持するための変換を行います。
Nuxt instance is unavailable
のようなエラーメッセージが表示された場合、それはおそらくVueまたはNuxtのライフサイクルの間違った場所でNuxtコンポーザブルを呼び出していることを意味します。
非SFCコンポーネント内でNuxtコンテキストを必要とするコンポーザブルを使用する場合、defineComponent
の代わりにdefineNuxtComponent
でコンポーネントをラップする必要があります。
壊れるコードの例:
// コンポーザブルの外でランタイム設定にアクセスしようとしています
const config = useRuntimeConfig()
export const useMyComposable = () => {
// ここでランタイム設定にアクセスします
}
動作するコードの例:
export const useMyComposable = () => {
// ライフサイクルの正しい場所でコンポーザブルが呼び出されるため、
// useRuntimeConfigはここで動作します
const config = useRuntimeConfig()
// ...
}
ディレクトリベースの自動インポート
Nuxtは定義されたディレクトリに作成されたファイルを直接自動インポートします:
app/components/
はVueコンポーネント用です。app/composables/
はVueコンポーザブル用です。app/utils/
はヘルパー関数やその他のユーティリティ用です。
自動インポートされたref
とcomputed
はコンポーネントの<template>
でアンラップされません。 :br
これは、Vueがテンプレートのトップレベルでないrefをどのように扱うかによるものです。詳細はVueのドキュメントで読むことができます。
明示的なインポート
Nuxtは、必要に応じてインポートを明示的にするために使用できる#imports
エイリアスで、すべての自動インポートを公開しています:
import { ref, computed } from '#imports'
const count = ref(1)
const double = computed(() => count.value * 2)
自動インポートの無効化
コンポーザブルやユーティリティの自動インポートを無効にしたい場合は、nuxt.config
ファイルでimports.autoImport
をfalse
に設定できます。
export default defineNuxtConfig({
imports: {
autoImport: false
}
})
これにより自動インポートは完全に無効になりますが、#imports
からの明示的なインポートは引き続き使用可能です。
自動インポートの部分的な無効化
ref
のようなフレームワーク固有の関数を自動インポートのままにしておきたいが、自分のコード(例:カスタムコンポーザブル)の自動インポートを無効にしたい場合は、nuxt.config.ts
ファイルでimports.scan
オプションをfalse
に設定できます:
export default defineNuxtConfig({
imports: {
scan: false
}
})
この設定では:
ref
、computed
、watch
のようなフレームワーク関数は、手動でインポートする必要なく動作します。- カスタムコード、例えばコンポーザブルは、ファイル内で手動でインポートする必要があります。
注意: この設定にはいくつかの制限があります:
- プロジェクトをレイヤーで構成している場合、各レイヤーからコンポーザブルを明示的にインポートする必要があり、自動インポートに依存することはできません。
- これにより、レイヤーシステムのオーバーライド機能が壊れます。
imports.scan: false
を使用する場合、この副作用を理解し、それに応じてアーキテクチャを調整してください。
自動インポートされたコンポーネント
Nuxtは、~/components
ディレクトリからコンポーネントを自動的にインポートしますが、これはコンポーザブルやユーティリティ関数の自動インポートとは別に設定されています。
自分の~/components
ディレクトリからのコンポーネントの自動インポートを無効にするには、components.dirs
を空の配列に設定できます(ただし、モジュールによって追加されたコンポーネントには影響しません)。
export default defineNuxtConfig({
components: {
dirs: []
}
})
サードパーティパッケージからの自動インポート
Nuxtはサードパーティパッケージからの自動インポートも可能です。
そのパッケージのNuxtモジュールを使用している場合、モジュールがそのパッケージの自動インポートをすでに設定している可能性があります。
例えば、vue-i18n
パッケージからuseI18n
コンポーザブルの自動インポートを有効にするには、次のようにします:
export default defineNuxtConfig({
imports: {
presets: [
{
from: 'vue-i18n',
imports: ['useI18n']
}
]
}
})
※このページは Nuxt.js 公式ドキュメントの翻訳ページ(非公式)です。
公式ドキュメントの該当ページはこちら:
https://nuxt.com/docs/4.x/guide/concepts/auto-imports