このサイトを構成している技術の全体像
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 Collections | frontmatterの形をそろえ、記事データをページ側から扱いやすくする |
| 検索 | Pagefind | ビルド済みHTMLから検索用インデックスを作る |
| 図解 | Mermaid | テキストでフローチャートや関係図を書く |
| 公開 | Cloudflare Pages | dist/ に生成された静的ファイルを配信する |
| 変更管理 | Git / GitHub | 記事とコードの変更履歴を残し、デプロイ連携の入口にする |
2. Astroはサイトを組み立てる道具
Astroは、Markdown中心のコンテンツサイトを作りやすい静的サイトジェネレーターです。
このサイトでは、src/pages/ に置いたAstroファイルがURLになります。たとえばトップページは src/pages/index.astro、記事一覧は src/pages/articles/index.astro、記事ページは src/pages/articles/[...slug].astro が担当します。
| ファイル | 担当 |
|---|---|
astro.config.mjs | Astro全体の設定。サイト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
---
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)
})
});
これにより、記事に title や categorySlug が足りない場合、ビルド時に気づきやすくなります。記事が増えても、一覧ページやカテゴリページが同じ形のデータとして扱えるのが利点です。
5. Pagefindは静的サイトに検索を足す道具
Pagefindは、完成したHTMLを読み取り、ブラウザ上で使える検索インデックスを作るツールです。
このサイトの package.json には、検索用のコマンドが用意されています。
{
"scripts": {
"build": "astro build",
"pagefind": "pagefind --site dist",
"build:search": "astro build && pagefind --site dist"
}
}
| コマンド | 何をするか | 使う場面 |
|---|---|---|
npm run build | Astroで静的サイトを生成する | 記事やページが壊れていないか確認する |
npm run pagefind | dist/ のHTMLから検索インデックスを作る | 検索データだけ作り直したいとき |
npm run build:search | ビルド後にPagefindを実行する | 公開前に検索まで含めて確認したいとき |
dist/ のHTMLがないと、検索対象がありません。
6. Mermaidは図解をテキストで書く道具
Mermaidを使うと、フローチャートや関係図をテキストとして記事内に保存できます。
このサイトの記事では、次のように pre と mermaid クラスを使って図を置いています。
<div class="diagram">
<pre class="mermaid">
flowchart LR
A["記事を書く"] --> B["ビルドする"]
B --> C["公開する"]
</pre>
</div>
画像ファイルとして図を作る方法と違い、本文と同じGit管理に載せられます。あとから文章を直すのと同じ感覚で図も直せるため、技術解説記事と相性がよいです。
7. Cloudflare Pagesは静的ファイルを公開する場所
Cloudflare Pagesは、ビルド済みの静的ファイルをインターネットに配信するホスティングサービスです。
このサイトは output: "static" のAstroサイトなので、基本的には次の流れで公開できます。
- 記事やコードを編集する
npm run buildでdist/を生成する- GitHubへ変更を反映する
- Cloudflare Pagesがビルドして公開する
Cloudflare Pages側の代表的な設定は、Astroの公式手順では次のようになります。
| 設定項目 | 値 |
|---|---|
| Framework preset | Astro |
| Build command | npm run build |
| Build output directory | dist |
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は、変更履歴とデプロイ連携の中心になる。