メインコンテンツに移動

JavaScriptを使わないヘッドレスCMS|SSIで検索にもAIにも届く仕組み

ヘッドレスCMSを検討していて、こんな話を聞いたことはないでしょうか。

「表示速度は速いけれど、SEOに弱い」

これは正確ではありません。

弱いのはヘッドレスCMSそのものではなく、JavaScriptでコンテンツを描画する方式です。

当社はこの問題を避けるため、JavaScriptを一切使わないヘッドレス構成にしました。

データと表示は分離したまま、検索エンジンにもAIにも通常のHTMLとして届きます。

 

なぜJavaScript描画は検索に弱いのか

一般的なヘッドレスCMSは、次の流れで表示します。

ブラウザがページを開く  ↓ JavaScriptが動く  ↓ APIを呼んでデータを取得  ↓ 取得したデータでHTMLを組み立てる  ↓ 画面に表示される

人間が見る分には問題ありません。1秒足らずで表示されます。

問題は、読み手が機械の場合です。

 

クローラーは必ずしもJavaScriptを実行しない

検索エンジンのクローラーがページを取得したとき、最初に受け取るのはJavaScriptが動く前のHTMLです。そこには本文がありません。

Googleはレンダリング(JavaScriptを実行して最終的な表示を得る処理)に対応していますが、次の点に注意が必要です。

  • レンダリングは通常のクロールとは別の処理で、後回しになることがある
  • すべてのページが必ずレンダリングされる保証はない
  • JavaScriptの実行に失敗すると、中身が空のまま評価される

Google以外の検索エンジンやクローラーは、そもそもJavaScriptを実行しないものもあります。

 

AIのクローラーはさらに慎重に考えたい

近年はAIがWeb上の情報を収集し、要約して提示する場面が増えました。

これらのクローラーがJavaScriptをどこまで実行するかは、公開されている情報が限られています。実行しないものもあれば、実行するものもあるでしょう。

確実なのは、JavaScriptを必要としないHTMLなら、どのクローラーでも確実に読めるということです。

検索とAIの両方から情報を見つけてもらいたいなら、機械が読むために前提条件が少ない方が有利です。

 

解決策は「配信前に組み立てる」こと

JavaScript描画の問題は、組み立てる場所がブラウザだから起きます。

ならば、ブラウザに届く前に組み立てればよいわけです。

 JavaScript描画今回の構成
組み立てる場所ブラウザWebサーバー
組み立てるタイミングページを開いたとき配信する直前
クローラーが受け取るもの空のHTML+JS完成したHTML
JSの実行必須不要

「サーバーサイドレンダリング(SSR)」と呼ばれる考え方に近いものですが、当社はもっと単純な方法を使っています。

 

SSIという古い仕組みを使う

SSI(Server Side Includes)は、Webサーバーが持つ古くからの機能です。

指定したファイルの中身を、配信の直前に差し込みます。

HTMLにはこう書いておきます。

<!--#include virtual="/included/news-latest.html" -->

訪問者に届くときには、この1行が新着情報のHTMLに置き換わっています。

ブラウザから見れば、最初からそこに書かれていたのと同じです。

クローラーが受け取るのも、当然この完成したHTMLです。

 

「古い」ことは欠点ではない

SSIは1990年代から使われている仕組みです。新しい技術ではありません。

しかし、目的が「配信前にHTMLを完成させること」であれば、これで十分です。

フレームワークの学習も、ビルド環境の構築も要りません。

レンタルサーバーの多くが対応しているため、導入のハードルも低くなります。

 

当社のトップページの構成

実際にどう分かれているかを示します。

部品中身作っているもの
ヘッダー・フッターナビゲーション・会社情報静的ファイル
ヒーローキャッチコピー・特徴HTMLに直書き
サービス一覧4カテゴリと項目会社概要CMS
代表者メッセージ要約・全文・開閉ボタン会社概要CMS
新着情報一覧・絞り込み・記事データ新着情報CMS
ブログ最新記事の一覧Drupal

トップページのHTMLファイルは12KBしかありません。

実際に書かれているのはヒーロー部分と各セクションの見出しだけで、あとはSSIの1行です。

中身を持たない器になっています。

 

会社概要を直すとトップページに反映される仕組み

3つのCMSのうち、会社概要CMSを例に流れを追います。
 

データはひとつ

会社概要ページとトップページで、同じデータを使っています。

サービス内容も代表者メッセージも、会社概要CMSに登録した1つのデータが元です。

トップページ用に別途入力する必要はありません。

以前は同じ内容を2箇所に入力していましたが、どちらかを直し忘れると内容が食い違います。

データを1つにすれば、その問題は起きません。
 

保存すると部品が書き出される

会社概要を保存すると、次の処理が走ります。

会社概要CMSで保存  ↓ company.html を生成(会社概要ページ)  ↓ included/services.html を生成(サービス一覧) included/rep-message.html を生成(代表者メッセージ) included/contact-lead.html を生成(お問い合わせ文言)

 

トップページのHTMLは変更されない

この間、トップページのHTMLファイルには一切手が加わりません。

次に誰かがページを開いたとき、Webサーバーが最新の部品を読み込んで配信します。

トップページ側は「部品を読む」と書いてあるだけなので、中身が変わっても気づく必要がありません。

この設計にした理由は、トップページのレイアウトを手で自由に編集したかったからです。

以前はCMSがトップページを丸ごと生成していたため、手で加えた変更が次の生成で消えていました。

 

同じデータでも見せ方は変えられる

会社概要ページでは説明文つきで詳しく、トップページではカード形式で簡潔に表示しています。

データは同じで、組み立て方だけが違います。将来スマートフォンアプリやデジタルサイネージへ配信することになっても、同じデータから別の形式で出力できます。

これはヘッドレスCMSの本来の利点です。JavaScriptを使わなくても、この利点は失われません。

 

ヘッドレスCMSの弱点をどこまで解決したか

正直に整理します。

解決できたこと

一般的な弱点今回の構成では
JSを実行しないと中身が読めない配信時点で完成したHTML
初回表示に待ち時間がある静的HTMLと同じ速度
フロントエンドの構築が必要HTMLに1行書くだけ
APIが止まるとページが空になる最後に書き出したファイルが残る

解決していないこと

課題状況
公開前のプレビュー別途仕組みが必要
リアルタイム性書き出した時点の状態。秒単位で変わる情報には不向き
構成の理解どのファイルがどこから来るかの把握が必要
環境の制約SSIが使えるサーバーが前提

特にリアルタイム性は明確な制約です。在庫数や予約状況のように秒単位で変わる情報を扱うなら、APIで都度取得する方式が適しています。

逆に言えば、企業サイトのように更新頻度が日単位・週単位の情報であれば、この制約は問題になりません。

 

どう使い分けるか

状況向いている方式
検索・AIからの流入が重要配信前に組み立てる
更新頻度が日単位・週単位配信前に組み立てる
同じ情報を複数の媒体へ配信したいどちらでも可(データ分離が本質)
秒単位で変わる情報を扱うAPIで都度取得
ログイン後の個別表示が必要APIで都度取得
アプリなど複数の画面で使うAPIも併用

両方を組み合わせることもできます。基本は配信前に組み立て、変化の速い部分だけAPIで取得する形です。

 

まとめ

ヘッドレスCMSがSEOに弱いのではなく、JavaScriptで描画する方式が弱いのです。

  • クローラーは必ずしもJavaScriptを実行しない
  • ならば、配信前にHTMLを完成させればよい
  • SSIで部品を差し込めば、JSなしでヘッドレスの利点が得られる
  • データと表示の分離という本質は変わらない
  • ただしリアルタイム性は犠牲になる。用途で選ぶ

「ヘッドレスCMS=APIとJavaScript」と考えると、選択肢が狭まります。

データを持つ場所と、表示する場所を分ける。

それがヘッドレスの本質であり、実現方法は1つではありません。

検索とAIの両方から見つけてもらいたい企業サイトであれば、機械が読むための前提条件は少ない方が有利です。

同じような構成を検討されている方は、まず「その情報はどのくらいの頻度で変わるのか」を整理してみてください。

そこが決まれば、適した方式も見えてきます。

記事の更新はメルマガでもお届けしています。