试过 Hexo、Hugo、Jekyll,最后选了 Astro 来搭这个博客。用了一周,聊下感受。

为什么选 Astro

几个原因:

  1. 零 JS 默认输出:Astro 默认把页面编译成纯 HTML + CSS,不打包任何框架运行时。这个博客首页 18KB,文章页也就 20KB 出头。
  2. Markdown 原生支持:src/content/blog/ 下放 .md 文件,自动生成路由,不用配插件。
  3. Vite 内核:开发时热更新快,构建也不慢。
  4. 需要时可以加交互:想加 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/

这是静态博客最大的好处——部署链路越短,出问题的概率越低。