未分類
概要
2025-10-25 現在、apps/web ディレクトリで運用している Nuxt Content(document-driven + MDX)サイトを対象に、Cloudflare Pages 配信を前提とした SEO の阻害要因を棚卸ししました。ここではクロール安定性、メタデータ一貫性、情報設計の 3 軸から課題を整理しています。
主要課題
- グローバル head 設定の破損
apps/web/nuxt.config.ts内のapp.headが途中で文字化けしており、SSR HTML の<title>と<meta>が欠落。クローラが規定タイトル/description を取得できず、useSeoMetaフォールバックも発火しない。 - トップページの SSR エラーと文字化け
apps/web/app/pages/index.vueのテキストおよびuseSeoMeta引数が Shift_JIS 風の破損データになり、閉じタグ抜けを引き起こしてビルド失敗や TTFB 低下を招いている。 - 動的ページのメタ不足
apps/web/app/pages/[...slug].vueは title/description/OG のみで、canonical、article:published_time、article:tag、構造化データ(JSON-LD)が未実装。記事として扱われず検索結果で競争力を失う。 - ナビゲーションの a11y & 意味論的欠落
apps/web/app/components/Breadcrumb.vueではaria-labelとaria-currentが途中で切れ、パンくずを適切に解釈できない。内部リンクのアンカーテキスト評価にも悪影響。 - コンテンツ取得の非効率
トップ/ディレクトリページ双方でqueryCollection('pages').all()後に手動フィルタしており、件数増に伴ってレスポンスが悪化しクロールバジェット消費が増大。 - robots / sitemap の未整備
apps/web/public/robots.txtは Allow のみで sitemap 記述がなく、nitro.prerender.routesでもsitemap.xmlやfeed.xmlを生成していないため、重要 URL への案内が不十分。
推奨アクション
nuxt.config.tsとindex.vueを UTF-8 (BOM なし) で再保存し、pnpm lint/pnpm testで構文チェック。app.headをdefineNuxtConfigから一貫して管理する。- ページ共通の SEO ヘルパー(例:
apps/web/app/utils/seo.ts)を新設し、useSeoMetaをdefinePageMeta+ composable 化。canonical、OGP、twitter:card、article:系をまとめて注入する。 DocPage.vueで記事 frontmatter を JSON-LD (Article,BreadcrumbList) に変換し、<script type="application/ld+json">を挿入。クラウドフレア SSR 出力でダブルエスケープしないようuseHeadのscriptを利用。Breadcrumb.vueにaria-label="パンくずリスト"、最終要素のaria-current="page"を追加し、<nav>+<ol>構造へ更新。アクセシビリティ lint (eslint-plugin-vuejs-accessibility) の導入も検討。queryCollectionはselect(['_path','title','description','publishedAt'])等で必要最小限を取得し、whereとsortを利用。よく呼ばれるリクエストはcachedFunctionで 5〜15 分キャッシュ。@nuxtjs/sitemapと@nuxtjs/robotsを追加し、nuxt.config.tsでsite.urlを単一箇所に定義。Cloudflare Pages ではnpx wrangler pages devで sitemap/robots を検証し、robots.txtからSitemap: https://example.com/sitemap.xmlを指す。
次のステップ
- 文字化けファイルの洗い出し →
rg -Ul "[\x80-\xFF]" apps/web -g "*.vue"で異常バイトを検出し、一括で UTF-8 へ再エンコード。 - SEO ヘルパーと JSON-LD 実装を追加 →
DocPage.vue・TableOfContents.vueなど共通コンポーネントへ順次適用。 - sitemap/robots 設定を行い、
pnpm generate && npx wrangler pages deploy --dry-runでクラウドフレア配信を確認。 - 修正後に Search Console の URL 検査で再クロールを申請し、
pnpm vitest --runInBand "seo"など軽量テストで回 regres を防止。
このメモはリグレッション可視化のため随時更新し、対応済み項目は日付付きで完了ログを追記してください。