コンテンツにスキップ

ADR-0030: 種別を記事の 1 つにし、構成を記事の形式で、シリーズをディレクトリで表す

Status

承認

Context

サイトの目的は、訪問者がコードを書いて動かしながら、技術の仕組みを体系的に学べることである。
出典: PRD

コンテンツの違いは、2 つの軸に分かれる。

  • 構成: 1 ページで上から下へ読むか、複数のセクションに分かれた手順を順に進めるか。
  • 埋め込むコンテンツ: Mermaid の記法で書いた図、実行環境、キャンバスの図、スライド。

今の決定は、次のとおり。

運営者がハンズオンを別の種別にしていた理由は、構成(複数のセクション)であり、埋め込むコンテンツではない。
1 つの主題のシリーズには、1 ページの記事と、手順の記事の両方が入る。

古いサイトの記事、ハンズオン、playground の原稿とコードは、引き継がない。
実行環境の方式は、実行環境の要求の prototype で決める。

Decision

1. 種別と形式

  • コンテンツの種別は、記事の 1 つにする。
  • 構成は、記事の frontmatter の形式(format)で決める。形式は、1 ページ(page)と手順(steps)の 2 つである。書かなければ 1 ページになる。
  • 形式が手順の記事は、1 つの URL の中で、本文の h2 を 1 つの手順にする。手順は、URL の # で指す。
  • schema は、実装した形式の値だけを受け付ける。先に受け付けると、ビルドを通った記事が、表示のときに崩れるためである。最初は、1 ページだけを受け付ける。
  • 埋め込むコンテンツは、種別にも形式にもしない。本文に置く機能として、形式と独立に追加する。
  • 記事の schema は、実行環境の項目を持たない。手を動かす場所の 4 つの分類をやめる。
  • 実行環境の選び方と埋め込み方は、この ADR では決めない。実行環境の方式を決める ADR が決める。
    • 選び方は、ADR-0033(Node)、ADR-0037(Go)、ADR-0053(DB)が決める。
    • 記事への埋め込み方は、ADR-0034 と ADR-0049 が決める。記事は実行環境を iframe で埋め込み、island どうしをつながないので、island のつなぎ方は決めない。
  • 手順の形式は、外部の Codelab のツールを使わず、サイトのページとして描く。h2 を手順にまとめる処理の配置先は、手順の形式を作るときに決め直す。
  • contentId、公開の状態(status)、片方向の関連は引き継ぐ。

種別を 1 つにする理由は、1 つのシリーズに、1 ページの記事と手順の記事を並べられるためである。

2. URL

URL 中身
/ トップ。プロフィールを兼ねる
/articles 記事の一覧
/articles/<slug> シリーズに入れない記事
/articles/<series>/<slug> シリーズの中の記事
/series/<series> シリーズのページ。タイトル、説明、読む順の記事の一覧
/playground プレイグラウンドの一覧。ツールは、プレイグラウンドのサブドメインに置く
/rss.xml RSS
  • 記事の URL は /articles/ の下にあるので、ほかの URL と重ならない。記事のパスに使えない語の予約は持たない。
  • 一覧は 1 つにする。形式が手順の記事には、一覧で「ハンズオン」のラベルを付ける。
  • 古いサイトの URL(/blog、/labs/<path> など)は、転送しない。同じ中身のページが無いためである。404 のページから、記事の一覧へ案内する。

3. シリーズ

  • 原稿は apps/web/src/content/articles/ に置く。
  • articles/<series>/ のディレクトリが、1 つのシリーズになる。ディレクトリの入れ子は 1 階層までにする。
  • 読む順は、記事の frontmatter の order で決める。1 つのシリーズの中で order が重なると、ビルドが失敗する。
  • シリーズのタイトルと説明は、ディレクトリの index.md に書く。
  • シリーズに入れない記事は、articles/ の直下に置く。

記事を追加するときに変えるファイルは、その Markdown の 1 枚である。
新しいシリーズを作るときだけ、index.md を追加する。

4. 図と検索

  • mermaid のフェンスは、ビルドのときに Pele で SVG にする。
  • フェンスの run の有無で、ビルドのときの描画と、クライアントの island の描画に分ける規則は引き継ぐ。最初に作るのは、ビルドのときの描画だけである。
  • 本文の検索と Pagefind の索引は、最初は作らない。記事が増えて、一覧とシリーズから辿れなくなったときに作る。

Considered Options

選択肢 強み 弱み
採用: 種別は記事の 1 つ。構成は形式で、シリーズはディレクトリで表す 1 つのシリーズに、1 ページの記事と手順の記事を並べられる。一覧と URL が 1 つで済む。新しい表示の形式を、形式の値で追加できる frontmatter に形式を書くルールが増える
記事とハンズオンを、ディレクトリと URL で分ける 2 つの種別にする 種別ごとに schema を分けられる。今の URL を変えない シリーズが種別をまたぐので、ディレクトリでシリーズを表せない。新しいシリーズのたびに、別のファイルを追加する。一覧と URL が種別の数だけ増える
種別は記事の 1 つで、構成は 1 ページだけにする。ハンズオンは、シリーズで表す 手順ごとに URL がある。JavaScript なしで手順を進められる 手順をまたぐとページを開き直すので、埋め込んだ実行環境の状態が次の手順に残らない。ハンズオンを、シリーズの中の 1 本にできない
シリーズごとのファイルに、記事を読む順に並べて書く 順の入れ替えが 1 か所で済む 記事を追加するたびに、2 つのファイルを変える

Consequences

Positive

  • 記事を追加する操作が、Markdown の 1 枚で済む。
  • 一覧、URL、schema が、種別の数に応じて増えない。
  • 埋め込むコンテンツを、種別と形式を変えずに追加できる。

Negative

  • 古いサイトの URL は、開けなくなる。
  • シリーズの途中に記事を挟むと、後ろの記事の order を直すことがある。
  • 「種別は置いたディレクトリで決まる」というルールは、種別が 1 つになるので意味を持たなくなる。形式は frontmatter で決まる。
  • 手順の形式を作るときに、h2 を手順にまとめる処理の配置先を決め直す。