NuxtのSEO
Nuxtはデフォルトでサーバーサイドレンダリングを提供しますが、これはルートごとの設定であり、保証ではありません。クローラーに完全なHTMLを提供するのは、その設定を維持するルートのみです。レンダリングモード、useSeoMeta()、@nuxtjs/seoツールキット、ハイドレーションとNitroの注意点、Core Web Vitals、そして静かにコストをかけるミスについて解説します。
言語
このページには証拠シグナルが1件あります
- 関連するライブツールCore Web Vitals History & Competitor Comparison
Nuxtはデフォルトでページをサーバーレンダリングするため、そのデフォルトを維持するルートは、プレーンなVue SPAが提供する空のシェルではなく、クローラーに完全なHTMLドキュメントを提供します。ただし、これはルートごとの設定であり、routeRulesやグローバルなssr:falseによって任意のルートをCSRに切り替えることができるため、フレームワーク名から推測するのではなく、実際のルートを確認してください。基本的な決定はルートごとのレンダリングモード(SSR(デフォルト)、nuxt generateによるSSG、またはハイブリッドルートルール)です。メタタグ、スキーマ、サイトマップはすべてその後に続くからです。メタにはuseSeoMeta()を使用し、Harlan Wiltonの@nuxtjs/seoバンドルはrobots/sitemap/OG/schema/canonical用のオプションのサードパーティツールキット(Nuxtコアではない)として扱い、動的レンダリングには決して手を出さず(Googleは非推奨)、ハイドレーション/ペイロードとNitroのデプロイメントプリセット/キャッシュ動作をサーバーHTMLとは独立して検証し、AIクローラーのレンダリング契約はプロバイダーによって異なることを覚えておいてください。SSR/SSGはコンテンツを生のHTMLに配置し、カバレッジを最大化します。
TL;DR — Nuxt は Vue を基盤に構築されたフレームワークで、SEO に適している主な理由は 1 つです。デフォルトを維持したルートでは、サーバー側でページを構築するため、検索エンジンは空白のページではなく完成した HTML ページを取得できます。これはサイト全体の保証ではなく、ルートごとの設定です。
routeRulesまたはグローバルなssr: falseにより、任意のルートを通常の Vue スタイルの空のシェルに戻すことができます。プロジェクト名だけでなく、実際のルートを確認してください。最も重要な選択は、各ルートがどのようにレンダリングされるかです。それ以外(メタタグ、サイトマップ)はその後に続きます。
Nuxt が SEO に適している理由 — デフォルトを維持したルートの場合
Vue 単体では、シングルページアプリケーションを構築します。サーバーはほぼ空の HTML シェルを送信し、JavaScript がブラウザで実行されるとコンテンツを埋め込みます。これは検索にとって厄介です。なぜなら、JavaScript が実行されるまでページは空に見えるからです。
Nuxt は Vue の「メタフレームワーク」— Vue を中心に構築されたより完全なツールキット — であり、そのデフォルトがこの問題を解決します。Nuxt はまずサーバー側でページをレンダリングするため(サーバーサイドレンダリング、略して SSR)、Google や訪問者が SSR がオフになっていないルートのページを要求すると、すぐに完全な HTML を取得できます。 Evidence for this claim Nuxt universal rendering returns server-rendered HTML to the browser by default. Scope: Nuxt default universal rendering. Confidence: high · Verified: Nuxt: Rendering modes JavaScript を待つ必要はありません。これが、Nuxt サイトが通常の Vue アプリよりもインデックスされやすい可能性がある最大の理由ですが、これはルートごとの結果であり、フレームワーク名が保証するものではありません。ssr: false のルートや、メインコンテンツを <ClientOnly> に依存するルートは、その利点を放棄し、通常の Vue と同じ空のシェル問題を抱えることになります。
最も重要な決定: ルートごとのレンダリング
誰かが特定のページを要求したとき、その HTML はどこで構築されるのでしょうか? これは routeRules レベルの問題であり、プロジェクト全体の問題ではありません。Nuxt アプリはルート間でモードを混在させることができます。Nuxt にはいくつかのオプションがあります:
- サーバーサイドレンダリング (SSR) — デフォルト。サーバーはリクエストごとに完全なページを構築します。SEO に最適です。
- 静的生成 (SSG) —
nuxt generateを実行すると、Nuxt はすべてのページを事前にプレーンな HTML ファイルとして構築します。これも SEO に最適で、毎分更新されないブログやドキュメントに最適です。 - SPA モード — ページは通常の Vue のようにブラウザで構築されます。検索で見つけたいものにはこれを避けてください。
良いニュースは、デフォルトがすでに正しい方向を向いていることです。基本的には、それらをオフにしないようにするだけです。
タイトルとメタタグの追加
Nuxt では、useSeoMeta() という組み込み関数を使用してページタイトルとメタディスクリプションを設定します。 Evidence for this claim Nuxt provides useSeoMeta for defining SEO and social metadata. Scope: Current Nuxt composable. Confidence: high · Verified: Nuxt: useSeoMeta これをページに配置し、タイトル、説明、ソーシャル共有画像を渡します:
useSeoMeta({
title: 'My Page Title',
description: 'A concise, page-specific summary with the key information first',
})これが現代的で推奨される方法です。(useHead() という古い関数もあり、これは引き続き機能し、ページの <head> 内の他の目的に使用されますが、SEO メタタグには useSeoMeta() を使用してください。) Google にはメタディスクリプションの固定文字数制限はありません。スニペットはクエリに依存し、デバイスに合わせて切り詰められるため、割り当てに合わせてコーディングするのではなく、重要なページを意図した言語とスクリプトでプレビューしてください。
オプションのアドオン: Nuxt SEO モジュール
Nuxt コアは robots.txt、XML サイトマップ、ソーシャル共有画像、構造化データ、正規 URL を生成しません。これらは別のオプションのパッケージの役割であり、nuxt.config.ts がデフォルトで提供するものではありません。Harlan Wilton という開発者が、これらのパッケージの無料のコミュニティバンドルを維持しており、@nuxtjs/seo としてインストールされ、これらすべてを一度にカバーします。これはサードパーティのツールキットであり、Nuxt 自体の一部ではないため、インストールしても自動的に出力が正しくなるわけではありません。生成されたサイトマップ、robots ルール、スキーマが実際に望むものと一致することを確認する必要があります。
よくある誤解
「Vue/NuxtはGoogleに載らない」と思われがちです。それは何年も前の素のVueアプリにはある程度当てはまりましたが、サーバーレンダリングを備えたNuxtには当てはまりません。実際の失敗は、うっかりSSRをオフにしてしまったり、JavaScriptファイルをブロックしてGoogleがページを構築できないようにすることなどです。
もっと深い内容(レンダリングモードの全メニュー、モジュールエコシステムの詳細、Core Web Vitals、よくある間違いとその修正)を知りたいですか?詳細タブに切り替えてください。
TL;DR — Nuxtのデフォルトはサーバーサイドレンダリングなので、そのデフォルトを維持するルートは、素のVue SPAが配信する空のシェルではなく完全なDOMを取得します。ただし、これはルートごとの結果です。
ssr: falseやrouteRulesの上書きにより、任意のルートをCSRやハイブリッドに変更できるため、プロジェクト名ではなく実際のルートをテストしてください。レンダリング戦略は基盤となる決定です。SSR(デフォルト)、SSG(nuxt generate)、またはハイブリッドrouteRulesのいずれかで、メタ、スキーマ、サイトマップはすべてその後に続くからです。メタタグにはuseSeoMeta()を使用し(それ以外のheadにはuseHead()、リアクティビティが不要な場合はサーバー専用バリアント)、Harlan Wiltonの@nuxtjs/seoバンドルはrobots/sitemap/OG/schema/canonical用のオプションのサードパーティツールキットとして扱ってください。Nuxtコアの一部ではなく、確認するまでその出力が正しいという証明にもなりません。動的レンダリングは使用しないでください(Googleは非推奨にしました)。AIクローラーのレンダリングはプロバイダーによって異なります。SSR/SSGは生のHTMLカバレッジを最大化します。初期HTMLの他に、ハイドレーション/ペイロード、Nitroデプロイメントプリセットとキャッシュ、直接のHTTPステータスを個別に検証してください。サーバーHTMLだけではそれらのいずれも証明できません。通常のJS-SEOルールは引き続き適用されます。実際の<a href>リンク、JS/CSSのブロック禁止、レンダリング済みHTMLと生HTMLの確認などです。
NuxtはSPA問題に対するVueの答え
Vue単体では、シングルページアプリケーション(HTMLシェルとブラウザでDOMを構築するJavaScript)を配信します。NuxtはVueの上に構築されたメタフレームワークで(Nuxt 3ではNitroサーバーエンジン上で動作し、Nuxt 4は2025年に続きます)、SEOの観点から見た存在理由は、デフォルトでサーバー上でレンダリングすることです。すべてのページが完全に形成されたHTMLドキュメントとして届くため、GooglebotがJavaScriptを実行せずに読み取るのに最適です。素のVue SEOは独自のトピックであり、独自の失敗モードがあります。ここでは、SPA問題と戦わなくて済むように、あなたがNuxtを選んだことを前提としています。
これはJavaScript全般について私が述べているのと同じ点です。“any kind of SSR, static rendering, and prerendering setup is going to be fine for search engines. Gatsby, Next, Nuxt, etc., are all great.” (翻訳) 「あらゆる種類のSSR、静的レンダリング、プリレンダリングの設定は検索エンジンにとって問題ありません。Gatsby、Next、Nuxtなどはすべて素晴らしいです。」(引用元: JavaScript SEO)Nuxtのデフォルトは正しい方向を向いています。NuxtのSEO問題のほとんどは、人々がこれらのデフォルトをオフにしたり、その上に間違いを重ねたりすることです。
レンダリング戦略が基盤 — プロジェクト単位ではなくルート単位で決定
メタタグ、スキーマ、サイトマップの前に、すべてを決定する質問は、この特定のルートに対してHTMLがどのように生成されるかです。Nuxtはユニバーサル(サーバー)レンダリングをアプリ全体のデフォルトとして文書化していますが、そのデフォルトはルートレベルの保証ではありません。グローバルなssr: falseはアプリ全体をクライアントレンダリングに切り替え、routeRulesは任意のURLパターンに異なるモードを割り当てることができます。「これはNuxtアプリだ」というだけでは、特定のページがどのようにレンダリングされるかはわかりません。ルートを確認する必要があります。Nuxtには5つの戦略があります。
| モード | 設定方法 | SEOへの影響 | 最適な用途 |
|---|---|---|---|
| ユニバーサル / SSR | デフォルト(ssr: true) | 優れている — 毎リクエスト完全なHTML | 動的でパーソナライズされたコンテンツ |
| 静的 / SSG | nuxt generate | 優れている — デプロイ時にHTMLを構築 | ブログ、ドキュメント、マーケティング |
| ハイブリッド | ルートごとにrouteRules | 優れている — ルートごとに混在 | 大規模な混合コンテンツサイト |
| SPA / CSR | ssr: false | インデックスされるコンテンツには不向き | ダッシュボード、管理パネル |
| エッジサイド | デプロイメントターゲット | 優れている — 低TTFB | グローバルパフォーマンス |
公式のNuxtドキュメントは、クライアントサイドレンダリングがコンテンツにとって間違った選択である理由を率直に述べています:「クライアントサイドレンダリングを介して配信されるコンテンツのインデックス作成と更新にはより多くの時間がかかる」 一方、サーバー(ユニバーサル)レンダリングでは 「ウェブクローラーはページのコンテンツを直接インデックスできる。」 Evidence for this claim Nuxt documents that universal rendering delivers HTML content immediately and allows crawlers to index it directly. Scope: Nuxt rendering; no indexing guarantee. Confidence: high · Verified: Nuxt: Rendering modes
(Nuxtレンダリングドキュメント。) CSR
(ssr: false) は、バックオフィス、ダッシュボード、ゲーム向けに位置付けられています — インデックスさせたいものには向いていません。
ハイブリッドレンダリングは大規模サイトにとっての強力な手段です。
nuxt.config.ts のルートルールを使用すると、URLパターンごとにレンダリングモードとキャッシュモードを設定できます:
routeRules: {
'/blog/**': { prerender: true }, // SSG for the blog
'/product/**': { swr: 3600 }, // ISR-style: regenerate hourly
'/admin/**': { ssr: false }, // SPA for the admin area
'/checkout/**': { ssr: true }, // always-fresh SSR
}swr(stale-while-revalidate)と isr(インクリメンタル静的再生成)は、ページを静的に生成してからバックグラウンドで更新します — ページ数が多いeコマースやニュースサイトで、変更のたびに完全な再ビルドが現実的でない場合に最適です。Nuxt
Islands (<NuxtIsland>) は、クライアントサイドのJavaScriptを配信せずにコンポーネントをレンダリングし、ハイドレーションコストを削減してINP — Nuxtアプリで最も問題になることが多いCore Web Vital — を改善します。
実際に配信したものを検証する方法: View Sourceはサーバーが送信した生のHTMLを表示します。コンテンツがそこにあれば、サーバーレンダリングされています。DevToolsのElementsパネルはレンダリングされたDOMを表示します。そしてGSCのURL Inspectionツールは、Googleが実際に取得してレンダリングしたものを表示します — これが真実の情報源です。「ブラウザで問題なく見える」を信頼しないでください。
GooglebotがNuxtアプリを処理する方法
GoogleはあらゆるJavaScriptアプリを3つのフェーズ — クロール、レンダリング、インデックス — で処理します。そして問題はタイミングです:レンダリングはキューで行われ、即座には実行されません。私のJavaScript SEOガイドで述べたように、レンダラーは忍耐強いです — 「レンダラーには固定のタイムアウトはありません… 本当に忍耐強く、心配する必要はありません。」 しかし、忍耐強いことは 新しい コンテンツにとって速いことと同じではありません。クライアントレンダリングされたページを配信する場合、そのレンダリングウェーブが実行されるまで、あなたのコンテンツはGoogleにとって存在しません。SSRとSSGは、最初のフェッチでHTMLが完全に揃っているため、そのギャップを埋めます。
大規模になると、さらに2つのことが重要になります。JavaScriptのレンダリングはコストがかかります — 私の2019年の*JavaScript SEOトーク(Ungagged)から、Googleがレンダリングしなければならない場合、クロールコストは約20倍に増加します(方向性は示しますが、桁は今も変わりません)。そしてGoogleは、生のHTMLとレンダリングされたHTMLの両方で最も制限の厳しいディレクティブを採用します — そのため、JavaScriptによって注入された noindex は生のHTMLの index に勝ち、その逆も同様です。JavaScriptを介して注入されたcanonicalは、生のHTMLにすでにcanonicalがない場合にのみ尊重されます。robotsとcanonicalのシグナルをサーバーレンダリングされたHTMLに保持してください。SSRがオンの場合、Nuxtが自動的に行います。
AIクローラーの現実
これが2026年の難点です。AIクローラー — GPTBot、ClaudeBot、PerplexityBot、その他 — は一般的にJavaScriptをまったく実行しません。生のHTMLのみをインデックスし、それ以外は何もしません。したがって、クライアントレンダリングされたNuxtページは、AIアンサーエンジンにとって事実上見えません。ここではSSRまたはSSGはGoogleにとって単に良いだけではなく、アンサーエンジン最適化のための参入条件でもあります。コンテンツをChatGPT、Perplexity、またはClaudeに引用させたい場合は、最初のフェッチでHTMLに含まれている必要があります。
初期HTMLを超えて:ペイロード、ハイドレーション、ステータスコード
コンテンツを含むサーバーHTMLを取得することは必要ですが、十分ではありません — 最初のレスポンスの後でも、いくつかのことがうまくいかない可能性があります。「View Sourceを確認した」ではそれらをカバーできません:
- ペイロードとハイドレーション。 ユニバーサルレンダリングは、HTML と、クライアントがハイドレーション(イベントリスナーのアタッチや、サーバーが中断した箇所からの再開)に使用するシリアライズ済みデータペイロードを送信します。再フェッチは不要です。サーバーHTMLが正しく見えても、ハイドレーションが成功したこと、クライアント側ナビゲーションが同じコンテンツを再現すること、またはペイロードが古くなっていないことを証明するわけではありません。初回読み込みでは問題なく見えても、クライアント側ルート変更後に壊れる場合、それはレンダリングモードの問題ではなく、ハイドレーション/ペイロードの問題です。
<ClientOnly>とブラウザ限定コンテンツ。 何かを<ClientOnly>でラップする(ブラウザAPI依存のウィジェットで一般的)と、たとえ他の部分がユニバーサルルートであっても、サーバーレスポンスからはその部分が欠落します。メインコンテンツ、重要なリンク、メタタグがクライアント限定の境界内に入ってしまうと、生のHTMLのみを読むクローラーやAIボットは、レンダリングモードの設定に関係なくそれらを見逃します。レンダリングモードの設定だけでなく、実際のレスポンスを検査してください。- ステータスコードとリダイレクトは自己証明ではありません。 ブラウザでレンダリングされるNuxtエラーページや、
navigateTo()/コンポーザブル駆動のリダイレクトは、それ自体では直接のサーバーレスポンスが送信したHTTPステータスを証明しません。Googleのガイダンスは、意味のあるステータスコードがクロールとインデックスに重要であると明示しています。クライアントレンダリングされたエラーページが表示するものではなく、curl -Iで実際のヘッダーを確認してください。
これはどれもユニバーサルレンダリングに反対する議論ではありません。「HTMLがサーバーレンダリングされている」ことが最初のチェックであり、最後のチェックではないというリマインダーです。
Nitro、デプロイプリセット、キャッシュ境界
Nuxtのサーバー出力は Nitro によって構築され、Nitroはターゲットとするデプロイプリセット(Nodeサーバー、Cloudflare、Vercel、Netlify、静的、その他)に応じて異なるコンパイルを行います。これはSEOにとって重要です。プリセットとアダプターは、利用可能なランタイムAPI、キャッシュ動作、ストリーミングサポート、リージョナルデプロイ、ファイルシステムアクセスが異なる可能性があるためです。あるプリセットで動作するルートルールやサーバーハンドラーが、別のプリセットでも同じように動作するとは限りません。想定せずに明示的にテストする価値がある2つの結果を以下に示します。
- キャッシュキーと無効化はルート固有であり、自動ではありません。
swrとisrのルートルールは出力をキャッシュして再生成しますが、間違ったキャッシュキー、欠落した無効化、またはデプロイプラットフォームによって設定されたキャッシュヘッダーにより、クローラーに古い、パーソナライズされた、または一貫性のないHTMLが配信される可能性があります。routeRules設定だけでなく、ライブURLの実際のレスポンスエージとCache-Control/Ageヘッダーを確認してください。 - 本番環境のパリティはステージングの動作では保証されません。 ローカル開発やプレビューデプロイでルートが正しくレンダリングされても、本番プリセットが同じ出力を生成するとは限りません。サーバールート、リダイレクト、エラーハンドリングはNitroのサーバーレイヤーに存在し、そのレイヤーがターゲットによって最も異なる可能性が高い部分です。レンダリングモードを検証するのと同じように、デプロイ変更後は本番URLを直接テストしてください。
メタタグ: useSeoMeta() と useHead()
Nuxtのヘッド管理はUnhead上で動作し、異なる目的のために2つのコンポーザブルを提供します。
useSeoMeta() は SEOおよびソーシャルメタタグ用 に使用するものです。フラットで型安全なAPIで、型付きパラメータを備えています。 Evidence for this claim useSeoMeta is a typed Nuxt API for SEO and social meta tags. Scope: Current Nuxt composable. Confidence: high · Verified: Nuxt: useSeoMeta これは、name を使用すべきところで property を使用するという古典的なOpen Graphのバグを回避するのに役立ちます。
useSeoMeta({
title: 'My Page Title',
ogTitle: 'My Page Title',
description: 'Concise page-specific description with the key information first',
ogDescription: 'Concise social description tailored to this page',
ogImage: 'https://mysite.com/og-image.png', // must be an absolute URL
twitterCard: 'summary_large_image',
})useHead() は、スクリプト、リンクタグ、ボディ属性、タイトルテンプレートなど、その他すべてのための汎用ヘッドツールです。
useHead({
titleTemplate: '%s · My Site Name',
htmlAttrs: { lang: 'en' },
})信頼できるレイヤリングパターンは次のとおりです。nuxt.config.ts で静的デフォルト(charset、viewport、favicon)→ app.vue でサイト全体のタイトルテンプレートとグローバルなOGデフォルト → ページコンポーネントで useSeoMeta() によるページ固有のオーバーライド。よくあるバグは、ページではなくレイアウトに useSeoMeta() を置くことで、特定のページタグが汎用タグで上書きされることです。また、検索エンジンは初期ロードを読むため、SEOメタは一般的にリアクティブである必要はありません。useServerHead() はクライアント側の再実行をスキップします。
どのAPIか、そしてそれが実際に何を証明するか:
| API | スコープ | リアクティブ? | 出力について何を証明するか |
|---|---|---|---|
useSeoMeta() | フラットで型付けされたSEO/ソーシャルメタのみ | はい(デフォルト) | 型付けされたプロパティを正しく設定する — ルートが一意、正規、インデックス可能であることを証明するわけではない。そのロジックは自分で持つ必要がある |
useHead() | <head> 内のすべて — スクリプト、リンク、属性、タイトルテンプレート | はい(デフォルト) | 一般的なヘッド制御。同じ注意点 — APIの使用は正しいサーバーレスポンスの証明にはならない |
useServerHead() / サーバーのみの呼び出し | 上記と同じ | いいえ — サーバーのみ、クライアントの再実行をスキップ | タグがサーバーHTMLに一度だけ含まれることを確認する。クライアントナビゲーションで再設定されるかは確認しない(そこに依存する場合) |
これらのコンポーザブルのいずれかを呼び出すと、APIが実行されたことがわかりますが、それ自体では、直接のサーバーレスポンスやクライアント側のルート変更が実際に何を出力するかはわかりません。「useSeoMeta() を呼び出した」だけでなく、View Source や curl で確認してください。
@nuxtjs/seo モジュールエコシステム(Harlan Wilton)— オプション、コアではない
Nuxtコアは、sitemap、robots.txt、OG画像生成、Schema.orgを標準では提供しません。これらはNuxt自身のプリミティブ(useHead、useSeoMeta、ルートルール、レンダリングモード)の外にあります。コミュニティはそのギャップをHarlan Wiltonの @nuxtjs/seo で埋めています。これは別途インストールするサードパーティの包括パッケージ(nuxtseo.com、現在v5.x、積極的にメンテナンスされ、Nuxt 3,16+ と Nuxt 4 を対象)で、6つのモジュールをバンドルしています。これをインストールすると、sitemap、robots、OG画像、スキーマの生成が得られますが、それ自体ではルートに対して出力が正しいことを保証しません。他のものと同じ方法で生成物を検証してください。
| モジュール | 機能 |
|---|---|
@nuxtjs/robots | robots.txt + メタロボット + X-Robots-Tag ヘッダー |
@nuxtjs/sitemap | ページ + 動的ルートからの自動XMLサイトマップ |
nuxt-og-image | 動的OG画像(Vueテンプレート → 画像) |
nuxt-schema-org | Schema.org JSON-LD構造化データ |
nuxt-seo-utils | 正規URL、パンくずリスト、デフォルト |
nuxt-link-checker | ビルド時の壊れたリンク検出 |
npx nuxt module add seo でバンドル全体をインストールするか、個別のモジュール(npx nuxt module add sitemap robots)を取得します。知っておくべきいくつかの動作:
@nuxtjs/sitemapはpages/ディレクトリと動的ルートから自動生成し、50 000 URLを超えると自動的にサイトマップインデックスに分割し、i18n多言語サイトマップをサポートし、組み込みのIndexNowサポートがあります。正しく設定すべき点:Googleはchangefreqとpriorityを無視します。正確なlastmodだけが重要で、しかもコンテンツが実際に変更された場合のみです。@nuxtjs/robotsはrobots.txt、ロボットメタタグ、X-Robots-Tagヘッダーを生成します。そしてデフォルトでは非本番環境で全クローラーを拒否します。これはまさにヘッドレスビルドを悩ませるステージングインデックス化の落とし穴です。また、ボットごとのルールも提供するので、GPTBotだけをブロックし、他のボットには影響を与えないようにできます(意図的に行ってください — AIクローラーをブロックすると、あなたを引用しなくなります)。nuxt-seo-utilsは正規URLを処理し、便利なことにトラッキングパラメータ(utm_*、fbclid、gclid)を正規URLから自動的に削除します。
nuxt/image と Core Web Vitals
@nuxt/image は画像モジュールです。自動レスポンシブ srcset、最新フォーマット(WebP/AVIF)、CDNプロバイダーによる組み込み最適化、遅延読み込みを提供します。SEO価値の大部分を担う2つのルール:
- LCP画像を遅延読み込みしないでください。 ヒーロー画像は即時読み込み(eager)にするべきです。遅延読み込みすると、Largest Contentful Paint(LCP)が遅れます。
- 必ず
widthとheightを設定して、ブラウザがスペースを確保し、Cumulative Layout Shift(CLS)の影響を受けないようにしてください。
<NuxtImg
src="/hero.jpg"
width="1200"
height="630"
alt="Descriptive alt text"
:loading="isHeroImage ? 'eager' : 'lazy'"
format="webp"
/>2026年の目標値(p75)は、LCP ≤ 2,5秒、INP ≤ 200ms、CLS ≤ 0,1です。Nuxtアプリでは、ハイドレーションによる入力遅延が発生するため、INPが悪化しがちです。これはまさにNuxt Islandsと<NuxtIsland>が解決するためのものです。
Nuxt ContentとSEO
@nuxt/content(Markdown/MDXコンテンツモジュール)を使用している場合、@nuxtjs/seoとの統合は簡単ですが、順序に関する注意点が1つあります。モジュール配列では@nuxtjs/seoを@nuxt/contentの前に読み込んでください。その後、コンテンツのfrontmatter(title、description、robots、ogImage、schemaOrg)でSEOを設定し、コンテンツ取得後にuseSeoMeta()を使って[slug].vueテンプレートに反映できます。これはヘッドレスCMSパターンのNuxtネイティブ版であり、「プラグインが行っていたことを再構築する」という同じ規律が適用されます。
よくあるNuxt SEOの間違い
- インデックスさせたいコンテンツにSPAモード(
ssr: false)を使用する。 最もコストがかかる間違いであり、AIクローラーから見えなくなる原因です。 - OG画像に相対URLを使用する。
ogImageは絶対URLでないと、ソーシャルプレビューが壊れます。 - ページではなくレイアウトで
useSeoMeta()を使用する — 汎用タグがページ固有のタグを上書きします。 - レンダリングされたHTMLを確認しない — ソースの表示 ≠ DevTools ≠ Googleがレンダリングしたもの。URL Inspectionを使用してください。
robots.txtでJS/CSSをブロックする — Googleはブロックされたファイルからレンダリングしません。- 公開後にステージングの
noindex/disallowをそのままにする(または逆に、@nuxtjs/robotsがデフォルトで非本番環境をブロックすることを忘れて、本番は問題ないのにカスタム環境がブロックされる理由がわからない)。 - LCP画像を遅延読み込みする — LCPが悪化します。
- 画像に
width/heightがない — CLSが発生します。 - サイトマップに
changefreq/priorityを含める — Googleはこれらを無視します。lastmodだけが重要です。 - 動的レンダリングに頼る。 Googleはこれを非推奨としています — “dynamic rendering is a workaround and not a long-term solution” (翻訳) 「動的レンダリングは回避策であり、長期的な解決策ではありません」 — そして、設定したエンジンにしか対応せず、BingやすべてのAIクローラーを見逃します。NuxtではSSRとSSGがすでにクローラーに完全なHTMLを提供するため、動的レンダリングは不要です。
llms.txtとAEO
llms.txtはプレーンテキストファイルで、robots.txtのいとこにあたり、AIツールがコンテンツをナビゲートするのに役立ちます。nuxt-llmsモジュールは、Nuxt Contentから/llms.txtと/llms-full.txtを自動生成します。2025年後半時点で、その主な利用者はMCPサーバーやAIコーディングツール(Cursor、Claude Code)であり、ChatGPTやPerplexityが直接利用するわけではありません。ドキュメントサイトや技術ブログに最も有用で、eコマースやニュースサイトにはあまり役立ちません。ドキュメント/開発者サイトであれば追加する価値がありますが、それ以外では優先事項ではありません。
位置づけ
Nuxt SEOは、実際にはJavaScript SEOをNuxt独自の規約を通じて具体的に適用したものです。また、Nuxtフロントエンドがヘッドレスバックエンドからデータを取得する場合、ヘッドレスCMSのSEOトピックと大きく重なります。原則は変わりません。Nuxtは優れたデフォルト設定と、それを実装するための強力なモジュールエコシステムを提供するだけです。
AIまとめ
Advancedバージョンの簡潔な見解:
- Nuxt は Vue のメタフレームワークであり、その SEO 上の利点は 1 つの デフォルト にあります: サーバーサイドレンダリング。そのデフォルトを維持するルートは完全な HTML を配信し、プレーンな Vue SPA が配信する空のシェルではありません — ただし、これはルートごとの結果であり、プロジェクト全体の保証ではありません。
ssr: falseまたはrouteRulesのオーバーライドにより、任意のルートを CSR またはハイブリッドに切り替えることができるため、実際のルートを確認してください。 - レンダリング戦略は基盤であり、ルートごとに決定されます — メタ、スキーマ、サイトマップの前にすべてを決定します。モード: SSR (デフォルト)、SSG (
nuxt generate)、ハイブリッド (routeRules)、SPA (ssr: false、インデックス対象コンテンツでは避ける)、エッジ。 - ハイブリッド
routeRulesは URL ごとにモードを混在させます;swr/isrはバックグラウンドで再生成します; Nuxt Islands はハイドレーションコストを削減し、INP に役立ちます。 - Googlebot はクロール → レンダリング (キューに入れられ、即時ではない) → インデックス作成を行います; 生の HTML とレンダリングされた HTML の間で最も制限の厳しいディレクティブを採用します。レンダリングは約 20 倍のクロールコスト です。SSR/SSG はタイミングのギャップを埋めます。
- AI クローラーのレンダリングはプロバイダー固有です — CSR は、単一の共有契約でカバーされていないクライアント実行に依存するため、SSR/SSG は AI の可視性を最大化します。
- ファーストロード HTML を超えて: ハイドレーション/ペイロードを独立して検証します (サーバー HTML は、ハイドレーションの成功やクライアントナビゲーションの同等性の証明にはなりません)、
<ClientOnly>がユニバーサルルートでもクローラーからコンテンツを隠していないか注意し、クライアントレンダリングされたエラーページを信頼するのではなく、curl -Iで直接 HTTP ステータス/リダイレクトを確認します。 - Nitro とデプロイメントプリセット (Node、Cloudflare、Vercel、Netlify、静的) は、ランタイム API、キャッシュ、ストリーミング、リージョンが異なる場合があります — ルートごとにキャッシュヘッダーと本番環境の同等性をテストし、プリセットが同じように動作するとは想定しないでください。
- メタタグ: SEO/ソーシャル用に
useSeoMeta()(型安全)、その他の head 用にuseHead()、リアクティビティが不要な場合はサーバーのみのバリアント。レイヤー:nuxt.config.ts→app.vue→ ページ。useSeoMeta()をレイアウトに配置しないでください。OG 画像には絶対 URL が必要です。API を呼び出すことは、API が実行されたことを証明しますが、直接レスポンスが何を出力するかは証明しません — View Source/curl で確認してください。 @nuxtjs/seo(Harlan Wilton) はオプションのサードパーティツールキット (v5.x、積極的にメンテナンス、Nuxt 3,16+/4.x) です — Nuxt コアの一部ではありません。robots、sitemap、OG 画像、Schema.org、canonical、リンクチェッカーをバンドルしていますが、インストールしても正しい出力が保証されるわけではありません。サイトマップ:lastmodのみが重要です。robots: デフォルトで非本番環境をブロック; ボットごとの AI ルール。@nuxt/image+ CWV: LCP 画像を遅延読み込みしないでください; 常にwidth/heightを設定してください (CLS)。ターゲット: LCP ≤ 2,5s、INP ≤ 200ms、CLS ≤ 0,1。- 動的レンダリングを使用しないでください — Google はそれを非推奨にしました; Nuxt の SSR/SSG はすでに完全な HTML を提供します。
公式ドキュメント
Nuxt と検索エンジンからの一次ソースドキュメント。
Nuxt
- Nuxt — レンダリングの概念 — ユニバーサル、クライアントサイド、ハイブリッド (
routeRules) レンダリング、およびクローラーがサーバーレンダリングされたルートを好む理由。 - Nuxt — SEO とメタ (はじめに) —
useSeoMeta()、useHead()、および head 管理。 - Nuxt —
useSeoMetaコンポーザブル — 型安全なメタ API リファレンス (サーバーのみの使用法を含む)。 - Nuxt — サーバーエンジン (Nitro) — デプロイメントプリセット、クロスプラットフォーム出力、およびランタイム/キャッシュ動作が異なる可能性がある場所。
- Nuxt — Nuxt ライフサイクル — サーバーレンダリング、ペイロード転送、ハイドレーションを個別のステージとして。
- Nuxt Image —
<NuxtImg>、レスポンシブフォーマット、Core Web Vitals 用のプロバイダー設定。 - Nuxt Modules の
@nuxtjs/seo— モジュールカタログエントリ: 現在のバージョン、ダウンロード数、および個別にインストールされるパッケージであること。
- JavaScript SEOの基礎を理解する — クロール → レンダリング → インデックスのパイプラインと、クロール可能なリンク(フレームワークに依存しない。GoogleのドキュメントにはNuxtの名前は記載されていません)。
- 動的レンダリング(非推奨の回避策) — Googleがこれを非推奨にした理由と、代わりに何を使うべきか(SSR、静的レンダリング、ハイドレーション)。
ソースからの引用
Nuxt、Google、および私自身の執筆による公式の声明。各検索エンジン / Nuxtリンクは、ソースページの引用箇所にジャンプするディープリンクです。
Nuxt — SEOのためのレンダリング
- “Indexing and updating the content delivered via client-side rendering takes more time.” (翻訳) 「クライアントサイドレンダリングで配信されるコンテンツのインデックス作成と更新には、より多くの時間がかかります。」 — Nuxtレンダリングドキュメント。 引用にジャンプ
- “Web crawlers can directly index the page’s content, which makes Universal rendering a great choice for any content that you want to index quickly.” (翻訳) 「Webクローラーはページのコンテンツを直接インデックスできるため、ユニバーサルレンダリングは、迅速にインデックスしたいコンテンツに最適な選択肢です。」 — Nuxtレンダリングドキュメント。 引用にジャンプ
Google — JavaScript処理と動的レンダリング
- “Google processes JavaScript web apps in three main phases: 1. Crawling 2. Rendering 3. Indexing.” (翻訳) 「GoogleはJavaScript Webアプリを3つの主要なフェーズで処理します:1. クロール 2. レンダリング 3. インデックス。」 — Google Search Centralドキュメント。 引用にジャンプ
- “Dynamic rendering is a workaround and not a long-term solution for problems with JavaScript-generated content in search engines. Instead, we recommend that you use server-side rendering, static rendering, or hydration as a solution.” (翻訳) 「動的レンダリングは回避策であり、検索エンジンにおけるJavaScript生成コンテンツの問題に対する長期的な解決策ではありません。代わりに、サーバーサイドレンダリング、静的レンダリング、またはハイドレーションを解決策として使用することをお勧めします。」 — Google Search Centralドキュメント。 引用にジャンプ
Patrick Stox (私自身の著作 — JavaScript SEO: 決定版ガイド)
- “Any kind of SSR, static rendering, and prerendering setup is going to be fine for search engines. Gatsby, Next, Nuxt, etc., are all great.” (翻訳) 「あらゆる種類のSSR、静的レンダリング、プリレンダリングの設定は、検索エンジンにとって問題ありません。Gatsby、Next、Nuxtなどはすべて優れています。」
- “There is no fixed timeout for the renderer… It’s really patient, and you should not be concerned.” (翻訳) 「レンダラーに固定のタイムアウトはありません…非常に忍耐強く、心配する必要はありません。」
- “JavaScript is not bad for SEO, and it’s not evil. It’s just different from what many SEOs are used to.” (翻訳) 「JavaScriptはSEOにとって悪いものではなく、邪悪なものでもありません。多くのSEO担当者が慣れ親しんでいるものとは異なるだけです。」
Nuxt SEOチェックリスト
Nuxtサイトが検索エンジンとAIクローラー向けに正しく設定されていることを確認するための簡単なチェック:
- インデックスさせたいコンテンツはサーバー側またはビルド時にレンダリング(SSRまたはSSG)されている — SPAモード(
ssr: false)ではない。 - ソースの表示で重要なコンテンツが生のHTMLにあること、URL InspectionでGoogleがレンダリングすることを確認済み。
-
useSeoMeta()はページコンポーネントにあり、ページタグを上書きする共有レイアウトにはない。 -
ogImageは絶対URL(相対ではない)を使用。 - タイトルテンプレートは
app.vueで一度設定されている。ページごとのタイトル/説明は一意。 -
@nuxtjs/sitemapがXMLサイトマップを生成している。lastmodは正確で、changefreq/priorityに依存していない。 -
@nuxtjs/robotsが設定されている。非本番の自動拒否が本番に誤って適用されていない。 -
robots.txtがJS/CSSをブロックしていない。 - 正規URLは絶対かつページごと(
nuxt-seo-utils)。 - LCP画像はeager(遅延ではない)で読み込まれる。すべての画像に
width/heightがある(CLS対策)。 - ナビゲーションには実際の
<a href>リンク /<NuxtLink>を使用 —<div @click>ルーティングはしない。 -
@nuxt/contentを使用する場合、@nuxtjs/seoはモジュール配列でその前に読み込まれている。 - 動的レンダリングはどこでも使用していない。
メンタルモデル
1. レンダリング戦略が最優先。 メタタグ、スキーマ、サイトマップは、HTMLがどのように生成されるかという1つの決定の下流にある。他の何かをデバッグする前に、「このコンテンツはサーバーレンダリング、静的生成、それともクライアントレンダリングか?」 に答えよう。
2. SSRがデフォルト — あなたの仕事は主にそれを壊さないこと。
Nuxtはデフォルトを正しい方向に向けている。NuxtのSEO失敗のほとんどは、誰かが ssr: false を設定したり、JS/CSSをブロックしたり、生のHTMLと競合するシグナルをJavaScript経由で注入したりすることだ。
3. コンテンツタイプに応じてレンダリングモードを選ぶ。
- ほぼ静的(ブログ、ドキュメント、マーケティング)→ SSG(
prerender: true)。 - 常に新鮮/動的 → SSR。
- 毎時/毎日のコンテンツで静的スピードを求める →
swr/isr。 - ログインの背後にあり、インデックスされない → SPA(
ssr: false)で問題ない。 - ランキングまたはAIに引用される公開コンテンツ → 決してSPAにしない。
4. すべてのシグナルでHTMLファースト、JSセカンド。 コンテンツ、メタ、正規URL、robotsディレクティブ、リンクはすべてサーバーレンダリングされたHTMLに属する。Googleは生のHTMLとレンダリング後の最も制限的なディレクティブを採用する。AIクローラーは生のHTMLしか見ない。JS注入のSEOはフォールバックであり、計画ではない。
5. モジュールを使うが、それらが何をするか理解する。
@nuxtjs/seo は作業を省くが、非本番のrobots自動拒否、lastmod のみのサイトマップの現実、絶対URLの正規URLは依然としてあなたが正しく設定する必要がある。
Nuxt SEO — チートシート
レンダリングモード
| モード | 設定 | SEO | 最適な用途 |
|---|---|---|---|
| ユニバーサル / SSR | ssr: true(デフォルト) | ✅ 最良 | 動的 / パーソナライズ |
| 静的 / SSG | nuxt generate | ✅ 最良 | ブログ、ドキュメント、マーケティング |
| ハイブリッド | routeRules | ✅ 最良 | 大規模な混合コンテンツサイト |
| SPA / CSR | ssr: false | ⚠️ インデックスには不向き | ダッシュボード、管理画面 |
| エッジサイド | デプロイターゲット | ✅ 低TTFB | グローバルパフォーマンス |
コンポーザブル
| 用途 | 使用するもの |
|---|---|
| SEO + ソーシャルメタタグ | useSeoMeta()(型安全) |
| タイトルテンプレート、スクリプト、リンクタグ、HTML属性 | useHead() |
| 静的メタのクライアント再実行をスキップ | useServerHead() |
@nuxtjs/seo モジュール
| モジュール | 役割 |
|---|---|
@nuxtjs/robots | robots.txt + meta robots + X-Robots-Tag(デフォルトで非本番をブロック) |
@nuxtjs/sitemap | XMLサイトマップ(lastmod のみが重要。5万URLを超えると自動インデックス) |
nuxt-og-image | 動的OG画像 |
nuxt-schema-org | JSON-LD構造化データ |
nuxt-seo-utils | 正規URL(utm_*/fbclid/gclid を除去)、パンくずリスト |
nuxt-link-checker | ビルド時の壊れたリンク |
クイックルール
- すべてをインストール:
npx nuxt module add seo。 - OG画像: 絶対URLのみ。
- LCP画像:
loading="eager"; すべての画像に**width/height**が必要(CLS)。 - CWV目標: LCP ≤ 2,5秒、INP ≤ 200ms、CLS ≤ 0,1。
- robots.txtでJS/CSSをブロックしない。
- 動的レンダリング: 非推奨 — NuxtのSSR/SSGが置き換える。
- AIクローラー: JavaScriptなし → SPAコンテンツは見えない。
Nuxtページが実際に配信するものを確認する
Nuxt SEOの問題全体は、1つのチェックに集約されます: コンテンツがサーバーが送信する生のHTMLにあるか、それともJavaScriptが実行された後にのみ存在するか。生のHTMLにあれば、サーバーサイドレンダリングされており、クローラー(およびAIボット)が読み取れます。
生のHTMLを取得してコンテンツを探す
macOS / Linux:
# Raw HTML as the server sends it — before any client JS runs
curl -sL -A "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" \
https://example.com/page/ -o raw.html
# Is your headline actually in the server HTML? (empty = client-rendered)
grep -o "Your headline text" raw.htmlWindows (PowerShell):
$ua = "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
Invoke-WebRequest -Uri "https://example.com/page/" -UserAgent $ua -OutFile raw.html
Select-String -Path raw.html -Pattern "Your headline text"テキストがブラウザには表示されるがraw.htmlにない場合、ページはクライアントレンダリングされています — ルートをSSRに切り替えるか、プリレンダリングしてください。(通常のcurlはJSを実行できません。レンダリングされたDOMを確認するには、URL InspectionまたはヘッドレスChromeクローラーを使用してください。)
JS/CSSをブロックしていないことを確認する
macOS / Linux:
curl -sL https://example.com/robots.txt | grep -iE "disallow.*\.(js|css)|Disallow:\s*/(_nuxt|_ipx|assets)"/_nuxt/(Nuxtのビルド出力)または/_ipx/(@nuxt/imageオプティマイザー)に一致するDisallowはレンダリングを壊します — ほとんどの場合、これはミスです。
静的設定スニペット(nuxt.config.ts)
export default defineNuxtConfig({
modules: ['@nuxtjs/seo'], // robots, sitemap, og-image, schema-org, utils
site: { url: 'https://mysite.com' }, // required for absolute canonicals + sitemap
routeRules: {
'/blog/**': { prerender: true }, // SSG for content
'/admin/**': { ssr: false }, // SPA for the dashboard (won't be indexed)
},
}) Nuxt SEOのためのツール
- URL Inspection(Google Search Console) — 信頼できる情報源。ライブテストを実行し、レンダリングされたHTML、スクリーンショット、ページリソースを確認して、Nuxtコンテンツが実際にレンダリングされ、何もブロックされていないことを確認します。
@nuxtjs/seo/ nuxtseo.com — Harlan Wilton氏のモジュールバンドル。開発ツールパネルで、生成されたrobots、sitemap、schema、OG画像を開発中に表示できます。- Nuxt DevTools — headタグ、ルートルール、各ルートが使用しているレンダリングモードを検査します。
- Rich Results Test — レンダリング変更後に
nuxt-schema-orgJSON-LDがレンダリング出力に存在することを確認します。 - Ahrefs Site Audit / Screaming Frog(JSレンダリングモード) — JSレンダリングをオン/オフにしてクロールし、Nuxtアプリ全体の生のHTMLとレンダリングされたHTMLを比較して、CSRのギャップを検出します。
- Lighthouse / PageSpeed Insights —
@nuxt/imageとNuxt Islandsの作業に関するCore Web Vitals(LCP、INP、CLS)。 - Bing Webmaster Tools — Bingのクロール/インデックスビューと、IndexNow送信が表示される場所。
避けるべきNuxt SEOの間違い
実際のNuxtサイトで繰り返し発生する具体的な間違い — トラフィックが落ちた後に診断するのではなく、公開前に防ぎましょう。
インデックスしたいコンテンツでssr: falseに切り替える
最もコストがかかるNuxt SEOの間違い。SPAモードは、プレーンなVueと同じ空のシェル問題を引き起こします — 検索エンジンはレンダリングキューがコンテンツを埋めるのを待つ必要があります。AIクローラーのレンダリング契約はプロバイダーによって異なるため、初期HTMLのみを取得するクローラーはページコンテンツを見逃します。
なぜ間違いか: プレーンなVueよりもNuxtをインデックスしやすくする唯一のデフォルト(SSR)を自ら放棄していることになります。
代わりにすべきこと: 公開されインデックス可能なものにはssr: true(デフォルト)のままにします。ssr: falseは、ログインが必要なダッシュボードや管理パネルなど、本当にインデックスされない画面に限定し、グローバルな設定変更ではなくrouteRulesを使用します。
共有レイアウトにuseSeoMeta()を置く
レイアウトコンポーネント内でタイトルや説明を設定するのは効率的に感じられます。1か所で設定すれば全体に適用されるからです。しかし、そのレイアウトを使うすべてのページが同じ汎用的なタグを持つことになり、ページレベルの useSeoMeta() 呼び出しがレンダリング順序によって上書きされる可能性があります。
なぜ問題か: 一意でページ固有のタイトルと説明は基本的な関連性シグナルです。レイアウトレベルのデフォルトでは、それらがすべて1つの文字列にまとめられてしまいます。
代わりにすべきこと: グローバルなフォールバックは app.vue で一度だけ設定し(タイトルテンプレート、OGデフォルト)、各ページコンポーネント内で useSeoMeta() を呼び出して、そのページの実際のタイトルと説明を設定します。
相対的な ogImage URL を配信する
ogImage: '/social.png' はブラウザでは問題なく見えますが、Facebook、LinkedIn、X が取得しようとすると完全に失敗します。ソーシャルクローラーはサイトに対して相対パスを解決しないためです。
なぜ問題か: ソーシャルプラットフォームは画像を取得するために絶対URLを必要とします。相対パスは相手側からは何も解決されません。
代わりにすべきこと: 常に完全な https:// URL を渡し、nuxt.config.ts で site.url を設定して、@nuxtjs/seo のモジュールが自動的に絶対URLを構築できるようにします。
動的レンダリングに頼る
既知のボットにはプリレンダリングされたスナップショットを、それ以外にはSPAを配信するのは、数年前は正当な回避策でした。Googleはその後、これを直接指摘しています: “dynamic rendering is a workaround and not a long-term solution.” (翻訳) 「動的レンダリングは回避策であり、長期的な解決策ではありません。」
なぜ問題か: 設定したボットにのみ配信され、それ以外(Bing、ほとんどのAIクローラー)を見逃し、維持すべき実際のインフラが追加されます。これはNuxtのSSR/SSGがすでに解決している問題です。
代わりにすべきこと: SSR または nuxt generate を使用し、動的レンダリングを完全にスキップします。Nuxtサイトでそれが必要になるシナリオはありません。
robots.txt で /_nuxt/ や /_ipx/ をブロックする
包括的な Disallow: /assets/ や過剰なrobotsルールは、誤ってNuxtのビルド出力ディレクトリ(/_nuxt/)や @nuxt/image の最適化パス(/_ipx/)を捕捉する可能性があります。
なぜ問題か: Googlebotがページを構築するJS/CSSを取得できない場合、SSR出力が実際にそのように見えることを確認できず、クライアントサイドの拡張機能は静かにレンダリングされなくなります。
代わりにすべきこと: ビルド出力や画像最適化パスを決して許可しないでください。ルーティングやモジュール設定に触れるデプロイのたびに robots.txt を確認してください。起動時に一度だけではありません。
本番環境以外のrobotsブロックを起動後も有効のままにする
@nuxtjs/robots はデフォルトで非本番環境のすべてのクローラーを拒否します。ステージングには良い安全策ですが、環境変数を読み取って判断するため、NODE_ENV やプレビューデプロイ設定が誤っていると、本番環境でも発動する可能性があります。
なぜ問題か: サイトはブラウザでは完全に正常に見える一方で、robots.txt は静かにすべてを拒否し、誰かが気付くまで何もインデックスされません。
代わりにすべきこと: デプロイや環境変更の後は、https://yoursite.com/robots.txt を直接取得し、包括的な Disallow: / ではないことを確認してください。
Nuxt SEOの継続的なKPI
レンダリング設定が正しくなったら追跡すべき継続的な数値。一度きりのチェックではなく、アプリの変更に伴う回帰を検出する定期的なシグナルです。
Core Web Vitals(LCP、INP、CLS)
それが示すもの: 実際の訪問者が高速で安定したページを取得しているかどうか。Nuxt Islands/ハイドレーションコスト(INP)と画像読み込みの選択(LCP、CLS)に直接影響されます。
取得方法: Chrome UX Report からのフィールドデータは /tools/crux-tracker/ または /tools/cwv-checker/ で取得。ラボデータはリリース前チェック用に Lighthouse から取得。
ベンチマーク/現実的な範囲: Googleが公開している「良好」のしきい値は、75パーセンタイルで LCP ≤ 2,5秒、INP ≤ 200ms、CLS ≤ 0,1 です。これらは CrUX 自体が使用する合格/不合格ラインであり、私が発明した数値ではありません。「良好」の範囲内でどこに位置するかは、画像の重さとハイドレーションの量に大きく依存します。
頻度: CrUX フィールドデータは28日間のローリングウィンドウで更新されます。毎月チェックし、画像、フォント、ハイドレーションに変更があった直後にもチェックしてください。
レンダリング済みHTMLと生HTMLのパリティ
意味すること: 検索エンジンやAIクローラーが実際に閲覧できるコンテンツ(生のHTML)が、訪問者がブラウザで見るもの(レンダリングされたDOM)と一致しているかどうか — ssrが切り替えられたり、ルートがCSRに後退したりした場合のNuxt SEOの核心的なリスクです。
取得方法: /tools/render-gap/ でURLの生HTMLとレンダリング済みHTMLを比較します。Google側の権威ある見解としては、GSCのURL検査 → 「クロールされたページを表示」を使用します。
ベンチマーク / 現実的な範囲: これは範囲ではなく二値的なチェックです — 主要なコンテンツ(見出し、本文、内部リンク)は生のHTMLに存在するべきであり、それで終わりです。インデックスや引用を望むページにギャップがあれば、許容する数値ではなく修正すべき後退です。
頻度: routeRules、レイアウト、またはssr設定に触れるデプロイのたびに。それ以外は毎月主要テンプレートをスポットチェックします。
インデックスカバレッジ(ページインデックスレポート)
意味すること: 送信したURLのうちGoogleが実際にインデックスした数と、残りが除外された理由(重複、クロール済みだが未インデックス、ブロックなど)— レンダリングの問題が最終的に表面化する下流のシグナルです。
取得方法: Search Console → ページインデックスレポートで、NuxtサイトのURLパターンにフィルタリングします。
ベンチマーク / 現実的な範囲: 普遍的な健全なパーセンテージはありません — ルート構造が生成するほぼ重複または薄いURLの数に依存します。目標数値ではなく、トレンドと除外理由を監視してください。
頻度: レンダリングモードの移行中および移行後は毎週。それ以外は毎月。
AIクローラーのアクセス
意味すること: GPTBot、ClaudeBot、PerplexityBotなどのAIクローラーが実際にページを取得できるかどうか — Googleとは別です。これらのボットは一般的にJavaScriptを実行せず、robots.txtが到達を許可する生のHTMLのみを読み取るためです。
取得方法: /tools/ai-crawler-checker/ でAIユーザーエージェントが拒否されていないことを確認します。サーバーログでボットが許可されているだけでなく、実際にページをリクエストしていることを確認します。
ベンチマーク / 現実的な範囲: 正直に言える引用率のベンチマークはありません — AI回答エンジンがあなたを引用する頻度は、クエリ空間と競争に依存し、Nuxt設定が直接制御するものではありません。でっち上げの引用パーセンテージではなく、アクセス(許可 vs ブロック)を追跡してください。
頻度: robots.txtまたは@nuxtjs/robots設定の変更のたびに。それ以外は毎月ログをスポットチェックします。
自分でテスト: Nuxt SEO
Nuxtサイトの検索最適化に関する5つの簡単な質問です。各質問に回答を選び、確認してください。
時間をかける価値のあるリソース
関連記事
- JavaScript SEO: 決定版ガイド — レンダリング、DOMパリティ、最も制限的なディレクティブのルール、そしてSSR/静的/プリレンダリング(Nuxtを含む)がすべて検索に適している理由についての完全ガイドです。
- 技術SEOの初心者ガイド — レンダリングとクロールが全体像のどこに位置するかについて。
講演
- JavaScript SEO — Ungagged 2019 (SlideShare) — Googlebotの常緑のChromium、レンダリングの約20倍のクロールコスト、ハッシュルーティングに対するHistory API、そしてGoogleがJS注入の正規化タグをどう扱うかについて。(常時免責事項: そのデッキの動的レンダリングのアドバイスは現在では時代遅れです — Googleはそれを非推奨にしました。)
業界からの情報
- Nuxt — レンダリングの概念(公式)— ユニバーサルレンダリングとクライアントサイドレンダリングの比較、およびクローラーがSSRを好む理由。
- Nuxt — SEOとメタ(公式)—
useSeoMeta()とuseHead()、入門リファレンス。 - NuxtでSEOを学ぶ(Harlan Wilton / nuxtseo.com)— 開発者向けの最も包括的なNuxt SEOガイドで、常に最新情報に更新されています。
- harlan-zw/nuxt-seo(GitHub)—
@nuxtjs/seoモジュールバンドルのソース。 - Nuxt Image(公式)—
<NuxtImg>とCore Web Vitalsの最適化。 - Nuxtのパフォーマンスを最適化(DebugBear)— NuxtのCore Web Vitals修正に関する実践的な解説。
- Nuxt 3のレンダリングモード(RisingStack)— SSR、SSG、ハイブリッドレンダリングの技術比較。
- r/TechSEO — レンダリング/インデックスデバッグのコミュニティ。
動画
- Google Search Central(YouTube)— Martin SplittのJavaScript SEOシリーズは、GoogleがJSアプリをクロール、レンダリング、インデックスする方法に関する最も優れた公式解説です。フレームワークに依存しませんが、Nuxtに直接適用できます。 チャンネル
変更履歴
2026年8月13日に更新。
編集概要と記録された変更の詳細。変更の詳細
-
変更の詳細な注記は現在英語でのみ提供されています。
-
変更の詳細な注記は現在英語でのみ提供されています。
-
変更の詳細な注記は現在英語でのみ提供されています。
完全な比較は利用できません — この改訂の以前のスナップショットがアーカイブされていません。
2026年7月27日に更新。
編集概要と記録された変更の詳細。変更の詳細
-
変更の詳細な注記は現在英語でのみ提供されています。
完全な比較は利用できません — この改訂の以前のスナップショットがアーカイブされていません。
2026年7月18日に更新。
編集概要と記録された変更の詳細。変更の詳細
-
変更の詳細な注記は現在英語でのみ提供されています。
-
変更の詳細な注記は現在英語でのみ提供されています。
-
変更の詳細な注記は現在英語でのみ提供されています。
-
変更の詳細な注記は現在英語でのみ提供されています。
-
変更の詳細な注記は現在英語でのみ提供されています。
完全な比較は利用できません — この改訂の以前のスナップショットがアーカイブされていません。