4 分钟阅读

从 Hexo 迁过来后,我先补了一下 Astro 6

以前博客里写了不少 Hexo、Hugo 的折腾记录。现在站点换到 Astro,顺手把 Astro 6 里跟个人博客有关的东西捋了一遍。

这个博客以前写 Hexo 比较多。那时候关心的是主题怎么改、文章头怎么写、分页怎么配、图床怎么塞进去。现在迁到 Astro,感觉很多问题还是那些问题,只是工具换了一套说法。

我补 Astro 6 的资料时,第一感觉是它不像一个只给静态博客用的版本。Astro 6 在 2026 年 3 月 10 日发布,发布说明里最显眼的是新的 astro dev、Fonts API、Live Content Collections、CSP,还有实验性的 Rust compiler。听着挺多,但放到这个旧博客上,我会先挑几个真用得上的。

新的 dev server

Astro 6 把 dev server 和构建流程重做了一轮,底层接了 Vite 的 Environment API。官方的说法是开发环境可以更接近生产运行时,尤其是 Cloudflare Workers、Bun、Deno 这种非 Node 运行时。

这个博客现在主要还是静态生成,所以我没有一下子兴奋到要上 Workers。但这个方向我挺喜欢。以前用 Hexo 或 Hugo,很多问题是“本地看着还行,部署后再说”。静态站还好,动态一点的项目就很烦。Astro 6 这一步不是给页面加了什么花活,而是让本地开发少一点玄学。

如果以后把评论、搜索、统计这类东西挪到边缘运行时,Astro 6 这套 dev 变化就会更有用。现在先记着。

内容集合比随手读文件靠谱

迁移旧文章时,我最怕的是 frontmatter 不干净。以前的文章里 titledatetagscategories 写法不完全统一,有些还带旧主题留下来的字段。Astro 的 Content Collections 对我来说刚好卡住了这件事。

这个站现在用的是 src/content.config.ts,大概就是把文章当成一批同结构的数据:

const postsCollection = defineCollection({
  loader: glob({ pattern: '**/*.{md,mdx}', base: './src/content/posts' }),
  schema: z.object({
    title: z.string(),
    date: z.coerce.date(),
    excerpt: z.string(),
    path: z.string(),
    tags: z.array(z.string()).default([]),
  }),
});

这东西看起来比 Hexo 的 _posts 麻烦一点,但迁移旧站时很安心。字段少了,构建会吵;日期格式不对,构建也会吵。它吵归吵,至少不是发布上线后才发现某篇文章没进 RSS。

我现在的想法是,旧博客恢复类项目一定要先把 schema 写严一点。文章多的时候,靠眼睛看 frontmatter 迟早会漏。

Fonts API 对中文站别太贪

Astro 6 加了 Fonts API,可以通过 provider 去接 Google、Fontsource、本地字体之类的来源。它会帮你处理字体下载、缓存、preload 和 fallback。这个能力挺好,但中文博客要克制。

英文字体文件通常还能接受,中文字体一上来就可能大得离谱。这个站现在用的是本地的 Geist 字体,中文基本走系统字体。我觉得个人博客没必要为了“好看一点”塞一个很大的中文 webfont。博客最重要的还是打开快、正文顺眼。

真要用字体,我会按这个顺序来:

  1. 先用系统字体。
  2. 英文标题或代码字体可以考虑本地 woff2。
  3. 中文字体只做局部,不全站铺。

这不是 Astro 的限制,是中文网页自己的老问题。

Live Content Collections 暂时用不上

Live Content Collections 在 Astro 6 里变得更正式了。它适合那种数据经常变的内容,比如库存、价格、实时新闻、仪表盘数据。页面请求时再拿数据,而不是构建时固定下来。

这个博客不太需要。文章就是文章,写完以后大部分时间都不动。对这种站,build-time collection 反而更合适:稳定、快、好缓存。

我会把 Live Collections 记在脑子里,但不急着往博客里塞。工具有新功能,不代表每个站都要用一遍。

CSP 值得以后慢慢补

Astro 6 把 Content Security Policy 相关能力也推上来了。这个对纯博客来说没有那么显眼,但它属于以后会越来越有用的东西。

旧文章里有外链图片、iframe、历史脚本,直接开很严格的 CSP 很可能会炸。我的做法会保守一点:先把图片本地化、外链脚本减少,再考虑 CSP。安全配置不是写一行 default-src 'self' 就完事,尤其是旧站迁移,历史包袱多。

迁移时我会这样走

从 Hexo/Hugo 这类老博客搬到 Astro,我不建议一上来就追新功能。我现在会按这个顺序:

先让旧 URL 活下来,再让文章内容完整,再补 RSS、sitemap、canonical,最后才考虑字体、CSP、缓存这些优化。

Astro 6 给我的感觉是底子变厚了。对这个博客来说,它不需要把每个新能力都用上,但 Content Collections、稳定的 dev/build 流程、字体和安全配置这些东西,已经够我慢慢整理一阵了。

参考: