brand logo

ドキュメント

addRouteMiddleware

addRouteMiddleware() は、アプリケーション内で動的にミドルウェアを追加するためのヘルパー関数です。

ルートミドルウェアは、Nuxtアプリケーションの middleware/ ディレクトリに保存されているナビゲーションガードです(別の設定をしない限り)。

function addRouteMiddleware (name: string, middleware: RouteMiddleware, options?: AddRouteMiddlewareOptions): void
function addRouteMiddleware (middleware: RouteMiddleware): void

interface AddRouteMiddlewareOptions {
  global?: boolean
}

パラメータ

name

  • 型: string | RouteMiddleware

string または RouteMiddleware 型の関数のいずれかです。関数は次のルート to を最初の引数として、現在のルート from を2番目の引数として受け取ります。どちらもVueルートオブジェクトです。

ルートオブジェクトの利用可能なプロパティについて詳しく学びましょう。

middleware

  • 型: RouteMiddleware

2番目の引数は RouteMiddleware 型の関数です。上記と同様に、tofrom のルートオブジェクトを提供します。addRouteMiddleware() の最初の引数がすでに関数として渡されている場合、これはオプションになります。

options

  • 型: AddRouteMiddlewareOptions

オプションの options 引数を使用すると、ルーターミドルウェアがグローバルかどうかを示すために global の値を true に設定できます(デフォルトでは false に設定されています)。

名前付きルートミドルウェア

名前付きルートミドルウェアは、最初の引数として文字列を、2番目の引数として関数を提供することで定義されます。

plugins/my-plugin.ts
export default defineNuxtPlugin(() => {
  addRouteMiddleware('named-middleware', () => {
    console.log('Nuxtプラグインに追加された名前付きミドルウェア')
  })
})

プラグインで定義されると、middleware/ ディレクトリにある同名の既存のミドルウェアを上書きします。

グローバルルートミドルウェア

グローバルルートミドルウェアは、次の2つの方法で定義できます。

  • 名前なしで最初の引数として関数を直接渡します。これにより、自動的にグローバルミドルウェアとして扱われ、すべてのルート変更時に適用されます。

    plugins/my-plugin.ts
    export default defineNuxtPlugin(() => {
      addRouteMiddleware((to, from) => {
        console.log('すべてのルート変更時に実行される匿名のグローバルミドルウェア')
      })
    })
    
  • オプションの3番目の引数 { global: true } を設定して、ルートミドルウェアがグローバルであるかどうかを示します。

    plugins/my-plugin.ts
    export default defineNuxtPlugin(() => {
      addRouteMiddleware('global-middleware', (to, from) => {
          console.log('すべてのルート変更時に実行されるグローバルミドルウェア')
        },
        { global: true }
      )
    })
    

tips

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

NuxtのaddRouteMiddlewareとは?動的ルートミドルウェアの活用メリット

Nuxtのルートミドルウェアは、ページ遷移時の処理を柔軟に制御できる重要な機能です。通常はmiddleware/ディレクトリにファイルを置いて静的に定義しますが、addRouteMiddlewareを使うとプラグインやコードの任意のタイミングで動的にミドルウェアを追加できます。

これにより、アプリケーションの状態や環境に応じてミドルウェアを切り替えたり、条件付きで処理を挿入したりすることが可能です。例えば、認証状態に応じて特定のルートガードを動的に追加したり、外部サービスの初期化完了後にのみ特定の処理を実行したりといった柔軟な対応ができます。

本記事では、addRouteMiddlewareの基本的な使い方から実務での活用例、注意すべきポイントまで丁寧に解説します。


まず結論:addRouteMiddlewareのポイント

  • ルートミドルウェアを動的に追加できるため、静的ファイルに依存しない柔軟なルーティング制御が可能
  • 名前付きミドルウェアと匿名(グローバル)ミドルウェアの両方を登録できる
  • グローバルミドルウェアはすべてのルート遷移時に実行される
  • プラグイン内での利用が一般的で、既存のミドルウェアを上書きすることも可能
  • globalオプションでグローバル適用を明示的に指定できる

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

使うべきケース

  • 動的にミドルウェアを切り替えたいとき
    例:ユーザーの認証状態や権限に応じて異なるミドルウェアを適用したい場合

  • プラグインや外部ライブラリの初期化完了後に処理を挿入したいとき
    静的なmiddleware/ファイルでは対応しづらいタイミング制御が可能

  • 既存のミドルウェアを上書きしたいとき
    プラグインで同名のミドルウェアを登録すると、middleware/のものを上書きできる

  • グローバルにすべてのルート遷移で共通処理を実行したいとき
    例えばログや分析ツールのトラッキング処理など

使わない方がよいケース

  • 単純な静的ルートガードだけで十分な場合
    静的ファイルで管理したほうがコードの見通しが良く、保守性が高い

  • ミドルウェアの数が多く複雑になりすぎる場合
    動的追加を多用すると処理の追跡が難しくなるため、設計を見直すべき

  • SSRの初期レンダリング時に特定の処理を確実に実行したい場合
    動的追加のタイミングによっては初期レンダリングに間に合わないことがあるため注意


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

1. 認証状態に応じて動的にミドルウェアを切り替える

ユーザーのログイン状態を監視し、認証が必要なページにのみ認証ミドルウェアを追加する例です。

export default defineNuxtPlugin((nuxtApp) => {
  const isAuthenticated = useAuthState() // 仮の認証状態取得

  if (isAuthenticated.value) {
    addRouteMiddleware('auth', (to, from) => {
      if (!isAuthenticated.value) {
        return navigateTo('/login')
      }
    })
  }
})

このように、認証状態に応じてミドルウェアの登録を動的に制御できます。

2. 外部APIの初期化完了後にグローバルミドルウェアを追加

外部サービスの初期化が完了してから、すべてのルート遷移でトラッキング処理を実行したい場合。

export default defineNuxtPlugin(async () => {
  await initializeAnalytics()

  addRouteMiddleware((to, from) => {
    trackPageView(to.fullPath)
  })
})

初期化が終わるまではミドルウェアが登録されないため、無駄な処理を防げます。

3. 既存のミドルウェアをプラグインで上書き

middleware/auth.tsがある場合に、プラグインで上書きして挙動を変更する例。

export default defineNuxtPlugin(() => {
  addRouteMiddleware('auth', (to, from) => {
    console.log('プラグインで上書きされた認証ミドルウェア')
    // 独自の認証ロジック
  })
})

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

SSRとCSRの違いによるタイミング問題

動的にミドルウェアを追加するタイミングが遅れると、SSRの初期レンダリング時にミドルウェアが適用されず、意図しない挙動になることがあります。プラグインの実行タイミングを考慮し、必要ならserverclientの実行環境を分けて制御しましょう。

Hydration時の不整合に注意

クライアント側で動的にミドルウェアを追加した場合、サーバー側レンダリング結果と差異が生じるとHydrationエラーの原因になります。可能な限りサーバー側でも同じミドルウェアが登録されるように設計してください。

パフォーマンスへの影響

グローバルミドルウェアはすべてのルート遷移で実行されるため、処理が重いとページ遷移のレスポンスが悪化します。必要最低限の処理に留め、重い処理は非同期化や遅延実行を検討しましょう。

ミドルウェアの重複登録に注意

同じ名前で複数回addRouteMiddlewareを呼ぶと上書きされますが、匿名関数でグローバルミドルウェアを複数登録するとすべて実行されます。意図しない重複登録を避けるため、登録管理をしっかり行いましょう。


まとめ

addRouteMiddlewareはNuxtのルートミドルウェアを動的に追加できる強力なAPIです。認証や外部サービス連携など、動的な条件に応じたルーティング制御を実現できます。ただし、SSRやHydrationのタイミング、パフォーマンス面での注意も必要です。

実務ではプラグイン内での利用が多く、既存ミドルウェアの上書きやグローバルミドルウェアの登録に活用されます。静的なmiddleware/ファイルと使い分けて、より柔軟で保守性の高いNuxtアプリケーションを構築しましょう。


動的ミドルウェアは強力ですが、乱用するとコードの追跡が難しくなります。設計段階で静的ミドルウェアとの役割分担を明確にすることをおすすめします。