definePageMeta
ページコンポーネントのメタデータを定義します。
definePageMeta は、pages/ ディレクトリにある ページ コンポーネントのメタデータを設定するために使用できるコンパイラマクロです(別途設定されていない限り)。この方法で、Nuxt アプリケーションの各静的または動的ルートにカスタムメタデータを設定できます。
definePageMeta({
layout: 'default'
})型
definePageMeta(meta: PageMeta) => void
interface PageMeta {
validate?: (route: RouteLocationNormalized) => boolean | Promise<boolean> | Partial<NuxtError> | Promise<Partial<NuxtError>>
redirect?: RouteRecordRedirectOption
name?: string
path?: string
props?: RouteRecordRaw['props']
alias?: string | string[]
pageTransition?: boolean | TransitionProps
layoutTransition?: boolean | TransitionProps
viewTransition?: boolean | 'always'
key?: false | string | ((route: RouteLocationNormalizedLoaded) => string)
keepalive?: boolean | KeepAliveProps
layout?: false | LayoutKey | Ref<LayoutKey> | ComputedRef<LayoutKey>
middleware?: MiddlewareKey | NavigationGuard | Array<MiddlewareKey | NavigationGuard>
scrollToTop?: boolean | ((to: RouteLocationNormalizedLoaded, from: RouteLocationNormalizedLoaded) => boolean)
[key: string]: unknown
}
パラメータ
meta
-
型:
PageMeta以下のページメタデータを受け入れるオブジェクトです:
name-
型:
stringこのページのルートに名前を定義できます。デフォルトでは、
pages/ディレクトリ内のパスに基づいて名前が生成されます。
path-
型:
stringファイル名で表現できるよりも複雑なパターンがある場合、カスタム正規表現を定義できます。
props-
ルートの
paramsをページコンポーネントに渡されるプロパティとしてアクセスできるようにします。
alias-
型:
string | string[]レコードのエイリアス。レコードのコピーのように振る舞う追加のパスを定義できます。
/users/:idや/u/:idのようなパスの省略形を持つことができます。すべてのaliasとpathの値は同じパラメータを共有する必要があります。
keepalive-
型:
boolean|KeepAlivePropsルート変更時にページの状態を保持したい場合や、細かい制御のために
KeepAlivePropsを使用する場合にtrueに設定します。
key-
型:
false|string|((route: RouteLocationNormalizedLoaded) => string)<NuxtPage>コンポーネントが再レンダリングされるタイミングをより制御したい場合にkey値を設定します。
layout-
型:
false|LayoutKey|Ref<LayoutKey>|ComputedRef<LayoutKey>各ルートのレイアウトの静的または動的な名前を設定します。デフォルトのレイアウトを無効にする必要がある場合は、
falseに設定できます。
layoutTransition-
型:
boolean|TransitionProps現在のレイアウトに適用するトランジションの名前を設定します。この値を
falseに設定してレイアウトトランジションを無効にすることもできます。
middleware-
型:
MiddlewareKey|NavigationGuard|Array<MiddlewareKey | NavigationGuard>definePageMeta内で匿名または名前付きのミドルウェアを直接定義します。ルートミドルウェアについて詳しく学びましょう。
pageTransition-
型:
boolean|TransitionProps現在のページに適用するトランジションの名前を設定します。この値を
falseに設定してページトランジションを無効にすることもできます。
viewTransition-
型:
boolean | 'always'実験的機能であり、nuxt.config ファイルで有効にした場合のみ利用可能
現在のページのビュー遷移を有効/無効にします。trueに設定すると、ユーザーのブラウザがprefers-reduced-motion: reduceに一致する場合、Nuxt はトランジションを適用しません(推奨)。alwaysに設定すると、Nuxt は常にトランジションを適用します。
redirect-
ルートが直接一致した場合にリダイレクトする場所。リダイレクトはナビゲーションガードの前に発生し、新しいターゲット位置で新しいナビゲーションをトリガーします。
validate-
型:
(route: RouteLocationNormalized) => boolean | Promise<boolean> | Partial<NuxtError> | Promise<Partial<NuxtError>>指定されたルートがこのページで有効にレンダリングできるかどうかを検証します。有効であれば true を返し、そうでなければ false を返します。他の一致が見つからない場合、これは 404 を意味します。また、
statusCode/statusMessageを含むオブジェクトを直接返して、すぐにエラーで応答することもできます(他の一致はチェックされません)。
scrollToTop-
型:
boolean | (to: RouteLocationNormalized, from: RouteLocationNormalized) => booleanNuxt にページをレンダリングする前にトップにスクロールするかどうかを指示します。Nuxt のデフォルトのスクロール動作を上書きしたい場合は、
~/app/router.options.tsで行うことができます(詳細はカスタムルーティングを参照)。
[key: string]-
型:
any上記のプロパティに加えて、カスタムメタデータを設定することもできます。
metaオブジェクトの型を拡張することで型安全な方法で行うことができます。
-
例
基本的な使用法
以下の例は次のことを示しています:
keyが値を返す関数である方法keepaliveプロパティが複数のコンポーネント間を切り替える際に<modal>コンポーネントがキャッシュされないようにする方法pageTypeをカスタムプロパティとして追加する方法:
definePageMeta({
key: (route) => route.fullPath,
keepalive: {
exclude: ['modal']
},
pageType: 'Checkout'
})ミドルウェアの定義
以下の例は、definePageMeta 内で function を使用してミドルウェアを定義する方法、または middleware/ ディレクトリにあるミドルウェアファイル名に一致する string として設定する方法を示しています:
definePageMeta({
// 関数としてミドルウェアを定義
middleware: [
function (to, from) {
const auth = useState('auth')
if (!auth.value.authenticated) {
return navigateTo('/login')
}
if (to.path !== '/checkout') {
return navigateTo('/checkout')
}
}
],
// ... または文字列
middleware: 'auth'
// ... または複数の文字列
middleware: ['auth', 'another-named-middleware']
})カスタム正規表現の使用
カスタム正規表現は、重複するルート間の競合を解決する良い方法です。例えば:
2つのルート "/test-category" と "/1234-post" は、[postId]-[postSlug].vue と [categorySlug].vue のページルートの両方に一致します。
[postId]-[postSlug] ルートで postId に対して数字 (\d+) のみを一致させることを確認するために、次のように [postId]-[postSlug].vue ページテンプレートに追加できます:
definePageMeta({
path: '/:postId(\\d+)-:postSlug'
})詳細な例については、Vue Router のマッチング構文を参照してください。
レイアウトの定義
デフォルトでlayouts/ ディレクトリにあるレイアウトのファイル名に一致するレイアウトを定義できます。また、layout を false に設定してレイアウトを無効にすることもできます:
tips
このセクションは公式ドキュメントの翻訳ではなく、本サイト独自の補足記事です。
definePageMeta の補足解説:ページメタデータ管理の実務ポイント
Nuxt でページごとにメタデータを設定できる definePageMeta は、ルーティングやレイアウト、ミドルウェアなどの挙動を柔軟に制御できる強力な機能です。
しかし、公式ドキュメントだけでは実務での使いどころや注意点がわかりづらいこともあります。
本記事では、definePageMeta の基本的な使い方に加え、実務での活用例やパフォーマンス面の注意点、SSR/CSRの挙動に関する落とし穴を丁寧に解説します。
これにより、Nuxt アプリケーションのページ管理をより効率的かつ安全に行えるようになります。
まず結論:definePageMeta のポイント
- ページ単位でルート名、パス、レイアウト、ミドルウェア、トランジションなどを柔軟に設定可能
- 動的ルートのカスタム正規表現やキャッシュ制御(keepalive)もここで指定できる
- ミドルウェアをページ単位で直接定義でき、認証やリダイレクト処理を簡潔に実装可能
- SSR/CSR の切り替え時に Hydration エラーやパフォーマンス低下を招く設定ミスに注意が必要
- ページ遷移時のスクロール制御やトランジションの細かい挙動もここで管理できる
いつ使うべきか・使わない方がよいケース
使うべきケース
- ページごとに異なるレイアウトやトランジションを適用したいとき
- ページ単位で認証やアクセス制御のミドルウェアを設定したいとき
- 動的ルートのパラメータに対してカスタム正規表現を使い、ルーティングの競合を防ぎたいとき
- ページのキャッシュ(keepalive)を制御して、ユーザー体験を向上させたいとき
- ページ遷移時のスクロール位置を細かく制御したいとき
使わない方がよいケース
- 単純な静的ページで特別なルート制御やレイアウト変更が不要な場合(過剰設定になる)
- グローバルなミドルウェアやレイアウトで十分に対応できる場合
- ページ間で状態を共有したいが、keepalive の誤用で状態管理が複雑化する恐れがある場合
実務でよくあるユースケースとサンプルコード
1. ページごとに異なるレイアウトを設定する
管理画面やユーザー向けページでレイアウトを切り替えたい場合に便利です。
definePageMeta({
layout: 'admin' // layouts/admin.vue を使用
})
2. 認証ミドルウェアをページ単位で設定する
ログインが必要なページにだけ認証チェックを入れたいとき。
definePageMeta({
middleware: 'auth' // middleware/auth.ts に認証ロジックを記述
})
匿名関数で直接ミドルウェアを定義することも可能です。
definePageMeta({
middleware: [
(to, from) => {
const user = useState('user')
if (!user.value.isLoggedIn) {
return navigateTo('/login')
}
}
]
})
3. 動的ルートのパラメータに正規表現を指定して競合を防ぐ
数字のみの ID と文字列スラッグのルートが競合する場合に有効です。
definePageMeta({
path: '/:postId(\\d+)-:postSlug'
})
よくある落とし穴・注意点
SSR と CSR の違いによる Hydration エラー
keyプロパティを動的に設定しないと、ページ遷移時に Vue の再利用がうまくいかず Hydration エラーが発生することがあります。- 例えば、動的ルートで
keyにroute.fullPathを指定すると、URLごとにコンポーネントが再生成されるため安全です。
keepalive の誤用によるメモリリークや状態不整合
- ページの状態をキャッシュする
keepaliveは便利ですが、キャッシュしすぎると古い状態が残り続けることがあります。 - モーダルなど一時的なコンポーネントは除外設定を忘れないようにしましょう。
ミドルウェアの非同期処理とナビゲーションの競合
- ミドルウェアで非同期処理を行う場合、Promise の解決を正しく待たないと意図しないリダイレクトや画面遷移が発生します。
async関数を使い、awaitで処理を完了させることが重要です。
パフォーマンスへの影響
- ページごとに大量のミドルウェアや複雑なトランジションを設定すると、初期表示やページ遷移が遅くなる可能性があります。
- 必要最低限の設定に留め、共通処理はグローバルミドルウェアやレイアウトでまとめるのが望ましいです。
まとめ
definePageMeta は Nuxt のページごとの挙動を細かく制御できる便利な機能ですが、使い方を誤ると SSR/CSR の不整合やパフォーマンス低下を招くことがあります。
実務では、レイアウト切り替えや認証ミドルウェアの設定、動的ルートの正規表現指定などに活用しつつ、key や keepalive の設定には特に注意しましょう。
適切に使いこなすことで、Nuxt アプリのユーザー体験と開発効率を大きく向上させることができます。
ページメタデータは型安全に拡張可能です。TypeScript を活用して独自のカスタムメタを定義し、プロジェクト固有の要件に対応しましょう。
ミドルウェアを匿名関数で定義する場合は、コードの可読性と再利用性を考慮し、必要に応じて外部ファイルに切り出すことをおすすめします。
※このページは Nuxt.js 公式ドキュメントの翻訳ページです。
公式ドキュメントの該当ページはこちら:
https://nuxt.com/docs/3.x/api/utils/define-page-meta