用 Astro 在 Cloudflare Pages 上搭一个博客
从零到上线,一套零成本、加载飞快、好维护的个人博客方案。
你正在看的这个博客,就是用本文的方法搭的。整套方案的目标只有三个:快、便宜、好维护。
为什么是 Astro
写博客的框架很多,我最后选了 Astro,理由很简单:
- 默认零 JavaScript。文章页本质上是静态 HTML,浏览器不用先跑一大堆框架代码才能显示一段文字。
- Markdown 是一等公民。用内容集合(content collections)管理文章,还带类型校验。
- 组件化但不绑架你。
.astro组件写起来像 HTML,需要时再引入 React/Vue 也行。
三步跑起来
# 1. 创建项目
npm create astro@latest my-blog
# 2. 本地预览
cd my-blog && npm run dev
# 3. 构建静态文件
npm run build # 产物在 dist/
文章用 Markdown 写,扔进 src/content/blog/ 就行。一个内容集合的定义大概长这样:
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(),
pubDate: z.coerce.date(),
category: z.enum(['tech', 'ai', 'essay']),
}),
});
export const collections = { blog };
schema 会在构建时校验每篇文章的 frontmatter——写错字段名直接报错,比上线后才发现强多了。
部署到 Cloudflare Pages
Cloudflare Pages 对静态站点几乎是免费的,全球 CDN,加载延迟极低。两种部署方式:
- 连 Git 仓库(推荐):在 Pages 里选中仓库,构建命令填
npm run build,输出目录填dist。之后每次git push自动部署。 - 直接上传:本地
npm run build后,用wrangler pages deploy dist把产物推上去。
关键就一句话:构建命令
npm run build,输出目录dist。剩下的 Cloudflare 都替你搞定。
还能再快一点
- 给
/_astro/*这类带哈希的资源设置max-age=31536000, immutable,让浏览器永久缓存。 - 用系统字体栈,省掉网络字体的加载等待。
- 图片用 Astro 的
<Image />组件自动压缩。
一套下来,Lighthouse 性能分轻松满分,而你每个月的账单是——零。