JSON-LDをAstroブログで扱う

programming
A hero image of the article

JSON-LDとは

JSON-LD is a lightweight Linked Data format. It is easy for humans to read and write. It is based on the already successful JSON format and provides a way to help JSON data interoperate at Web-scale.

JJSON-LD(JavaScript Object Notation for Linked Data)は、Webページに構造化データを埋め込む手法の一つです。

構造化データを埋め込むことで、検索エンジンがWebページの内容を適切に理解し、検索結果の質を高めることができます。

つまり、SEO(検索エンジン最適化)の改善に役立ちます。

また、埋め込んだ構造化データには、コンテンツのタイトルや説明、画像などのメタデータが含まれるため、ソーシャルメディアでのコンテンツ共有を促進する効果もあります。 さらに、JSON-LDはJSONベースの記述なので、Web開発者にとって親しみやすい形式となっています。 このようにJSON-LDを活用することで、Webサイト全体の可視性とアクセシビリティが向上し、ユーザーへの情報伝達がスムーズになります。

JSON-LD - JSON for Linking Datajson-ld.org

Schema.org について

基本的にJSON-LDで構造化データを検索エンジンなどに提供するに当たっては、Schema.org の仕様に従うのが良いです。

Schema.orgとは、Google、Microsoft、Yahoo!、Yandexなどの主要な検索エンジンが共同で開発し、ウェブサイトの構造化データマークアップを標準化したものです。

基本的な概念

JSON-LDでは上記を以下の様にJSON形式で記述します。

schema.json
{
  "@context": "https://schema.org",
  "@type": "WebSite",
  "name": "フナイログ",
  "url": "https://funailog.com",
  "author": {
    "@type": "Person",
    "name": "Ryota Ikezawa"
  }
}

この例では、@context によって、Schema.orgの語彙が使用されていることが宣言されます。 @type によってアイテムの種類がウェブサイトであること、また制作者の名前が指定されています。

具体的にどのようなスキーマがあるかは、 https://schema.org/docs/schemas.html で確認することが可能です。

JSON-LDを組み込むためのステップ

今回はAstro.buildで構築されたこのブログの記事ページに対して、JSON-LDを組み込んでみます。

これは先に述べたように、ブログ記事の検索性を向上させるための一手段です。 コンポーネントの分離や構成にも寄りますが、記事を描画するコンポーネントの冒頭に以下のようなscriptを書いて外から個別の値を渡すのが良いと思います。

<script type="application/ld+json">
  {
    "@context": "https://schema.org",
    "@type": "WebSite"
    // ...
  }
</script>

あるいは、以下のようにするのも良いでしょう。

---
import { Article, WithContext } from 'schema-dts';
type Props = {
  jsonLd?: WithContext<Article>;
};

const { jsonLd } = Astro.props;
---

<head>
  {
    jsonLd && (
      <script
        is:inline
        type="application/ld+json"
        set:html={JSON.stringify(jsonLd)}
      />
    )
  }
</head>

もしも、構成するアプリケーションの構成に問題がなければ、以下のプラグインを利用しても良いかもしれません。

内部では先ほど記述したものを呼び出しているだけなので、自分で作るのと大差はないです。

orbit/packages/astro-seo-schema at main · codiume/orbitCollection of useful integrations & components for the Astro ecosystem. ⭐️ Star to support our work! - codiume/orbitgithub.com
orbit/packages/astro-seo-schema at main · codiume/orbit

一方Schemaの型定義は欲しいと思うので、 schema-dts は利用すべきです。

再利用性を高めるためにコンポーネントやライブラリとして分割する

今回は、再利用性を高めるために rich-results.ts の中に ArticleLd として切り出します。

メタデータとして、blogのコレクション、サイトメタデータ、言語属性などを渡して構成します。

実際のコードは以下のリンクです。

funailog/src/lib/rich-results.ts at main · paveg/funailogContribute to paveg/funailog development by creating an account on GitHub.github.com
funailog/src/lib/rich-results.ts at main · paveg/funailog

ページの構成次第では先に書いた通り、Layout.astro と blogコンテンツのページの2つだけに実装すれば良いでしょう。

実装したJSON-LDをテストする

Googleが リッチリザルトテストを提供しています。

実装してデプロイを行ったあとに、ウェブページをテストして問題ないか確認しましょう。

Rich Result Test Sample

まとめ

あなたのブログにもぜひJSON-LDを組み込んでみてください。