试过 Hexo、Hugo、Jekyll,最后选了 Astro 来搭这个博客。用了一周,聊下感受。
为什么选 Astro
几个原因:
- 零 JS 默认输出:Astro 默认把页面编译成纯 HTML + CSS,不打包任何框架运行时。这个博客首页 18KB,文章页也就 20KB 出头。
- Markdown 原生支持:
src/content/blog/下放.md文件,自动生成路由,不用配插件。 - Vite 内核:开发时热更新快,构建也不慢。
- 需要时可以加交互:想加 React/Vue 组件时,
client:visible指令按需加载,不用全量 hydrate。
Content Collections
Astro 5 的 Content Collections 用了新的 glob loader:
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(),
tags: z.array(z.string()).optional(),
excerpt: z.string().optional(),
}),
});
好处是 frontmatter 有类型校验——写错字段名构建直接报错,不用等上线才发现。
踩的坑
npm create astro 超时:官方脚手架会从 npm 下载依赖,网络不稳直接 ETIMEDOUT。解法是手写 package.json + npm install --registry=https://registry.npmmirror.com。
trailingSlash:Astro 默认 /blog/hello-newdog/(带尾斜杠)。Nginx 的 try_files $uri $uri/index.html 配合得好就没问题。
部署
构建产物是纯静态文件,rsync 到服务器 Nginx 直接 serve。0 运行时内存,0 进程管理,0 故障面。
npm run build && rsync -az dist/ root@server:/opt/blog/dist/
这是静态博客最大的好处——部署链路越短,出问题的概率越低。