ドキュメントサイトデータの一元管理:`site.json`の導入

shoelace-style/webawesome

WebAwesomeのドキュメントサイトに _data/site.json を新設し、ブランド名・メールアドレス・SNS URL・GitHub URL・法的リンクパスといった繰り返し使われる文字列を一箇所に集約しました。約54ファイルに散在していたハードコード値が {{ site.* }} テンプレート参照に置き換えられ、将来的な変更コストが大幅に低減されます。

背景

ドキュメントを構成する多数の .njk / .md ファイルに、メールアドレス・SNSリンク・GitHubリポジトリURLなどの文字列がそのままハードコードされていました。たとえば hello@webawesome.comhttps://github.com/shoelace-style/webawesome503.mdsidebar-colophon.njkcommunity.md など複数のファイルに重複して記述されており、一箇所の変更が全ファイルの修正を要する状態でした。

ブランド名についても同様で、"Web Awesome Pro" という文字列が各所に直書きされていたため、表記を統一・変更する際の影響範囲の把握が困難でした。

技術的な変更

packages/webawesome/docs/_data/site.json を新規追加し、サイト全体で共有するデータを6つのカテゴリに整理しています。

{
  "name": "Web Awesome",
  "nameCore": "Web Awesome Core",
  "namePro": "Web Awesome Pro",
  "tagline": "Go Make Something Awesome!",
  "company": "Fonticons, Inc.",
  "domain": "webawesome.com",

  "siblings": {
    "fontAwesome": { "name": "Font Awesome", "url": "https://fontawesome.com" },
    "buildAwesome": { "name": "Build Awesome" }
  },

  "urls": {
    "discord": "https://discord.gg/mg8f26C",
    "x": "https://x.com/webawesomer",
    "bluesky": "https://bsky.app/profile/webawesome.com",
    "mastodon": "https://mastodon.social/@webawesome",
    "threads": "https://www.threads.com/@web.awesome",
    "support": "/docs/resources/support"
  },

  "github": {
    "repo": "https://github.com/shoelace-style/webawesome",
    "issues": "https://github.com/shoelace-style/webawesome/issues",
    "discussions": "https://github.com/shoelace-style/webawesome/discussions",
    "ideas": "https://github.com/shoelace-style/webawesome/discussions/categories/ideas-suggestions",
    "helpSupport": "https://github.com/shoelace-style/webawesome/discussions/categories/help-support",
    "stargazers": "https://github.com/shoelace-style/webawesome/stargazers"
  },

  "emails": {
    "hello": "hello@webawesome.com",
    "help": "help@webawesome.com",
    "privacy": "privacy@webawesome.com",
    "dpo": "dpo@awesome.me"
  },

  "legal": {
    "licenseCore": "/license",
    "licensePro": "/license/pro",
    "privacy": "/privacy",
    "tos": "/tos",
    "refunds": "/refunds"
  }
}

Eleventyの _data/ 規約 により、このファイルは自動的にテンプレートのグローバルデータとして読み込まれ、全ての .njk / .md ファイルから {{ site.* }} 形式でアクセスできます。既存のビルドマージの仕組みによって、docsバンドルへの伝播も自動的に行われます。

各ファイル側の変更は、ハードコード値をテンプレート参照に置き換えるのみです。たとえば sidebar-colophon.njk では次のように変わります。

変更前:

<a href="https://github.com/shoelace-style/webawesome" rel="noopener noreferrer" target="_blank">
  <wa-icon family="brands" name="github" label="GitHub"></wa-icon>
</a>
<a href="https://discord.gg/mg8f26C" rel="noopener noreferrer" target="_blank">
  <wa-icon family="brands" name="discord" label="Discord"></wa-icon>
</a>

変更後:

<a href="{{ site.github.repo }}" rel="noopener noreferrer" target="_blank">
  <wa-icon family="brands" name="github" label="GitHub"></wa-icon>
</a>
<a href="{{ site.urls.discord }}" rel="noopener noreferrer" target="_blank">
  <wa-icon family="brands" name="discord" label="Discord"></wa-icon>
</a>

なお、フロントマター・<title>/<meta> タグ・コードブロック・フィクスチャデータはリテラルのままとされており、テンプレート参照への置き換えは意図的に対象外とされています。

設計判断

Eleventyの _data/ 規約を活用することで、フレームワークの既存の仕組みに乗る形でデータ集約が実現されています。 専用のプラグインや設定変更を加えることなく、JSONファイルを配置するだけでグローバルデータとして機能するEleventyの特性を最大限に利用した設計です。

データ構造はフラットなキーバリューではなく、urlsgithubemailslegalsiblings といるカテゴリで階層化されています。これにより、site.github.issues のようにコンテキストが明確なパスでデータにアクセスでき、テンプレート内での意図が読み取りやすくなっています。

またPR説明では、フロントマターやコードブロック内のリテラルは意図的に変更対象から除外されたことが明記されています。これはテンプレートエンジンの処理対象外となる箇所や、ドキュメントのサンプルとして示す目的のコードに {{ site.* }} を混入させないための判断と読み取れます。

まとめ

_data/site.json の導入により、WebAwesomeドキュメントサイトの繰り返し文字列が単一の真実の源(Single Source of Truth)に集約されました。Eleventyの規約に沿った最小限の変更でありながら、ブランド名・URL・メールアドレスの一括管理という保守性の向上をもたらす変更です。

記事メタデータ

Generated by:
Claude Sonnet 4.6 for DiffDaily
LLM Trace:
b3ce2526

この記事はAIによって自動生成されています。内容の正確性については、必ずソースコードやPRを確認してください。

品質レビュー結果

Review Status:
リトライ後承認
Review Count:
2回 (改善を経て承認)
Reviewed by:
Gemini 2.5 Pro for DiffDaily

Review Criteria:

記事構成 ✓ PASS

Title, Context, Technical Detailの存在と明確さ

「総論→各論→結論」の構成が明確で、リード文、背景、技術的な変更、設計判断、まとめの各要素が過不足なく含まれています。

カスタムMarkdown構文 ✓ PASS

シンタックスハイライト・GitHubリンク記法の正確性

ファイル名付きシンタックスハイライト(例: ```json:filepath)とGitHubのPRリンク記法([#2359](URL))が正しく使用されています。

対象読者への適合性 ✓ PASS

エンジニア向けの適切な技術レベルと表現

Eleventyやテンプレート構文に関する知識を前提としており、対象読者であるエンジニアに適した技術レベルと表現です。

パラグラフ・ライティング ✓ PASS

トピックセンテンス・1段落1トピック・段落長

各セクションが要旨から詳細への構成になっており、各段落もトピックセンテンスで始まるなど、パラグラフ・ライティングの原則が守られています。

Diff内容との照合 ✓ PASS

コードブロックとDiff内容の一致

記事内で引用されている`site.json`のコードブロックや`sidebar-colophon.njk`の変更前後比較は、提供されたDiff情報と完全に一致しています。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

「Eleventy」「_data/ 規約」「フロントマター」など、関連する技術用語が文脈に沿って正確に使用されています。

説明の技術的正確性 ✓ PASS

技術的主張の正確性と論理性

Eleventyの`_data/`規約が自動的にグローバルデータを生成する仕組みについての説明は技術的に正確であり、PRの記述とも整合性が取れています。

事実の突合 ✓ PASS

PR情報による主張の裏付け(ハルシネーション検出)

記事内の主張(約54ファイルへの影響、意図的な除外対象など)はすべてPR Descriptionの情報で裏付けられており、ハルシネーションは検出されませんでした。

数値・固有名詞の確認 ✓ PASS

PR番号・コミットID・バージョン等の正確性

PR番号(#2359)や影響ファイル数(約54)などの数値や固有名詞はすべて正確です。

タイトル・説明との一致 ✓ PASS

記事タイトル・説明とPR内容の一致

記事タイトル「ドキュメントサイトデータの一元管理:`site.json`の導入」は、PRの主題である「共有データの導入」を的確に要約しています。

外部知識の正確性 ✓ PASS

PRに記載のない外部知識(LTS、サポート状況など)の不使用

PR情報に記載のないバージョン情報やリリース日程などの外部知識は含まれておらず、内容はPRに忠実です。

時間表現の正確性 ✓ PASS

時間表現がPR情報と一致しているか

変更が実施されたという事実を正確に伝えており、時間表現の歪曲は見られません。