brand logo

ドキュメント

モジュール

Nuxtはフレームワークのコアを拡張し、統合を簡素化するためのモジュールシステムを提供します。

Nuxtモジュールの探求

Nuxtで本番グレードのアプリケーションを開発する際、フレームワークのコア機能だけでは不十分だと感じることがあります。Nuxtは設定オプションやプラグインで拡張できますが、これらのカスタマイズを複数のプロジェクトで維持するのは面倒で、繰り返しが多く、時間がかかります。一方で、すべてのプロジェクトのニーズを標準でサポートすると、Nuxtは非常に複雑で使いにくくなります。

これが、Nuxtがコアを拡張するためのモジュールシステムを提供している理由の一つです。Nuxtモジュールは非同期関数であり、nuxt devを使用して開発モードでNuxtを開始する際や、nuxt buildでプロジェクトを本番用にビルドする際に順次実行されます。これらはテンプレートを上書きしたり、webpackローダーを設定したり、CSSライブラリを追加したり、他にも多くの有用なタスクを実行できます。

何よりも素晴らしいのは、Nuxtモジュールがnpmパッケージとして配布できることです。これにより、プロジェクト間で再利用したり、コミュニティと共有したりすることが可能になり、高品質なアドオンのエコシステムを作り出すのに役立ちます。

こちらも参照 modules

Nuxtモジュールを追加する

モジュールをインストールしたら、modulesプロパティの下にnuxt.config.tsファイルに追加できます。モジュール開発者は通常、使用方法の追加手順や詳細を提供します。

nuxt.config.ts
export default defineNuxtConfig({
  modules: [
    // パッケージ名を使用(推奨される使用法)
    '@nuxtjs/example',

    // ローカルモジュールを読み込む
    './modules/example',

    // インラインオプションでモジュールを追加
    ['./modules/example', { token: '123' }],

    // インラインモジュール定義
    async (inlineOptions, nuxt) => { }
  ]
})

Nuxtモジュールは現在ビルド時のみで、Nuxt 2で使用されていたbuildModulesプロパティはmodulesに置き換えられました。

Nuxtモジュールを作成する

誰もがモジュールを開発する機会があり、あなたが何を作るのか楽しみにしています。

こちらも参照 モジュール作成ガイド

tips

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

はじめに:Nuxtモジュールがもたらす利便性とは

Nuxtはシンプルな設定だけでも強力なアプリケーションを構築できますが、実際の開発現場ではプロジェクトごとに異なる要件や複雑な機能を追加したい場面が多々あります。そんなとき、単に設定ファイルを編集したりプラグインを追加するだけでは管理が煩雑になり、保守性が低下しがちです。

そこで役立つのがNuxtのモジュールシステムです。モジュールはNuxtのコア機能を拡張し、共通の機能や設定をパッケージ化して複数プロジェクトで再利用できる仕組みです。これにより、開発効率の向上やコードの一元管理が可能になり、チーム開発や大規模プロジェクトでも安定した運用が実現します。


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

  • 再利用性の向上:共通機能をモジュール化し、複数プロジェクトで簡単に使い回せる
  • 開発効率の改善:設定やプラグインの追加を一元管理し、手動の繰り返し作業を削減
  • 柔軟な拡張性:ビルド時に非同期で処理を実行し、テンプレートやwebpack設定などを自在にカスタマイズ可能
  • コミュニティとの共有:npmパッケージとして配布でき、他者のモジュールも活用しやすい
  • ビルド時のみ実行:モジュールはビルドフェーズで動作し、実行時のパフォーマンスに影響を与えにくい

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

使うべきケース

  • 複数プロジェクトで共通の設定や機能を使いたいとき
  • カスタムのwebpackローダーやビルド設定を追加したいとき
  • CSSフレームワークや外部ライブラリの統合を簡単にしたいとき
  • チームで共有する独自の機能セットを作成したいとき
  • プロジェクトの拡張性を高め、将来的なメンテナンスを楽にしたいとき

使わない方がよいケース

  • 単一プロジェクトでしか使わない小規模なカスタマイズの場合(設定ファイルで十分)
  • 実行時に動的に切り替えたい処理(モジュールはビルド時のみ実行されるため)
  • モジュールの仕組みを理解せずに無理に導入すると、かえって複雑化する恐れがある場合

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

1. CSSフレームワークの統合

複数プロジェクトでTailwind CSSを使う場合、モジュール化して共通設定を管理すると便利です。

// nuxt.config.ts
export default defineNuxtConfig({
  modules: [
    '@nuxtjs/tailwindcss'
  ]
})

独自のTailwind設定を含むモジュールを作成し、npmパッケージとして配布することも可能です。


2. APIクライアントの共通設定

APIのベースURLや認証トークンを共通化したモジュールを作成し、複数プロジェクトで使い回す例です。

// modules/api-client/index.ts
export default function ApiClientModule(moduleOptions, nuxt) {
  nuxt.options.runtimeConfig.public.apiBase = moduleOptions.baseURL || 'https://api.example.com'
}
// nuxt.config.ts
export default defineNuxtConfig({
  modules: [
    ['./modules/api-client', { baseURL: 'https://api.myapp.com' }]
  ]
})

3. カスタムビルド設定の追加

webpackのローダーを追加したい場合、モジュールで設定を注入できます。

export default function CustomLoaderModule(_, nuxt) {
  nuxt.hook('webpack:config', (configs) => {
    configs.forEach(config => {
      config.module.rules.push({
        test: /\.example$/,
        loader: 'example-loader'
      })
    })
  })
}

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

SSRとCSRの違いに注意

モジュールはビルド時に実行されるため、実行時のクライアントサイドの状態に依存する処理はできません。例えば、ユーザーのブラウザ環境に応じて動的に設定を変えたい場合は、モジュールではなくプラグインやミドルウェアで対応する必要があります。

Hydrationエラーの原因になりやすい

モジュールでテンプレートや設定を変更した結果、サーバーとクライアントでレンダリング結果が異なるとHydrationエラーが発生します。モジュールの変更はビルド時に確定するため、動的な値を直接埋め込まないように注意しましょう。

パフォーマンスへの影響

モジュールはビルド時に処理を行うため、複雑な処理や大量のファイル操作を含むとビルド時間が長くなる可能性があります。必要な処理だけに絞り、効率的な実装を心がけましょう。


まとめ

Nuxtのモジュールシステムは、プロジェクトの拡張性と再利用性を高める強力な仕組みです。複数プロジェクトで共通の機能を管理したい場合や、ビルド時に柔軟なカスタマイズを加えたい場合に特に有効です。一方で、ビルド時のみの実行という特性を理解し、適切な用途で使うことが重要です。

実務での活用例を参考にしつつ、パフォーマンスやSSR/CSRの違いに注意しながらモジュールを設計すれば、Nuxt開発の効率と品質を大きく向上させることができるでしょう。