Svelte 5 と SvelteKit で、Markdown ファイルを記事ソースとした本格的なブログシステムを構築するサンプルです。 Vite の glob import、Front-matter、全文検索(MiniSearch)、タグクラウド、シンタックスハイライトを実装しています。
本リポジトリは TypeScriptで学ぶ Svelte 5/SvelteKit 学習ガイド の教材サンプルです。 コードの解説は学習サイト側に集約されています。本リポジトリは「動くコード」と「解説との対応表」を提供します。
svelte5-blog-example(基礎版) を読み終えた次のステップとして、実運用に近いブログを構築するためのサンプルです。基礎版との差分に学習ポイントを集中させています。
import.meta.glob による Markdown ファイルの一括読み込み(ビルド時)front-matter パッケージ)によるメタデータ管理marked + marked-highlight + Prism.js によるシンタックスハイライトurl.searchParams が使えない等)と回避策| 機能 | 基礎版 (svelte5-blog-example) |
本リポジトリ(発展版) |
|---|---|---|
| 記事データ | TS ファイルにハードコード | content/posts/*.md を glob import |
| メタデータ | TS オブジェクトで直書き | Front-matter |
| 検索 | — | MiniSearch 全文検索 + デバウンス |
| タグ | 記事内に表示のみ | タグクラウド + フィルタ |
| シンタックスハイライト | marked のみ |
marked-highlight + Prism.js |
| 読了時間 | 手書き | 自動計算 |
基礎的なルーティング・レイアウト・Load 関数の理解は基礎版で済ませてから本サンプルに来ることを推奨します。
| 学びたいこと | 該当サンプル |
|---|---|
| SvelteKit の基礎(ルーティング・Load 関数・型) | svelte5-blog-example |
状態管理と .svelte.ts の活用 |
svelte5-todo-example |
| Cookie/Session 認証 | svelte5-auth-basic |
| JWT 認証 | svelte5-auth-jwt |
| 項目 | バージョン |
|---|---|
| Svelte | 5.38.x |
| SvelteKit | 2.37.x |
| TypeScript | 5.9.x |
| Vite | 7.1.x |
| Marked | 16.x |
| marked-highlight | 2.x |
| Prism.js | 1.30.x |
| front-matter | 4.x |
| MiniSearch | 7.x |
| adapter-static | 3.x |
# 依存関係のインストール
npm install
# 開発サーバーの起動
npm run dev
# 型チェック
npm run check
# ビルド(SSG)
npm run build
# ビルド成果物のプレビュー
npm run preview
Node.js 20.x LTS 以上を推奨します。
content/posts/ ディレクトリに Markdown ファイルを追加するだけで、ビルド時に自動で記事一覧・検索インデックス・タグクラウドに反映されます。
YYYY-MM-DD-slug-name.md
例: 2025-01-08-markdown-powered-blog.md
---
title: 記事のタイトル
description: 記事の概要説明(検索対象)
date: 2025-01-08
author: 著者名
tags: [Svelte 5, TypeScript, Markdown]
published: true
featured: false
---
記事の本文(Markdown)...
published: false にするとビルド対象から除外されます。
svelte5-blog-markdown/
├── content/
│ └── posts/ # Markdown 記事(glob import 対象)
├── src/
│ ├── lib/
│ │ ├── components/
│ │ │ ├── ArticleCard.svelte
│ │ │ ├── SearchBox.svelte # デバウンス付き検索入力
│ │ │ └── TagCloud.svelte # タグクラウド
│ │ ├── data/
│ │ │ └── articles.ts # glob import + 公開フィルタ
│ │ ├── utils/
│ │ │ ├── markdown.ts # Front-matter + marked
│ │ │ └── search.ts # MiniSearch インデックス
│ │ └── types/
│ │ └── blog.ts # 型定義(Article / Frontmatter / Searchable)
│ └── routes/
│ ├── +layout.svelte # 全体レイアウト
│ ├── +layout.ts # prerender = true
│ ├── +page.svelte # ホームページ
│ ├── about/
│ │ └── +page.svelte
│ └── blog/
│ ├── +page.svelte # 記事一覧(検索・タグ統合)
│ └── [slug]/
│ ├── +page.svelte # 個別記事
│ └── +page.ts # 動的ルートの Load
└── static/
└── favicon.svg
各ファイルが学習サイトのどの章に対応するかは docs/learning-map.md を参照してください。
npm run dev で動かしながらコードを読むcontent/posts/ に自分の記事を追加して挙動を確認する本サンプルは adapter-static による完全な SSG です。以下の制約があります。
url.searchParams はビルド時に評価できないため、タグフィルタなどはクライアントサイドの $state で管理entries() によるエントリー列挙、または動的ルートのプリレンダリングで全記事を静的生成adapter-static による静的サイト生成で、GitHub Pages に自動デプロイされます。main ブランチへの push でビルド・公開されます。
MIT