このサイトを構成している技術の全体像

My Tech Guide が Astro、Markdown/MDX、Content Collections、Pagefind、Mermaid、Cloudflare Pages でどう作られているかを整理する入門ガイド。

このサイトは、記事を増やし続けることを優先した静的な技術解説サイトです。Astroでページを生成し、Markdown/MDXで記事を書き、Content Collectionsで記事情報を管理し、Pagefindで検索し、Mermaidで図解を入れ、Cloudflare Pagesで公開する構成になっています。

1. まず全体像を見る

このサイトの技術は、「書く」「組み立てる」「探す」「図解する」「公開する」の5つに分けると理解しやすいです。

flowchart LR
  W["記事を書く\nMarkdown / MDX"] --> C["記事を管理する\nAstro Content Collections"]
  C --> A["ページを生成する\nAstro"]
  A --> H["静的HTML/CSS/JS\n dist/"]
  H --> P["検索インデックスを作る\nPagefind"]
  H --> D["公開する\nCloudflare Pages"]
  G["変更履歴を残す\nGit / GitHub"] --> D
  M["図解を書く\nMermaid"] --> W
役割使っている技術このサイトでの意味
サイト生成Astro記事一覧、カテゴリページ、記事ページを静的HTMLとして作る
記事本文Markdown / MDX文章中心で記事を書き、必要なときだけコンポーネントも使う
記事管理Astro Content Collectionsfrontmatterの形をそろえ、記事データをページ側から扱いやすくする
検索Pagefindビルド済みHTMLから検索用インデックスを作る
図解Mermaidテキストでフローチャートや関係図を書く
公開Cloudflare Pagesdist/ に生成された静的ファイルを配信する
変更管理Git / GitHub記事とコードの変更履歴を残し、デプロイ連携の入口にする
最初の理解: このサイトは、サーバーで毎回ページを組み立てるアプリではありません。手元やCIで先にHTMLを作り、その完成品をCloudflare Pagesから配る「静的サイト」です。

2. Astroはサイトを組み立てる道具

Astroは、Markdown中心のコンテンツサイトを作りやすい静的サイトジェネレーターです。

このサイトでは、src/pages/ に置いたAstroファイルがURLになります。たとえばトップページは src/pages/index.astro、記事一覧は src/pages/articles/index.astro、記事ページは src/pages/articles/[...slug].astro が担当します。

ファイル担当
astro.config.mjsAstro全体の設定。サイトURL、静的出力、MDX連携などを指定する
src/pages/index.astroトップページ。カテゴリ一覧や最新記事を表示する
src/pages/articles/[...slug].astro記事詳細ページ。記事本文と目次を表示する
src/layouts/BaseLayout.astro全ページ共通のHTML骨格やメタ情報を持つ
src/styles/global.cssサイト全体の見た目を管理する

設定ファイルでは、現在このように静的サイトとして出力する指定になっています。

import { defineConfig } from "astro/config";
import mdx from "@astrojs/mdx";

export default defineConfig({
  site: "https://my-tech.pages.dev",
  output: "static",
  integrations: [mdx()]
});
ポイント: output: "static" なので、ビルド時にページを作って dist/ へ出します。ログイン機能やリアルタイム更新が中心ではなく、読み物を高速に配るサイトと相性がよい構成です。

3. MarkdownとMDXは記事を書くための形式

記事本文は、基本的にMarkdownまたはMDXで書きます。文章を主役にできるので、技術ノートを増やしやすい形式です。

Markdownは、見出し、段落、リスト、表、コードブロックなどを軽い記法で書ける形式です。MDXはMarkdownに加えて、AstroコンポーネントやJSXに近い表現を使える形式です。

形式向いている記事このサイトでの使い分け
.md文章、表、コード例が中心の記事通常の解説記事に使う
.mdx本文中に部品や動くUIを入れたい記事練習問題の答え表示など、コンポーネントが必要な記事に使う

記事の先頭にはfrontmatterを書きます。これは記事のタイトル、説明、カテゴリ、タグ、更新日などをページ側で使うためのメタ情報です。

---
title: "記事タイトル"
description: "記事の説明"
category: "開発ツール"
categorySlug: "tools"
tags: ["Astro", "Markdown"]
level: "beginner"
updated: "2026-05-19"
draft: false
---
書くときの感覚: Markdown/MDXは「本文を書く場所」、frontmatterは「記事一覧やSEOで使う記事カードの情報」と考えると分かりやすいです。

4. Content Collectionsは記事の形をそろえる仕組み

Content Collectionsは、記事ファイルの集まりをAstroから安全に扱うための仕組みです。

このサイトでは、記事は src/content/articles/ 以下に置きます。カテゴリごとに web/languages/tools/ のようなフォルダに分かれています。

flowchart TD
  Root["src/content/articles/"] --> Web["web/"]
  Root --> Lang["languages/"]
  Root --> Tools["tools/"]
  Web --> A1["web-technology-complete-guide.md"]
  Lang --> A2["python-uv-complete-guide.md"]
  Tools --> A3["site-technology-stack-guide.md"]
  Config["src/content.config.ts"] --> Root

src/content.config.ts では、記事に必要なfrontmatterの形が定義されています。

const articles = defineCollection({
  type: "content",
  schema: z.object({
    title: z.string(),
    description: z.string(),
    category: z.string(),
    categorySlug: z.string(),
    tags: z.array(z.string()),
    level: z.enum(["beginner", "intermediate", "advanced"]).default("beginner"),
    updated: z.string(),
    draft: z.boolean().default(false)
  })
});

これにより、記事に titlecategorySlug が足りない場合、ビルド時に気づきやすくなります。記事が増えても、一覧ページやカテゴリページが同じ形のデータとして扱えるのが利点です。

5. Pagefindは静的サイトに検索を足す道具

Pagefindは、完成したHTMLを読み取り、ブラウザ上で使える検索インデックスを作るツールです。

このサイトの package.json には、検索用のコマンドが用意されています。

{
  "scripts": {
    "build": "astro build",
    "pagefind": "pagefind --site dist",
    "build:search": "astro build && pagefind --site dist"
  }
}
コマンド何をするか使う場面
npm run buildAstroで静的サイトを生成する記事やページが壊れていないか確認する
npm run pagefinddist/ のHTMLから検索インデックスを作る検索データだけ作り直したいとき
npm run build:searchビルド後にPagefindを実行する公開前に検索まで含めて確認したいとき
注意: Pagefindは通常、Astroのビルド後に実行します。先に dist/ のHTMLがないと、検索対象がありません。

6. Mermaidは図解をテキストで書く道具

Mermaidを使うと、フローチャートや関係図をテキストとして記事内に保存できます。

このサイトの記事では、次のように premermaid クラスを使って図を置いています。

<div class="diagram">
<pre class="mermaid">
flowchart LR
  A["記事を書く"] --> B["ビルドする"]
  B --> C["公開する"]
</pre>
</div>

画像ファイルとして図を作る方法と違い、本文と同じGit管理に載せられます。あとから文章を直すのと同じ感覚で図も直せるため、技術解説記事と相性がよいです。

7. Cloudflare Pagesは静的ファイルを公開する場所

Cloudflare Pagesは、ビルド済みの静的ファイルをインターネットに配信するホスティングサービスです。

このサイトは output: "static" のAstroサイトなので、基本的には次の流れで公開できます。

  1. 記事やコードを編集する
  2. npm run builddist/ を生成する
  3. GitHubへ変更を反映する
  4. Cloudflare Pagesがビルドして公開する

Cloudflare Pages側の代表的な設定は、Astroの公式手順では次のようになります。

設定項目
Framework presetAstro
Build commandnpm run build
Build output directorydist
この構成の良さ: 記事サイトとしては、データベースや常時動くサーバーを持たずに公開できます。管理するものが少ないので、書き続けることに集中しやすくなります。

8. 記事を追加するときの作業順

このサイトで新しい記事を追加するときは、ファイル作成、frontmatter記入、本文作成、ビルド確認の順に進めます。

# 依存関係を入れていない場合だけ実行
npm install

# 開発サーバーを起動
npm run dev

# 公開用HTMLを生成して確認
npm run build

# 検索インデックスまで作る
npm run build:search
確認すること見る場所
記事が一覧に出るか/articles/
カテゴリページに出るか/categories/tools/ など
目次リンクが動くか記事ページの左側または上部の目次
コードブロックが読みやすいか記事本文のサンプルコード
検索対象に入るかPagefind実行後の検索UI

9. よくあるつまずき

静的サイトは仕組みが軽い一方で、記事ファイルの書き方やビルド順を間違えると表示に影響します。

つまずき原因対策
記事が一覧に出ないfrontmatter不足、カテゴリslug違い、draft設定などsrc/content.config.ts と既存記事を見比べる
目次リンクが飛ばない<section id="..."> が本文上で正しくHTMLとして解釈されていないHTMLタグ行を不要にインデントしない
検索に出ないPagefindをビルド前に実行しているnpm run build:search の順序で実行する
図解が表示されないMermaidの記法ミス、または表示側の初期化不足短い図から作り、括弧や引用符を確認する
公開結果が古いGitHubへの反映やCloudflare Pagesのビルドが完了していないデプロイログと対象ブランチを確認する

10. まず覚えること

このサイトは、文章を増やしやすく、静的に速く配信できる構成です。

  • Astroは、記事やページを静的HTMLへ組み立てる。
  • Markdown/MDXは、記事本文を書くための形式。
  • Content Collectionsは、記事のメタ情報をそろえて扱う仕組み。
  • Pagefindは、ビルド済みHTMLから検索を作る。
  • Mermaidは、図解をテキストで管理する。
  • Cloudflare Pagesは、生成された dist/ を公開する場所。
  • GitHubは、変更履歴とデプロイ連携の中心になる。

参考ソース