コンテンツにスキップ
svelte-vitals
日本語
Esc
移動開く⌘Jプレビュー
このページの内容

seo/json-ld-validity · JSON-LD の妥当性

ページの JSON-LD は、@context と @type を備えた妥当な JSON である必要があります。

重大度: warning

チェック内容

静的な <script type="application/ld+json"> それぞれについて、内容が JSON としてパースでき、@context@type の両方を含むことを確認します。無効または不完全な JSON-LD を検出します。動的に組み立てる JSON-LD はソース解析では検査しません。

未知の型

ドキュメントの @context が schema.org を指している場合、そのドキュメント内のすべての裸の @type 名が schema.org の語彙と照合されます。ルートだけでなく、ネストしたエンティティ(authorpublisheroffers など)や @graph メンバー内のものも対象です。完全一致・大文字小文字を区別した schema.org の型名でない場合、次のような検出結果になります: Unknown @type 'article' — not a schema.org type. Did you mean 'Article'?。この「Did you mean」の提案は、大文字小文字違い(article)だけでなく、最大 2 文字の欠落・追加・置換までの軽微なタイプミス(Artcle)にも、語彙内で最も近い schema.org の型名として表示されます。語彙内にそれほど近い型名がない場合は、提案なしの検出結果になります。

IRI 形式(https://schema.org/Article)やプレフィックス形式(schema:Article)の @type は妥当な JSON-LD であり、このチェックの対象外です。裸の名前のみが検査されます。

@context が schema.org 以外を指している場合(schema.org 以外のメンバーを含む配列、object 形式の context、あるいは別の語彙 URL)、そのドキュメントはこのチェックからまるごと除外されます。用語の再マッピングによって、このルールが認識していない名前が正当なものになりうるためです。メンバーがすべて schema.org URL の配列は引き続き検証対象です。context の照合自体は大文字小文字を区別します(https://schema.orghttp://schema.org、末尾スラッシュの有無は任意)。変則的な大文字表記の URL は誤検知側ではなく除外側に倒れます。

この語彙は schema-dts から生成されており、この依存パッケージが更新されるたびに更新されます。

なぜ重要か

パースできない、@context@type を欠く、あるいは実在しない schema.org の型を宣言している JSON-LD を、検索エンジンは黙って無視します。その構造化データは何の役にも立ちません。

修正方法

<svelte:head>
  <script type="application/ld+json">
    { "@context": "https://schema.org", "@type": "WebPage", "name": "…" }
  </script>
</svelte:head>

モードによる違い

ソース解析(CLI、ダッシュボードの静的ベースライン)は、各ルートの <head> を、ページとレイアウトチェーンの <svelte:head> からリポジトリ内のコンポーネントもたどって合成し、既知のメタコンポーネント(svelte-meta-tagssvelte-seo)と metaComponents で宣言したものも加えます。判定するのはリテラルな値だけで、動的な値は検査しません。レンダリング解析(Vite プラグインのビルド、ダッシュボードで訪問したルート)は出荷される <head> を読み、値はすべてリテラルです。ビルドが対象にするのはプリレンダリングされたルートだけです。両者が食い違うときは、レンダリング解析の結果を信じてください。

無効化

既存の検出は suppressions ファイルに記録して抑制できます(npx svelte-vitals --update-suppressions)。overrides でルートやパス単位に絞るか、ルールごと無効化するには、次のように設定します。

export default {
  rules: {
    'seo/json-ld-validity': 'off'
  }
};