JavaScriptはAIの可視性を損ねているのか?AIクローラーは動的コンテンツを見逃しているようです
JavaScriptがAIクローリングに与える影響についてのコミュニティディスカッション。ChatGPTやPerplexityでの可視性に関する開発者やSEO専門家の実体験を紹介します。...
私たちはブログ用にインフィニットスクロールを採用した最新のReactサイトを構築しました。ユーザー体験は素晴らしいのですが、AIの回答にはまったくコンテンツが出てきません。
Googleには(SSRの調整後)インデックスされています。でもAIプラットフォームはほとんどのコンテンツを見逃しているようです。
当社の構成:
質問:
同じような経験のあるフロントエンド開発者の方、いませんか?
AIクローラーがJavaScriptをどう処理するか分解します:
AIクローラーのJavaScript対応状況:
| クローラー | JSレンダリング | スクロールシミュレーション | 待機時間 |
|---|---|---|---|
| GPTBot | 制限あり/なし | なし | 最小限 |
| Google-Extended | 優秀(Googlebot同等) | なし | 標準 |
| ClaudeBot | 制限あり | なし | 最小限 |
| PerplexityBot | 状況による | なし | 制限あり |
| Common Crawl | なし | なし | なし |
根本的な問題:
インフィニットスクロールには、
ほとんどのAIクローラーは1か2で失敗します。
SSRだけでは不十分な理由:
SSRは初回ページしか返しません。インフィニットスクロールのコンテンツは「初期」ではなく、操作時にロードされます。SSRだけでは操作依存を解消できません。
根本的な課題:
インフィニットスクロールは現状のAIクローラーの能力とは根本的に相容れません。別のアプローチが必要です。
推奨されるアプローチ(AIフレンドリー順):
オプション1: 従来型ページネーション(最もAIフレンドリー)
/blog/page/1
/blog/page/2
/blog/page/3
オプション2: ハイブリッド方式
<!-- インフィニットスクロールページ -->
<link rel="canonical" href="/blog/page/1" />
<!-- ページネーション常設 -->
<nav>
<a href="/blog/page/1">1</a>
<a href="/blog/page/2">2</a>
</nav>
オプション3: AIクローラー向けプリレンダー
どの選択肢にもトレードオフがありますが、オプション1が最もシンプルで確実です。オプション2ならUXを保ちつつAIアクセシビリティも両立できます。
まったく同じ課題に直面しました。私たちの解決策はこれです:
ハイブリッド方式の実装例:
// URL構造
/blog // インフィニットスクロール(ユーザー向けデフォルト)
/blog/archive/1 // ページ分割(クローラー用アクセス可能)
/blog/archive/2
実装のポイント:
サイトマップにはページネーションURLのみ記載
インフィニットスクロールページも同じAPIでデータ取得
内部リンクは各記事個別URLに誘導
robots.txtの指示例:
# クローラーには個別記事を優先して発見させる
# インフィニットスクロールのコンテナページは対象外
Sitemap: /sitemap.xml
結果:
Next.jsでのアプローチ:
getStaticPaths + getStaticPropsを使用:
// pages/blog/page/[page].js
export async function getStaticPaths() {
const totalPages = await getTotalPages();
const paths = Array.from({ length: totalPages }, (_, i) => ({
params: { page: String(i + 1) }
}));
return { paths, fallback: false };
}
export async function getStaticProps({ params }) {
const posts = await getPostsForPage(params.page);
return { props: { posts, page: params.page } };
}
利点:
インフィニットスクロールは強化として追加:
これで両立可能です。
プリレンダー方式も一つです:
AIクローラー向けプリレンダーサービス:
AIクローラーのユーザーエージェント検出→プリレンダー版コンテンツの配信が可能です。
// ミドルウェア例
if (isAICrawler(req.headers['user-agent'])) {
return servePrerenderedVersion(req.url);
}
AIクローラー検出例:
const aiCrawlers = [
'GPTBot',
'ChatGPT-User',
'Google-Extended',
'ClaudeBot',
'PerplexityBot',
'anthropic-ai'
];
function isAICrawler(userAgent) {
return aiCrawlers.some(crawler =>
userAgent.includes(crawler)
);
}
プリレンダーの選択肢:
注意:
全てのAIクローラーが明確なユーザーエージェントを名乗るとは限りません。一部は見逃されるので、補助策として考え、本命は正規のページネーションです。
AIクローラーアクセシビリティのテスト手法:
手動テスト:
JavaScript無効テスト:
ソース表示テスト:
curlテスト:
curl -A "GPTBot/1.0" https://yoursite.com/blog/
自動テスト:
Google Search Console:
Lighthouse監査:
理想の状態:
ECサイトの観点:
当社は1万点以上の商品で「もっと見る」機能を使っています。以下が私たちの解決事例です:
カテゴリーページ構成:
/category/shoes # 最初の24商品+もっと見る
/category/shoes?page=2 # 25-48商品
/category/shoes?page=3 # 49-72商品
実装のポイント:
初回ページにも必ずページネーションリンク
?page=パラメータはcanonical
サイトマップに全ページネーションURLを記載
商品は個別URL
結果:
AIプラットフォームはページネーション構造経由で個別商品ページを発見・引用しています。
非常に参考になりました。私の実装計画は以下です:
ハイブリッドページネーション方式
フェーズ1: ページネーションルート追加(1~2週目)
フェーズ2: 既存インフィニットスクロール更新(3週目)
フェーズ3: テストと検証(4週目)
技術的構成:
/blog → インフィニットスクロール(人間用、canonicalはarchive/1)
/blog/archive/1 → ページ分割(クローラー用、canonicalはself)
/blog/archive/2 → ページ分割(クローラー用)
/blog/[slug] → 各記事(本来のコンテンツ)
重要な原則:
皆さま、詳細な技術アドバイスをありがとうございました。
Get personalized help from our team. We'll respond within 24 hours.
どのページがAIプラットフォームに発見・引用されているかを追跡しましょう。クロールに関する問題点を特定し、可視性向上に役立てます。
JavaScriptがAIクローリングに与える影響についてのコミュニティディスカッション。ChatGPTやPerplexityでの可視性に関する開発者やSEO専門家の実体験を紹介します。...
AIクローラーによるJavaScriptレンダリングに関するコミュニティディスカッション。開発者がReact、Next.js、その他JSフレームワークでのAI可視性について経験を共有しています。...
AI検索の可視性向上のためのプリレンダリングについてのコミュニティディスカッション。開発者たちがJavaScriptフレームワークやAIクローラーによるアクセス経験を共有します。...