brand logo

ドキュメント

modules

アプリケーション内でローカルモジュールを自動登録するために modules/ ディレクトリを使用します。

アプリケーションを構築する際に開発するローカルモジュールを配置するのに適した場所です。

自動登録されるファイルパターンは以下の通りです:

  • modules/*/index.ts
  • modules/*.ts

これらのローカルモジュールを nuxt.config.ts に個別に追加する必要はありません。

// `nuxt/kit` はローカルモジュールを定義する際に使用できるヘルパーサブパスインポートです
// つまり、プロジェクトの依存関係に `@nuxt/kit` を追加する必要はありません
import { createResolver, defineNuxtModule, addServerHandler } from 'nuxt/kit'

export default defineNuxtModule({
  meta: {
    name: 'hello'
  },
  setup () {
    const resolver = createResolver(import.meta.url)

    // APIルートを追加
    addServerHandler({
      route: '/api/hello',
      handler: resolver.resolve('./runtime/api-route')
    })
  }
})

Nuxtを起動すると、hello モジュールが登録され、/api/hello ルートが利用可能になります。

モジュールは以下の順序で実行されます:

  • まず、nuxt.config.ts に定義されたモジュールが読み込まれます。
  • 次に、modules/ ディレクトリにあるモジュールがアルファベット順に実行されます。

ローカルモジュールの順序を変更するには、各ディレクトリ名の前に番号を追加します:

ディレクトリ構造
modules/
  1.first-module/
    index.ts
  2.second-module.ts
こちらも参照 guide > going-further > modules

NuxtのプライベートモジュールについてのVue Schoolのビデオを視聴してください。

tips

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

Nuxtのローカルモジュール機能とは?〜開発効率と保守性の向上を実現〜

Nuxtでは、modules/ディレクトリに配置したローカルモジュールを自動的に検出・登録できる機能があります。これにより、プロジェクト固有の機能拡張やAPIルートの追加などを、外部モジュールに依存せずに柔軟かつ効率的に実装可能です。

この仕組みを活用すると、モジュールの管理がシンプルになり、nuxt.config.tsに個別登録する手間が省けるため、開発速度が向上します。また、モジュールの順序制御もディレクトリ名のプレフィックスで簡単に行えるため、複数モジュールの依存関係管理も容易です。


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

  • modules/ディレクトリ内のindex.tsまたは.tsファイルが自動的にモジュールとして登録される
  • nuxt.config.tsに明示的に追加する必要がなく、モジュール管理がシンプルに
  • モジュールはアルファベット順に実行されるため、番号プレフィックスで順序を制御可能
  • nuxt/kitのAPIを使ってモジュール内でサーバーハンドラーやプラグインを簡単に追加できる
  • 実務ではAPIルートの追加やカスタムプラグインの分離、機能ごとのモジュール化に最適

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

使うべきケース

  • プロジェクト固有の機能をモジュール単位で分割し、保守性を高めたいとき
  • APIエンドポイントやサーバーハンドラーをローカルに追加したいとき
  • 複数の機能を独立したモジュールとして管理し、チーム開発で役割分担したいとき
  • 外部モジュールに依存せずにカスタム機能を実装したいとき

使わない方がよいケース

  • 単純な設定変更や小規模なコードなら、わざわざモジュール化せずnuxt.config.tsに直接記述したほうが早い
  • モジュールの依存関係が複雑で、順序制御が困難な場合は外部モジュールやプラグインの利用を検討する
  • モジュールの数が膨大になりすぎると管理が煩雑になるため、適切な粒度で分割することが重要

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

1. APIルートの追加

プロジェクト内で独自のAPIエンドポイントを作成したい場合、ローカルモジュールでサーバーハンドラーを追加できます。

// modules/api/index.ts
import { defineNuxtModule, createResolver, addServerHandler } from 'nuxt/kit'

export default defineNuxtModule({
  meta: { name: 'api' },
  setup() {
    const resolver = createResolver(import.meta.url)
    addServerHandler({
      route: '/api/custom',
      handler: resolver.resolve('./runtime/custom-api')
    })
  }
})
// modules/api/runtime/custom-api.ts
export default defineEventHandler(() => {
  return { message: 'Hello from custom API!' }
})

このようにすると、/api/customにアクセスした際に独自のレスポンスを返せます。

2. カスタムプラグインの分離

複雑なプラグインをモジュールとして切り出し、modules/配下に置くことで、設定や依存関係を整理できます。

// modules/logger/index.ts
import { defineNuxtModule } from 'nuxt/kit'

export default defineNuxtModule({
  meta: { name: 'logger' },
  setup(_, nuxt) {
    nuxt.hook('app:created', () => {
      console.log('Logger module initialized')
    })
  }
})

3. 機能ごとのモジュール化

認証や通知など、機能単位でモジュールを分けることで、チーム開発時の役割分担や機能のオンオフが容易になります。

modules/
  1-auth/
    index.ts
  2-notifications.ts

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

SSRとCSRの違いに注意

ローカルモジュールで追加したサーバーハンドラーはSSR時に動作しますが、クライアント側での動作は別途考慮が必要です。API呼び出しはサーバー経由になるため、クライアント側のフェッチ処理やエラーハンドリングを適切に実装しましょう。

Hydrationエラーに注意

モジュール内でクライアント専用のコードを実行すると、Hydrationエラーが発生することがあります。クライアント限定の処理はprocess.clientprocess.serverで条件分岐するか、必要に応じてClientOnlyコンポーネント(コードブロック内でのみ紹介)を使うことを検討してください。

パフォーマンスへの影響

モジュールが増えすぎるとビルド時間や起動時間に影響が出る可能性があります。モジュールは必要最低限に絞り、共通処理はプラグインやユーティリティ関数として切り出すのが望ましいです。

モジュールの順序制御を忘れない

複数モジュール間で依存関係がある場合、アルファベット順だけでは意図した順序にならないことがあります。ディレクトリ名に番号を付けて順序を明示的に制御しましょう。


まとめ

Nuxtのmodules/ディレクトリを活用したローカルモジュール機能は、プロジェクト固有の機能を整理し、開発効率と保守性を大幅に向上させます。APIルートの追加やカスタムプラグインの分離、機能ごとのモジュール化など、実務での利用シーンは多岐にわたります。

ただし、SSR/CSRの違いやHydrationエラー、パフォーマンス面の注意点を理解し、適切に設計することが重要です。モジュールの順序制御も忘れずに行い、チーム開発での役割分担や機能管理に役立ててください。

Nuxtのローカルモジュール機能を正しく使いこなすことで、よりスケーラブルでメンテナブルなアプリケーション開発が実現します。