brand logo

ドキュメント

defineNuxtPlugin

defineNuxtPlugin() は Nuxt プラグインを作成するためのヘルパー関数です。

defineNuxtPlugin は、機能強化と型安全性を備えた Nuxt プラグインを作成するためのヘルパー関数です。このユーティリティは、異なるプラグイン形式を Nuxt のプラグインシステム内でシームレスに動作する一貫した構造に正規化します。

plugins/hello.ts
export default defineNuxtPlugin((nuxtApp) => {
  // Doing something with nuxtApp
})
こちらも参照 guide > directory-structure > plugins#creating-plugins

defineNuxtPlugin<T extends Record<string, unknown>>(plugin: Plugin<T> | ObjectPlugin<T>): Plugin<T> & ObjectPlugin<T>

type Plugin<T> = (nuxt: [NuxtApp](/docs/guide/going-further/internals#the-nuxtapp-interface)) => Promise<void> | Promise<{ provide?: T }> | void | { provide?: T }

interface ObjectPlugin<T> {
  name?: string
  enforce?: 'pre' | 'default' | 'post'
  dependsOn?: string[]
  order?: number
  parallel?: boolean
  setup?: Plugin<T>
  hooks?: Partial<[RuntimeNuxtHooks](/docs/api/advanced/hooks#app-hooks-runtime)>
  env?: {
    islands?: boolean
  }
}

パラメータ

plugin: プラグインは次の2つの方法で定義できます:

  1. 関数プラグイン: NuxtApp インスタンスを受け取り、NuxtApp インスタンス上でヘルパーを提供したい場合に provide プロパティを持つ可能性のあるオブジェクトを含むプロミスを返すことができる関数。
  2. オブジェクトプラグイン: プラグインの動作を設定するための nameenforcedependsOnorderparallelsetuphooksenv などのさまざまなプロパティを含むことができるオブジェクト。
プロパティ必須説明
namestringfalseプラグインのオプション名。デバッグや依存関係管理に役立ちます。
enforce'pre' | 'default' | 'post'false他のプラグインに対する実行タイミングを制御します。
dependsOnstring[]falseこのプラグインが依存するプラグイン名の配列。適切な実行順序を保証します。
ordernumberfalseプラグインの順序をより詳細に制御でき、上級ユーザーのみが使用するべきです。これは enforce の値を上書きし、プラグインをソートするために使用されます。
parallelbooleanfalse他の並列プラグインと並行してプラグインを実行するかどうか。
setupPlugin<T>{lang="ts"}falseメインのプラグイン関数で、関数プラグインに相当します。
hooksPartial<RuntimeNuxtHooks>{lang="ts"}falseNuxt アプリのランタイムフックを直接登録します。
env{ islands?: boolean }{lang="ts"}falseサーバーのみまたはアイランドコンポーネントをレンダリングする際にプラグインを実行したくない場合は、この値を false に設定します。

基本的な使用法

以下の例は、グローバルな機能を追加するシンプルなプラグインを示しています:

plugins/hello.ts
export default defineNuxtPlugin((nuxtApp) => {
  // グローバルメソッドを追加
  return {
    provide: {
      hello: (name: string) => `Hello ${name}!`
    }
  }
})

オブジェクト構文プラグイン

以下の例は、高度な設定を持つオブジェクト構文を示しています:

plugins/advanced.ts
export default defineNuxtPlugin({
  name: 'my-plugin',
  enforce: 'pre',
  async setup (nuxtApp) {
    // プラグインのセットアップロジック
    const data = await $fetch('/api/config')
    
    return {
      provide: {
        config: data
      }
    }
  },
  hooks: {
    'app:created'() {
      console.log('App created!')
    }
  },
})

tips

このセクションは公式ドキュメントの翻訳ではなく、本サイト独自の補足記事です。

Nuxtプラグイン作成の基本と実務活用ガイド

Nuxtのプラグインは、アプリケーションの機能拡張や共通処理の注入に欠かせない仕組みです。defineNuxtPluginは、Nuxt 3で推奨されるプラグイン作成のためのヘルパー関数で、型安全かつ柔軟にプラグインを定義できます。

本記事では、defineNuxtPluginの使い方を深掘りし、実務でよくあるユースケースや注意点を交えて解説します。これにより、Nuxtプラグインの理解が深まり、より効果的に活用できるようになります。


まず結論:defineNuxtPluginのポイント

  • プラグイン作成を型安全かつ統一的に行える
    関数形式とオブジェクト形式の両方をサポートし、Nuxtのプラグインシステムに適した形に正規化される。

  • プラグインの実行順序や依存関係を細かく制御可能
    enforcedependsOnorderなどのオプションで、複雑な依存関係も管理できる。

  • サーバー・クライアント環境やアイランドレンダリングなどの環境依存設定が可能
    envオプションで特定環境での実行制御ができる。

  • Nuxtアプリのランタイムフックを直接登録できる
    hooksオプションでアプリのライフサイクルに介入可能。


いつ使うべきか?使わない方がよいケースは?

使うべきケース

  • 共通機能の注入
    APIクライアントや認証ロジック、ユーティリティ関数などをアプリ全体で使いたい場合。

  • 外部ライブラリの初期化
    例えば、Google AnalyticsやFirebaseのセットアップを一元管理したいとき。

  • アプリのライフサイクルに合わせた処理
    アプリ起動時の初期化処理や特定イベントでの処理をフックしたい場合。

  • 複数プラグイン間の依存関係がある場合
    実行順序を制御して安全に初期化したいとき。

使わない方がよいケース

  • 単純なコンポーネント内ロジック
    プラグインはグローバルな機能拡張向けなので、コンポーネント固有の処理はコンポーネント内に書くべき。

  • 軽微なユーティリティ関数だけの提供
    依存関係や実行順序が不要な単純な関数は、プラグイン化せずモジュールとして管理したほうがシンプル。

  • 頻繁に状態が変わるリアクティブな処理
    プラグインは初期化処理向けなので、動的な状態管理はVueの状態管理やComposableに任せるのが適切。


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

1. APIクライアントの注入

複数のコンポーネントで使うAPIクライアントをプラグインで提供し、useNuxtApp()から呼び出せるようにします。

export default defineNuxtPlugin((nuxtApp) => {
  const apiClient = createApiClient({ baseURL: 'https://api.example.com' })
  return {
    provide: {
      api: apiClient
    }
  }
})

コンポーネント側では以下のように利用可能です。

const { $api } = useNuxtApp()
const data = await $api.get('/posts')

2. 認証状態の初期化と監視

認証トークンの取得や監視をプラグインで行い、アプリ全体で認証状態を共有します。

export default defineNuxtPlugin(async (nuxtApp) => {
  const auth = useAuth() // カスタムComposableなど
  await auth.initialize()
  return {
    provide: {
      auth
    }
  }
})

3. ライフサイクルフックでの処理追加

アプリ起動時にログを出したり、特定のイベントで処理を実行したい場合。

export default defineNuxtPlugin({
  name: 'lifecycle-logger',
  hooks: {
    'app:created'() {
      console.log('Nuxtアプリが作成されました')
    }
  }
})

よくある落とし穴・注意点

SSRとCSRの違いに注意

プラグインはサーバーサイドレンダリング(SSR)とクライアントサイドレンダリング(CSR)の両方で実行されるため、環境依存の処理は必ず環境判定を行いましょう。

if (process.client) {
  // クライアント限定の処理
}

Hydrationの問題

プラグインで提供する状態や関数がSSRとCSRで不整合を起こすと、Hydrationエラーの原因になります。状態の初期化は慎重に行い、可能な限りクライアント側でのみ変化させる設計が望ましいです。

実行順序の管理

複数プラグインが依存関係を持つ場合、enforcedependsOnを適切に設定しないと、初期化順序の問題でバグが発生します。特にprepostの使い分けは重要です。

パフォーマンスへの影響

プラグイン内で重い処理や非同期通信を行うと、アプリの起動時間に影響します。必要な処理は遅延ロードやクライアント限定にするなど工夫しましょう。


まとめ

defineNuxtPluginはNuxtアプリの機能拡張に不可欠なツールであり、型安全かつ柔軟にプラグインを作成できます。共通機能の注入や外部ライブラリの初期化、ライフサイクルフックの活用など、実務での利用価値は非常に高いです。

ただし、SSR/CSRの違いや実行順序、パフォーマンス面の注意点を理解し、適切に設計することが成功の鍵です。この記事を参考に、Nuxtプラグインを効果的に活用して開発効率を高めてください。


プラグインはNuxtアプリの「拡張ポイント」です。小さな機能でもプラグイン化することで再利用性が高まり、保守性も向上します。ぜひ積極的に活用しましょう。