すべての記事

このブログの設計思想と使えるすべての機能

このブログの設計思想と使えるすべての機能

このブログの設計思想と使えるすべての機能

この記事は単なる「機能紹介」ではない。 このブログシステムにおいて、 HTMLをどう書けば壊れずに、Reactとして正しく振る舞うか を示すための基準実装である。

もしこの記事が壊れるなら、 それはブログシステム側のバグである。


なぜReact化したのか

記事はもともと HTML ファイルで管理していた。 それ自体は今も変わらない。

変えたのは、 その HTML を誰が、いつ、どう解釈するか という点だけだ。

以前は Web Components に解釈させていた。 だがこの方式には、致命的な欠点があった。

・ページ遷移後にアニメーションが再実行されない
・カスタムタグが未定義のまま描画されることがある
・JavaScript の読み込み順に強く依存する

問題の本質は、 DOM のライフサイクルをブラウザ任せにしていたこと だった。

React 化によって、 HTML は「構造を表す入力」になり、 振る舞いは React Component が完全に管理するようになった。


このシステムの前提思想

このブログは CMS ではない。 Markdown 変換エンジンでもない。

正確に言うなら、 HTML を入力言語として使う React AST ジェネレータ である。

この前提を理解しているかどうかで、 書き方は大きく変わる。


レンダリングの流れ

記事は次の手順で表示される。

HTMLファイル ↓(文字列) BlogRenderer(Server Component) ↓ cheerio DOMツリー ↓ 再帰変換 React Element Tree ↓ 静的HTMLとして配信 ↓ Client Component だけが Hydration

重要なのは、 cheerio も BlogRenderer もクライアントには存在しない という点だ。

クライアント側で動くのは、 FadeIn / CodeBlock / AccordionItem など、 明示的に Client Component とされたものだけである。


fade-in — スクロールフェードイン

<fade-in> は、 スクロールで要素が画面に入った瞬間に ふわっと表示させるためのコンポーネントだ。

HTML 的にはタグだが、 React 的には <FadeIn /> コンポーネントそのもの。

delay は「秒」で指定する。
delay="0.2" のように書く。

<fade-in delay="0.2"> <p>スクロールで表示される</p> </fade-in>

この delay がミリ秒だと誤解されやすいが、 仕様違反は静かに動作を殺す。 エラーは出ない。


callout-box — 情報ボックス

callout-box は Server Component であり、 状態を持たない。

そのため、 中にどんな HTML / カスタムタグを入れても安全だ。

情報構造を壊さずに、 視覚的な強調だけを与えられる。


accordion-item — 折りたたみ

accordion-item は Client Component であり、 状態を内部に持つ。

そのため、 再マウントされることが前提設計になっている。

クライアント遷移時も、 React が正しく同一コンポーネントとして認識できる構造を HTML 側が守っているからだ。


code-block — コードブロック

code-block は Client Component で、 コピー機能を持つ。

HTML 内に script を書く必要はない。

npm run dev npm run build

interactive-checklist — 実行可能チェックリスト

このコンポーネントは、 <li> を直下に置く という厳密な前提を持つ。

  • frontmatter が設定されている
  • ファイル名が YYYY-MM-DD-slug.html
  • カスタムタグの閉じ忘れがない
  • npm run dev で確認した
  • npm run build が通った

  • comparison-card — 判断の可視化

    判断を文章ではなく構造で伝えられるのが強みだ。


    progress-bar — 数値の視覚化


    まとめ

    このブログシステムは、 HTML を書く体験を変えずに、 React のライフサイクル管理と 静的生成の恩恵を最大限に引き出すための設計になっている。

    書くのは自由だが、構造は厳密。 だから壊れない。