brand logo

ドキュメント

モジュール

Nuxt Kit は、モジュールを作成および使用するための一連のユーティリティを提供します。これらのユーティリティを使用して独自のモジュールを作成したり、既存のモジュールを再利用したりできます。

モジュールは Nuxt の構成要素です。Kit は、モジュールを作成および使用するための一連のユーティリティを提供します。これらのユーティリティを使用して独自のモジュールを作成したり、既存のモジュールを再利用したりできます。例えば、defineNuxtModule 関数を使用してモジュールを定義し、installModule 関数を使用してプログラム的にモジュールをインストールすることができます。

defineNuxtModule

Nuxt モジュールを定義し、ユーザーが提供したオプションとデフォルトを自動的にマージし、提供されたフックをインストールし、完全な制御のためにオプションのセットアップ関数を呼び出します。

使用法

import { defineNuxtModule } from '@nuxt/kit'

export default defineNuxtModule({
  meta: {
    name: 'my-module',
    configKey: 'myModule'
  },
  defaults: {
    enabled: true
  },
  setup (options) {
    if (options.enabled) {
      console.log('My Nuxt module is enabled!')
    }
  }
})

// @errors: 2391
import type { ModuleDefinition, ModuleOptions, NuxtModule } from '@nuxt/schema'
// ---cut---
export function defineNuxtModule<TOptions extends ModuleOptions> (
  definition?: ModuleDefinition<TOptions, Partial<TOptions>, false> | NuxtModule<TOptions, Partial<TOptions>, false>,
): NuxtModule<TOptions, TOptions, false>

パラメータ

definition: モジュール定義オブジェクトまたはモジュール関数。モジュール定義オブジェクトには以下のプロパティを含める必要があります:

プロパティ必須説明
metaModuleMetafalseモジュールのメタデータ。モジュール名、バージョン、設定キー、互換性を定義します。
defaultsT | ((nuxt: Nuxt) => T){lang="ts"}falseモジュールのデフォルトオプション。関数が提供された場合、最初の引数として Nuxt インスタンスが渡されます。
schemaTfalseモジュールオプションのスキーマ。提供された場合、オプションはスキーマに適用されます。
hooksPartial<NuxtHooks>{lang="ts"}falseモジュールにインストールされるフック。提供された場合、モジュールはフックをインストールします。
setup(this: void, resolvedOptions: T, nuxt: Nuxt) => Awaitable<void>{lang="ts"}falseモジュールのセットアップ関数。提供された場合、モジュールはセットアップ関数を呼び出します。

configKey を使用してモジュールを設定可能にする

Nuxt モジュールを定義する際に、configKey を設定して、ユーザーが nuxt.config でモジュールをどのように設定するかを指定できます。

import { defineNuxtModule } from '@nuxt/kit'

export default defineNuxtModule({
  meta: {
    name: 'my-module',
    configKey: 'myModule'
  },
  defaults: {
    // モジュールオプション
    enabled: true
  },
  setup (options) {
    if (options.enabled) {
      console.log('My Nuxt module is enabled!')
    }
  }
})

ユーザーは nuxt.config の対応するキーの下でこのモジュールのオプションを提供できます。

export default defineNuxtConfig({
  myModule: {
    enabled: false
  }
})

モジュールの互換性要件を定義する

Nuxt モジュールを開発していて、特定の Nuxt バージョンでのみサポートされている API を使用している場合、compatibility.nuxt を含めることを強くお勧めします。

export default defineNuxtModule({
  meta: {
    name: '@nuxt/icon',
    configKey: 'icon',
    compatibility: {
      // 必要な nuxt バージョン(semver 形式)。
      nuxt: '>=3.0.0', // または '^3.0.0' を使用
    },
  },
  async setup() {
    const resolver = createResolver(import.meta.url)
    // 実装
  },
})

ユーザーが互換性のない Nuxt バージョンでモジュールを使用しようとすると、コンソールに警告が表示されます。

 WARN  Module @nuxt/icon is disabled due to incompatibility issues:
 - [nuxt] Nuxt version ^3.1.0 is required but currently using 3.0.0

installModule

指定された Nuxt モジュールをプログラム的にインストールします。これは、モジュールが他のモジュールに依存している場合に役立ちます。モジュールオプションをオブジェクトとして inlineOptions に渡すことができ、それらはモジュールの setup 関数に渡されます。

使用法

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

export default defineNuxtModule({  
  async setup () {
    // Roboto フォントと Impact フォールバックで @nuxtjs/fontaine をインストールします
    await installModule('@nuxtjs/fontaine', {
      // モジュール設定
      fonts: [
        {
          family: 'Roboto',
          fallbacks: ['Impact'],
          fallbackName: 'fallback-a',
        }
      ]
    })
  }
})

async function installModule (moduleToInstall: string | NuxtModule, inlineOptions?: any, nuxt?: Nuxt)

パラメータ

プロパティ必須説明
moduleToInstallstring | NuxtModule{lang="ts"}trueインストールするモジュール。モジュール名の文字列またはモジュールオブジェクト自体を指定できます。
inlineOptionsanyfalseモジュールの setup 関数に渡されるモジュールオプションを含むオブジェクト。
nuxtNuxtfalseNuxt インスタンス。提供されない場合は、useNuxt() 呼び出しを通じてコンテキストから取得されます。

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

export default defineNuxtModule({  
  async setup (options, nuxt) {
    // Roboto フォントと Impact フォールバックで @nuxtjs/fontaine をインストールします
    await installModule('@nuxtjs/fontaine', {
      // モジュール設定
      fonts: [
        {
          family: 'Roboto',
          fallbacks: ['Impact'],
          fallbackName: 'fallback-a',
        }
      ]
    })
  }
})

tips

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

Nuxt モジュールの活用ガイド:実務で役立つ使い方と注意点

Nuxt のモジュールは、機能拡張や設定の共通化を簡単に実現できる強力な仕組みです。公式ドキュメントでは基本的な使い方が紹介されていますが、実務での具体的な活用方法や注意すべきポイントについては補足が必要です。

本記事では、Nuxt モジュールのメリットや使いどころ、実際のユースケースを踏まえた具体例、そして SSR やパフォーマンス面での落とし穴まで、丁寧に解説します。これにより、Nuxt モジュールをより安全かつ効果的に活用できるようになります。


まず結論:Nuxt モジュールのポイント

  • モジュールは Nuxt アプリの機能拡張や設定の再利用を簡単にする仕組み
  • defineNuxtModule でモジュールを定義し、オプションのマージやフックの登録が可能
  • installModule を使うと、他のモジュールをプログラム的に動的インストールできる
  • モジュールは SSR と CSR の両方に影響するため、実装時は環境依存に注意が必要
  • 互換性設定を行うことで、Nuxt のバージョン違いによるトラブルを防止できる

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

使うべきケース

  • 共通機能のパッケージ化
    複数プロジェクトで使う共通の設定や機能をモジュール化し、再利用性を高めたいとき。

  • プラグインやライブラリの統合
    外部ライブラリを Nuxt に組み込む際に、設定や初期化処理をモジュールとしてまとめると管理が楽。

  • 動的なモジュール依存関係の管理
    あるモジュールが別のモジュールに依存している場合、installModule で依存モジュールを自動インストールできる。

避けたほうがよいケース

  • 単純な設定変更だけの場合
    モジュール化のコストに見合わない単純な設定変更は、nuxt.config で直接行うほうがシンプル。

  • クライアント専用の処理を含む場合
    SSR 時に動作しないコードを含むと、Hydration エラーやパフォーマンス低下の原因になるため注意が必要。


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

1. 共通設定を持つカスタムモジュールの作成

複数プロジェクトで使う共通のロギング機能をモジュール化し、設定を柔軟に切り替えられるようにします。

import { defineNuxtModule } from '@nuxt/kit'

export default defineNuxtModule({
  meta: {
    name: 'my-logger',
    configKey: 'logger'
  },
  defaults: {
    level: 'info'
  },
  setup(options, nuxt) {
    nuxt.hook('app:created', () => {
      console.log(`[Logger] ログレベルは ${options.level} に設定されています。`)
    })
  }
})

ユーザーは nuxt.config で以下のように設定可能です。

export default defineNuxtConfig({
  logger: {
    level: 'debug'
  }
})

2. 他モジュールの動的インストール

あるモジュール内で、必要に応じて別のモジュールをインストールしたい場合に installModule を使います。

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

export default defineNuxtModule({
  async setup() {
    await installModule('@nuxtjs/axios', {
      baseURL: 'https://api.example.com'
    })
  }
})

これにより、依存モジュールの管理が簡単になり、設定も一元化できます。


3. Nuxt バージョン互換性の指定

特定の Nuxt バージョン以上でのみ動作するモジュールを作成し、誤ったバージョンでの利用を防止します。

export default defineNuxtModule({
  meta: {
    name: 'my-advanced-module',
    configKey: 'advancedModule',
    compatibility: {
      nuxt: '>=3.1.0'
    }
  },
  setup() {
    // 実装
  }
})

Nuxt のバージョンが条件を満たさない場合、警告が表示されモジュールは無効化されます。


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

SSR と CSR の違いに注意

モジュール内でブラウザ固有の API(windowdocument)を直接使うと、SSR 時にエラーになります。必ず実行環境を判定し、クライアント側のみで動作させる工夫が必要です。

Hydration エラーの原因に

モジュールが生成する HTML とクライアント側の状態が異なると、Hydration エラーが発生します。状態管理や DOM 操作は慎重に行い、可能な限り副作用を避けましょう。

パフォーマンスへの影響

モジュールのセットアップ処理が重いと、ビルド時間や起動時間が長くなります。必要な処理だけを行い、非同期処理は適切に分割することが重要です。

互換性設定の活用

Nuxt のバージョンアップに伴い API が変わることがあります。compatibility を設定しておくと、誤ったバージョンでの利用を防ぎ、トラブルを未然に防止できます。


まとめ

Nuxt モジュールは、機能拡張や設定の共通化を強力にサポートする仕組みです。defineNuxtModuleinstallModule を活用することで、柔軟かつ効率的な開発が可能になります。

ただし、SSR と CSR の違いやパフォーマンス面の注意点を理解し、適切に設計することが重要です。互換性設定も活用して、安定した運用を目指しましょう。

Nuxt モジュールを正しく使いこなすことで、プロジェクトの拡張性と保守性が大きく向上します。ぜひ本記事のポイントを参考に、実務での活用に役立ててください。