Astro 综合实战
我们要做什么
把前面学到的知识串起来,从零搭一个最简博客站,具备:首页列表、文章页、布局外壳、内容集合管理文章,这是一个能真实使用的骨架。
第一步 初始化
npm create astro@latest my-blog -- --template empty
cd my-blog
npm install
第二步 定义内容集合
// src/content.config.ts
import { defineCollection, z } from 'astro:content';
import { glob } from 'astro/loaders';
const blog = defineCollection({
loader: glob({ pattern: '**/*.md', base: './src/content/blog' }),
schema: z.object({
title: z.string(),
date: z.coerce.date(),
}),
});
export const collections = { blog };
新建两篇文章:
---
title: 第一篇文章
date: 2026-08-26
---
这是正文。
---
title: 第二篇文章
date: 2026-08-25
---
这是另一篇。
第三步 写布局
---
// src/layouts/BaseLayout.astro
import '../styles/global.css';
const { title } = Astro.props; // 接收页面传入的标题
---
<html lang="zh-CN">
<head>
<meta charset="utf-8" />
<title>{title}</title>
</head>
<body>
<header><a href="/">我的博客</a></header>
<main><slot /></main>
</body>
</html>
第四步 首页列出文章
---
// src/pages/index.astro
import BaseLayout from '../layouts/BaseLayout.astro';
import { getCollection } from 'astro:content';
// 读取文章并按日期倒序
const posts = (await getCollection('blog'))
.sort((a, b) => b.data.date.valueOf() - a.data.date.valueOf());
---
<BaseLayout title="首页">
<h1>文章列表</h1>
<ul>
{posts.map((post) => (
<li><a href={`/blog/${post.id}`}>{post.data.title}</a></li>
))}
</ul>
</BaseLayout>
第五步 文章页
---
// src/pages/blog/[id].astro
import BaseLayout from '../../layouts/BaseLayout.astro';
import { getCollection } from 'astro:content';
// getStaticPaths 返回要生成的每个文章页:params 是网址参数,props 是数据
export async function getStaticPaths() {
const posts = await getCollection('blog');
return posts.map((post) => ({
params: { id: post.id },
props: { post },
}));
}
const { post } = Astro.props;
const { Content } = await post.render(); // render() 返回 { Content } 组件,渲染 Markdown 正文
---
<BaseLayout title={post.data.title}>
<article>
<h1>{post.data.title}</h1>
<!-- toISOString().slice(0,10) 把日期格式化成 YYYY-MM-DD -->
<time>{post.data.date.toISOString().slice(0, 10)}</time>
<Content />
</article>
</BaseLayout>
第六步 本地验证
npm run dev
打开首页能看到两篇文章链接,点进去能看到正文,说明骨架跑通了。
接下来可以加什么
- 文章分类与标签页
- 分页,文章变多时分批展示
- 搜索功能(客户端脚本或集成)
- 评论系统(如 Giscus)
- 部署上线(参考 Astro 部署)