SSR support and related enhancements in Web Awesome

shoelace-style/webawesome

Web Awesome now provides optional server‑side rendering (SSR) across its documentation site and component demos, exposing user‑controlled toggles, cookie persistence, and updated build pipelines to enable a seamless SSR experience without breaking existing client‑side rendering.

背景

SSR が求められる背景には、SEO の向上と初回ロード時間短縮という要件がある一方、既存のクライアント‑サイド実装との互換性を保つ必要があった。PR #2428 では、Issue #1861HasSlotController に対するサーバー環境チェックや、Issue #2369 のスロット描画不具合を解消しつつ、SSR のフラグ管理と UI 切替機能を追加した。

技術的な変更

GitHub Actions ワークフローpushpull_requestnext ブランチで走るよう拡張され、SSR テスト用ジョブが有効化された。

パッケージバージョン が更新され、@lit-labs/eleventy-plugin-lit が 1.0.3 → 1.0.6、@lit-labs/ssr が 3.x → 4.x に上げられ、SSR 用の依存関係が最新に揃えられた。

Eleventy 設定 (packages/webawesome/docs/.eleventy.js) に isDev 判定と serverBuild フラグに加えて、globalDataisDevssr の情報が注入され、SSR の有効化を環境変数 SSR で制御できるようになった。条件分岐の内部で globalThis.litSsrCallConnectedCallback = true; を設定し、connectedCallback が SSR コンテキストでも呼び出される保証を追加した。

テンプレート変更:
- base.njkwa-cloak クラスを SSR 時に除外し、テーマ/パレットクッキーのサーバー側取得を支援した。
- head.njk<script type="module" src="/dist/webawesome.ssr-loader.js"></script> を挿入し、SSR ローダーを常時ロード。
- 新規テンプレート ssr-switch.njk を作成し、wa-switch と SSR 説明ボタン/ツールチップを提供。クッキー webawesome_ssr の永続化ロジックは head.njksetCookie / removeCookie 関数で実装された。
- nav-products.njksidebar.njk などの UI 位置に ssr-switch.njk を組み込み、ユーザーが UI から SSR のオンオフを切り替えられるようにした。
- component.njk に SSR セクションを追加し、コンポーネントが SSR に対応しているかを自動的に表示できるようにした。

カスタム要素マニフェスト (custom-elements-manifest.js) に ssr タグを許容する配列要素を追加し、SSR 用メタ情報を文書化できるようにした。

テーマクッキー の保存ロジックが theme.js に統合され、ブランド・パレット・テーマの変更が Cookies に永続化され、SSR 後のリクエストでも同一テーマが再現できる。

ハイドレーションエラー可視化 (hydration-errors.js) が非同期 import に変更され、エラー処理が遅延ロードで実行されるよう最適化された。また CSS (hydration-errors.css) が差分表示用のスタイルを追加し、挿入・削除箇所が緑・赤でハイライトされるようになった。

設計判断

SSR のオプトイン方式 として UI スイッチとクッキーを採用したのは、既存のクライアント‑サイド利用者への影響を最小化しつつ、開発者がサーバー側レンダリングを手軽に試せるデザイン選択である。base.njk の条件分岐で wa-cloak を除外し、SSR 時の FOUC を防止する点も、ユーザー体験を保護する意図が明確だ。

依存バージョンの一括更新 は、Lit の SSR エコシステム全体を同一メジャーバージョンへ合わせることで、将来の破壊的変更リスクを減らす方針と合致している。@lit-labs/ssr が 4.x になることで、@lit-labs/ssr-dom-shim の互換性も向上し、SSR 用ビルドが安定化した。

カスタムマニフェスト拡張 は、SSR 対応情報を自動生成ドキュメントに埋め込む手段として、設計上の一貫性を保ちつつメンテナンスコストを抑える選択である。ssr タグを既存の customTags に追加するだけで、追加のスキーマ変更を回避できた。

まとめ

この PR は、Web Awesome に SSR のスイッチング機構とサーバー側レンダリング支援を導入し、開発者とエンドユーザー双方に安全かつ柔軟な SSR 体験を提供する。既存のクライアント‑サイド実装はそのまま動作し、テーマ・パレット設定もサーバーで保持できるため、今後のドキュメントやアプリケーションで SSR を段階的に拡張できる基盤が整った。

記事メタデータ

Generated by:
gpt-oss-120b for DiffDaily
LLM Trace:
dc978096

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

品質レビュー結果

Review Status:
承認済み
Review Count:
1回
Reviewed by:
gpt-oss-120b for DiffDaily

Review Criteria:

記事構成 ✓ PASS

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

リード文と「背景」「技術的な変更」「設計判断」「まとめ」の四つのセクションが揃っており、総論→各論→結論の流れが明確です。

カスタムMarkdown構文 ✓ PASS

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

コードブロックは使用していませんが、GitHubリンクは正しい形式で記載されており、シンタックスハイライトの記法違反はありません。

対象読者への適合性 ✓ PASS

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

エンジニア向けに技術的な詳細が中心で、初心者向けの過度な解説はありません。

パラグラフ・ライティング ⚠ WARNING

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

「技術的な変更」セクションが長文で複数トピックが混在しており、1段落に1トピック・6文以内の基準を満たしていません。段落分割と要点の整理が必要です。

Diff内容との照合 ✓ PASS

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

記事内の変更点(GitHub Actions、パッケージバージョン、Eleventy 設定、テンプレート追加等)は Diff の内容と一致しています。コードブロックの直接引用はありませんが、説明は正確です。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

SSR、CSR、hydration、custom‑elements‑manifest などの用語は PR 内容と合致しており、誤用は見られません。

説明の技術的正確性 ✓ PASS

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

PR のチェックリスト項目(テストの CSR/SSR、テーマのサーバー保持、HasSlotController 修正等)すべてが記事で正しく説明されています。

事実の突合 ✓ PASS

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

PR に記載された事実以外の推測や外部知識はなく、すべての主張に根拠があります。

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

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

PR 番号・Issue 番号・バージョン番号などが正確に記載されています。

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

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

記事タイトルは PR の「Working on SSR」の趣旨を拡張して表現しており、内容と合致しています。

外部知識の正確性 ✓ PASS

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

LTS やリリーススケジュール等、PR に無い外部情報は含まれていません。

時間表現の正確性 ✓ PASS

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

時間表現の歪曲はなく、PR の記述と一致しています。