brand logo

ドキュメント

プラグイン

Nuxt Kit はプラグインの作成と使用を支援する一連のユーティリティを提供します。これらの関数を使用して、モジュールにプラグインやプラグインテンプレートを追加できます。

プラグインは通常、Vue にアプリレベルの機能を追加する自己完結型のコードです。Nuxt では、プラグインは plugins/ ディレクトリから自動的にインポートされます。しかし、モジュールと共にプラグインを提供する必要がある場合、Nuxt Kit は addPluginaddPluginTemplate メソッドを提供します。これらのユーティリティを使用すると、プラグインの設定をカスタマイズしてニーズにより適合させることができます。

addPlugin

Nuxt プラグインを登録し、プラグイン配列に追加します。

addPlugin に関する Vue School のビデオを視聴してください。

使用法

import { addPlugin, createResolver, defineNuxtModule } from '@nuxt/kit'

export default defineNuxtModule({
  setup () {
    const { resolve } = createResolver(import.meta.url)

    addPlugin({
      src: resolve('runtime/plugin.js'),
      mode: 'client',
    })
  },
})

function addPlugin(plugin: NuxtPlugin | string, options?: AddPluginOptions): NuxtPlugin

パラメータ

plugin: プラグインオブジェクトまたはプラグインへのパスを含む文字列。文字列が提供された場合、それは src が文字列値に設定されたプラグインオブジェクトに変換されます。

プラグインオブジェクトが提供された場合、以下のプロパティを持つ必要があります:

プロパティ必須説明
srcstringtrueプラグインファイルへのパス。
mode'all' | 'server' | 'client'{lang="ts"}false'all' に設定すると、プラグインはクライアントとサーバーの両方のバンドルに含まれます。'server' に設定すると、プラグインはサーバーバンドルにのみ含まれます。'client' に設定すると、プラグインはクライアントバンドルにのみ含まれます。src オプションを指定する際に .client および .server 修飾子を使用して、プラグインをクライアントまたはサーバー側でのみ使用することもできます。
ordernumberfalseプラグインの順序。これにより、プラグインの順序をより細かく制御でき、高度なユーザーのみが使用する必要があります。小さい数値が先に実行され、ユーザープラグインはデフォルトで 0 です。order-20 から 20 の間の数値に設定することをお勧めします。pre-プラグイン(Nuxt プラグインの前に実行されるプラグイン)には -20post-プラグイン(Nuxt プラグインの後に実行されるプラグイン)には 20 を設定します。

order の使用は必要な場合を除いて避けてください。Nuxt のデフォルトの後にプラグインを登録する必要がある場合は、append を使用してください。

options: 以下のプロパティを持つオプションのオブジェクト:

プロパティ必須説明
appendbooleanfalsetrue の場合、プラグインはプラグイン配列の末尾に追加されます。false の場合、先頭に追加されます。デフォルトは false です。

import { addPlugin, createResolver, defineNuxtModule } from '@nuxt/kit'

export default defineNuxtModule({
  setup () {
    const { resolve } = createResolver(import.meta.url)

    addPlugin({
      src: resolve('runtime/plugin.js'),
      mode: 'client',
    })
  },
})

addPluginTemplate

テンプレートを追加し、nuxt プラグインとして登録します。これは、ビルド時にコードを生成する必要があるプラグインに便利です。

addPluginTemplate に関する Vue School のビデオを視聴してください。

使用法

import { addPluginTemplate, defineNuxtModule } from '@nuxt/kit'

export default defineNuxtModule({
  setup (options) {
    addPluginTemplate({
      filename: 'module-plugin.mjs',
      getContents: () => `import { defineNuxtPlugin } from '#app/nuxt'
export default defineNuxtPlugin({
  name: 'module-plugin',
  setup (nuxtApp) {
    ${options.log ? 'console.log("Plugin install")' : ''}
  }
})`,
    })
  },
})

function addPluginTemplate(pluginOptions: NuxtPluginTemplate, options?: AddPluginOptions): NuxtPlugin

パラメータ

pluginOptions: 以下のプロパティを持つプラグインテンプレートオブジェクト:

プロパティ必須説明
srcstringfalseテンプレートへのパス。src が提供されない場合、代わりに getContents を提供する必要があります。
filenamestringfalseテンプレートのファイル名。filename が提供されない場合、src パスから生成されます。この場合、src オプションが必要です。
dststringfalse出力ファイルへのパス。dst が提供されない場合、filename パスと nuxt buildDir オプションから生成されます。
mode'all' | 'server' | 'client'{lang="ts"}false'all' に設定すると、プラグインはクライアントとサーバーの両方のバンドルに含まれます。'server' に設定すると、プラグインはサーバーバンドルにのみ含まれます。'client' に設定すると、プラグインはクライアントバンドルにのみ含まれます。src オプションを指定する際に .client および .server 修飾子を使用して、プラグインをクライアントまたはサーバー側でのみ使用することもできます。
optionsRecord<string,>{lang="ts"}falseテンプレートに渡すオプション。
getContents(data: Record<string,>) => string | Promise<string>{lang="ts"}falseoptions オブジェクトと共に呼び出される関数です。文字列または文字列に解決されるプロミスを返す必要があります。src が提供されている場合、この関数は無視されます。
writebooleanfalsetrue に設定すると、テンプレートは出力ファイルに書き込まれます。それ以外の場合、テンプレートは仮想ファイルシステムでのみ使用されます。
ordernumberfalseプラグインの順序。これにより、プラグインの順序をより細かく制御でき、高度なユーザーのみが使用する必要があります。小さい数値が先に実行され、ユーザープラグインはデフォルトで 0 です。order-20 から 20 の間の数値に設定することをお勧めします。pre-プラグイン(Nuxt プラグインの前に実行されるプラグイン)には -20post-プラグイン(Nuxt プラグインの後に実行されるプラグイン)には 20 を設定します。

動的なプラグイン生成には getContents の使用を推奨します。必要な場合を除いて order の設定は避けてください。

options: 以下のプロパティを持つオプションのオブジェクト:

プロパティ必須説明
appendbooleanfalsetrue の場合、プラグインはプラグイン配列の末尾に追加されます。false の場合、先頭に追加されます。デフォルトは false です。

異なるオプションでプラグインテンプレートを生成する

ビルド時にプラグインコードを動的に生成する必要がある場合は、addPluginTemplate を使用します。これにより、渡されたオプションに基づいて異なるプラグイン内容を生成できます。例えば、Nuxt は内部的にこの関数を使用して Vue アプリの設定を生成します。

import { addPluginTemplate, defineNuxtModule } from '@nuxt/kit'

export default defineNuxtModule({
  setup (_, nuxt) {
    if (nuxt.options.vue.config && Object.values(nuxt.options.vue.config).some(v => v !== null && v !== undefined)) {
      addPluginTemplate({
        filename: 'vue-app-config.mjs',
        write: true,
        getContents: () => `import { defineNuxtPlugin } from '#app/nuxt'
export default defineNuxtPlugin({
  name: 'nuxt:vue-app-config',
  enforce: 'pre',
  setup (nuxtApp) {
    ${Object.keys(nuxt.options.vue.config!)
        .map(k => `nuxtApp.vueApp.config[${JSON.stringify(k)}] = ${JSON.stringify(nuxt.options.vue.config![k as 'idPrefix'])}`)
        .join('\n')
    }
  }
})`,
      })
    }
  },
})

これは、提供された設定に応じて異なるプラグインコードを生成します。

::code-group

nuxt.config.ts
export default defineNuxtConfig({
  vue: {
    config: {
      idPrefix: 'nuxt',
    },
  },
})
#build/vue-app-config.mjs
import { defineNuxtPlugin } from '#app/nuxt'
export default defineNuxtPlugin({
  name: 'nuxt:vue-app-config',
  enforce: 'pre',
  setup (nuxtApp) {
    nuxtApp.vueApp.config["idPrefix"] = "nuxt"
  }
})

::

EJS テンプレートを使用してプラグインを生成する

EJS テンプレートを使用してプラグインを生成することもできます。オプションは options プロパティを通じて渡され、その後 EJS テンプレート内で使用してプラグインの内容を生成します。

import { addPluginTemplate, createResolver, defineNuxtModule } from '@nuxt/kit'

export default defineNuxtModule({
  setup (options, nuxt) {
    const { resolve } = createResolver(import.meta.url)

    addPluginTemplate({
      src: resolve('templates/plugin.ejs'),
      filename: 'plugin.mjs',
      options: {
        ssr: nuxt.options.ssr,
      },
    })
  },
})

compatibilityVersion4 に設定すると、Nuxt はデフォルトでテンプレートのコンパイルに lodash.template を使用しなくなります。experimental.compileTemplate オプションを通じて有効にすることはできますが、次のメジャーバージョンで EJS テンプレートのサポートは完全に削除されます。

tips

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

Nuxtプラグイン機能の補足解説

Nuxtのプラグインは、Vueアプリケーションに機能を追加するための強力な仕組みです。公式ドキュメントでは基本的な使い方が紹介されていますが、実務での具体的な活用方法や注意点については触れられていない部分もあります。本記事では、Nuxtプラグインのメリットや使いどころ、実際のユースケースを交えながら、より深く理解できるよう補足します。


1. イントロ:Nuxtプラグインで何が嬉しいのか?

Nuxtプラグインを使うことで、以下のような課題を解決できます。

  • アプリ全体で共通して使いたい機能やライブラリの初期化を一元管理できる
  • サーバーサイドとクライアントサイドでの処理を柔軟に切り分けられる
  • モジュール開発時にプラグインを組み込むことで、機能拡張を簡単に配布・共有できる

これにより、コードの重複を減らし、保守性や拡張性の高いNuxtアプリケーションを構築できます。


2. まず結論:Nuxtプラグインの要点

  • プラグインは plugins/ フォルダに配置すると自動的に読み込まれるが、モジュール内で動的に登録する場合は addPlugin を使う
  • addPlugin はプラグインの読み込みモード(client / server / all)や順序を細かく制御可能
  • 実務では、認証ライブラリの初期化、APIクライアントのセットアップ、テーマ切り替えなどでよく使われる
  • SSRとCSRの違いを理解し、Hydrationエラーやパフォーマンス低下を防ぐために適切なモード設定が重要
  • order オプションは高度な制御用で、基本は使わず append で順序調整するのが安全

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

使うべきケース

  • アプリ全体で共有したい状態管理やユーティリティの初期化
  • Vueプラグイン(例:Vuexプラグイン、Vue I18nなど)の登録
  • APIクライアントのインジェクションや設定
  • サーバーサイドのみ、またはクライアントサイドのみで動作させたい処理の分離

使わない方がよいケース

  • 単一コンポーネント内だけで完結する処理(プラグイン化は過剰)
  • 頻繁に状態が変わる動的なロジック(プラグインは初期化処理向き)
  • 依存関係が複雑でプラグインの順序制御が難しい場合(設計を見直すべき)

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

ユースケース1:認証ライブラリの初期化

認証状態を管理するライブラリをプラグインで初期化し、全コンポーネントで利用可能にします。

// modules/auth-module.ts
import { addPlugin, createResolver, defineNuxtModule } from '@nuxt/kit'

export default defineNuxtModule({
  setup () {
    const { resolve } = createResolver(import.meta.url)
    addPlugin({
      src: resolve('runtime/auth-plugin.ts'),
      mode: 'client', // 認証はクライアント側でのみ動作
    })
  },
})
// runtime/auth-plugin.ts
export default defineNuxtPlugin((nuxtApp) => {
  const auth = useAuthLibrary()
  nuxtApp.provide('auth', auth)
})

ユースケース2:APIクライアントのセットアップ

AxiosなどのHTTPクライアントをプラグインで設定し、API呼び出しを統一します。

// modules/api-module.ts
import { addPlugin, createResolver, defineNuxtModule } from '@nuxt/kit'

export default defineNuxtModule({
  setup () {
    const { resolve } = createResolver(import.meta.url)
    addPlugin({
      src: resolve('runtime/api-plugin.ts'),
      mode: 'all', // サーバー・クライアント両方で利用
    })
  },
})
// runtime/api-plugin.ts
import axios from 'axios'

export default defineNuxtPlugin((nuxtApp) => {
  const api = axios.create({
    baseURL: process.env.API_BASE_URL,
  })
  nuxtApp.provide('api', api)
})

ユースケース3:テーマ切り替えの初期設定

ユーザーの好みに応じてダークモードを設定する処理をプラグインで実装。

// modules/theme-module.ts
import { addPlugin, createResolver, defineNuxtModule } from '@nuxt/kit'

export default defineNuxtModule({
  setup () {
    const { resolve } = createResolver(import.meta.url)
    addPlugin({
      src: resolve('runtime/theme-plugin.ts'),
      mode: 'client',
    })
  },
})
// runtime/theme-plugin.ts
export default defineNuxtPlugin((nuxtApp) => {
  const colorMode = useColorMode()
  nuxtApp.hook('app:mounted', () => {
    if (colorMode.preference !== 'dark') {
      colorMode.preference = 'dark'
    }
  })
})

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

SSRとCSRの違いによる問題

  • プラグインをクライアント専用にしたい場合は必ず mode: 'client' を指定しないと、サーバー側で実行されてエラーになることがあります。
  • 逆にサーバー専用の処理は mode: 'server' に設定し、クライアントバンドルに含めないようにしましょう。

Hydrationエラーの原因

  • サーバーとクライアントで状態が異なる初期化処理をプラグインで行うと、Hydrationエラーが発生しやすいです。
  • 状態の同期や初期値の設定は慎重に行い、必要に応じて app:mounted フックなどでクライアント側の処理を遅延させることが有効です。

パフォーマンスへの影響

  • 不要なプラグインをクライアントに含めるとバンドルサイズが増加し、初期表示速度が低下します。
  • mode オプションを活用して、必要な環境でのみプラグインを読み込むようにしましょう。

プラグインの順序制御

  • order オプションは高度な制御用で、誤った設定は予期せぬ動作を招きます。
  • 基本的には append オプションで末尾に追加するか、デフォルトの順序に任せるのが安全です。

6. まとめ

Nuxtのプラグイン機能は、アプリケーションの拡張性とメンテナンス性を高める重要なツールです。公式ドキュメントの基本を押さえつつ、実務での具体的な使い方や注意点を理解することで、より効果的に活用できます。特にSSR/CSRの違いやプラグインの読み込み順序には注意し、適切な設定を心がけましょう。これにより、安定したパフォーマンスと開発効率の向上が期待できます。


プラグインの開発やカスタマイズを行う際は、まず小さな機能から試し、動作環境(サーバー・クライアント)を意識して段階的に拡張することをおすすめします。


title: 'NuxtのaddPluginTemplate機能を徹底解説:動的プラグイン生成の実務活用と注意点' description: 'NuxtのaddPluginTemplateはビルド時に動的にプラグインコードを生成できる強力な機能です。本記事ではその使い方、適切な利用シーン、実務での活用例、よくある落とし穴を詳しく解説します。初〜中級者向けに丁寧に解説し、Nuxt開発の幅を広げる補足情報を提供します。'

NuxtのaddPluginTemplateとは?〜動的プラグイン生成のメリットと課題解決

NuxtのaddPluginTemplateは、ビルド時にプラグインコードを動的に生成し、Nuxtアプリに組み込むための機能です。通常のプラグインは静的なファイルとして用意しますが、addPluginTemplateを使うと、ビルド時の設定や環境に応じてプラグインの内容を柔軟に変えられます。

この機能を使うことで、以下のような課題を解決できます。

  • ビルド時に設定値や環境変数を反映したプラグインを自動生成したい
  • クライアント・サーバーで異なる処理を含むプラグインを効率的に管理したい
  • 複雑なプラグインロジックをテンプレート化し、再利用性を高めたい

つまり、addPluginTemplateは「動的にプラグインコードを作りたい」「環境やオプションに応じてプラグインの挙動を変えたい」開発者にとって非常に便利な機能です。


まず結論:addPluginTemplateのポイント

  • 動的生成:ビルド時にプラグインコードを文字列やテンプレートから生成できる
  • 柔軟な出力先:ファイルとして書き出すことも、仮想ファイルとしてのみ利用することも可能
  • モード指定all(クライアント・サーバー両方)、clientserverのいずれかを指定できる
  • オプション渡し:テンプレートに任意のオプションを渡して内容をカスタマイズ可能
  • 順序制御:プラグインの実行順序を細かく制御できるが、通常はデフォルトで問題ない
  • EJSテンプレート対応:外部テンプレートファイルを使って複雑なコード生成も可能

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

使うべきケース

  • ビルド時にプラグインの内容を動的に変えたい場合
    例:環境変数やユーザー設定に応じてプラグインの挙動を切り替えたい

  • クライアント・サーバーで異なるコードを生成したい場合
    例:サーバー専用の認証処理やクライアント専用のUI設定をプラグインに含めたい

  • 複数の設定パターンに対応するプラグインを一元管理したい場合
    例:同じモジュール内で複数のプラグインテンプレートを生成し、条件に応じて切り替えたい

  • プラグインコードをテンプレート化して保守性を高めたい場合
    例:EJSなどのテンプレートエンジンを使い、複雑なコード生成を行いたい

使わない方がよいケース

  • 単純な静的プラグインで十分な場合
    動的生成のオーバーヘッドが不要なら、通常のプラグインファイルを用意した方がシンプル

  • ランタイムでの動的処理が必要な場合
    addPluginTemplateはビルド時のコード生成なので、実行時の動的処理には向かない

  • プラグインの順序制御が複雑すぎる場合
    順序を細かく設定すると管理が難しくなるため、基本はデフォルトのまま使うのが無難


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

1. 環境変数に応じてプラグインの挙動を切り替える

import { addPluginTemplate, defineNuxtModule } from '@nuxt/kit'

export default defineNuxtModule({
  setup (_, nuxt) {
    const isProd = process.env.NODE_ENV === 'production'
    addPluginTemplate({
      filename: 'env-based-plugin.mjs',
      getContents: () => `import { defineNuxtPlugin } from '#app/nuxt'
export default defineNuxtPlugin(() => {
  if (${isProd}) {
    console.log('Production mode plugin active')
  } else {
    console.log('Development mode plugin active')
  }
})`,
    })
  },
})

この例では、ビルド時に環境変数を判定し、プラグインのログ出力を切り替えています。

2. クライアント専用プラグインとサーバー専用プラグインを分ける

addPluginTemplate({
  filename: 'client-only-plugin.client.mjs',
  getContents: () => `import { defineNuxtPlugin } from '#app/nuxt'
export default defineNuxtPlugin(() => {
  console.log('This runs only on client')
})`,
  mode: 'client',
})

addPluginTemplate({
  filename: 'server-only-plugin.server.mjs',
  getContents: () => `import { defineNuxtPlugin } from '#app/nuxt'
export default defineNuxtPlugin(() => {
  console.log('This runs only on server')
})`,
  mode: 'server',
})

ファイル名に.client.serverを付けることで、Nuxtは自動的にクライアント・サーバー用に振り分けます。

3. EJSテンプレートを使った複雑なプラグイン生成

import { addPluginTemplate, createResolver, defineNuxtModule } from '@nuxt/kit'

export default defineNuxtModule({
  setup (options, nuxt) {
    const { resolve } = createResolver(import.meta.url)
    addPluginTemplate({
      src: resolve('templates/plugin.ejs'),
      filename: 'custom-plugin.mjs',
      options: { ssr: nuxt.options.ssr },
    })
  },
})

EJSテンプレート内でoptionsを使い、SSR対応のコードを動的に生成できます。


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

1. SSRとCSRの違いによる挙動の違い

addPluginTemplateで生成したプラグインは、modeオプションでクライアント・サーバーのバンドルを制御できますが、意図しないモード指定をすると期待した環境で動作しません。特にSSR時にクライアント専用のコードを実行しようとするとエラーになるため注意が必要です。

2. Hydration(ハイドレーション)時の差異に注意

動的に生成したプラグインがクライアントとサーバーで異なる状態を作ると、Vueのハイドレーションエラーが発生することがあります。プラグイン内で状態管理や副作用を扱う場合は、両環境で整合性が取れるように設計しましょう。

3. パフォーマンスへの影響

プラグインを大量に動的生成するとビルド時間が増加する可能性があります。また、write: trueでファイル出力するとディスクI/Oが発生するため、必要な場合のみ有効にしましょう。

4. テンプレートの互換性

Nuxtの将来バージョンではEJSテンプレートのサポートが廃止予定です。新規開発ではgetContents関数を使った文字列生成を推奨します。


まとめ

addPluginTemplateはNuxtのビルド時にプラグインコードを動的に生成できる強力な機能です。環境に応じた柔軟なプラグイン作成やクライアント・サーバー別の処理分離、複雑なテンプレート生成に役立ちます。

ただし、SSR/CSRの違いやハイドレーションの問題、ビルドパフォーマンスへの影響など注意点も多いため、用途を明確にして適切に使うことが重要です。

実務では環境変数に応じた設定反映やクライアント・サーバー専用プラグインの分離、EJSテンプレートによる複雑なコード生成などが代表的な活用例です。これらを理解し活用することで、Nuxt開発の幅が大きく広がります。


動的プラグイン生成は強力ですが、まずは静的プラグインで十分か検討し、必要に応じてaddPluginTemplateを導入するのがおすすめです。