1 分钟阅读
用 Astro 重建这个博客
为什么从零开始选了 Astro + Tailwind CSS:静态优先、内容集合、零 JS 默认——以及这套站点的整体架构。
Luqi Researcher & Engineer
这个博客第三次返工了。前两次分别用 Hexo 和 Next.js 搭的,这次换成了 Astro,记录一下选型思路。
为什么是 Astro
写博客的本质是「内容优先」,而大多数框架都在为「应用优先」设计。Astro 的默认姿态刚好反过来:
- 零 JS 默认:页面默认输出纯静态 HTML,交互按需注水(Islands);
- Content Collections:Markdown/MDX 内容带 schema 校验,frontmatter 写错直接构建报错;
- 构建快:同样的页面量,构建时间只有之前方案的零头。
import { defineCollection, z } from 'astro:content';
import { glob } from 'astro/loaders';
const blog = defineCollection({
loader: glob({ pattern: '**/*.{md,mdx}', base: './src/content/blog' }),
schema: z.object({
title: z.string(),
description: z.string(),
pubDate: z.coerce.date(),
tags: z.array(z.string()).default([]),
}),
});
export const collections = { blog };
有了 schema,标题缺失、日期格式错误这类问题会在 astro build 时直接失败,而不是渲染出一个残缺的页面。
站点架构
NOTE
本站结构:Astro 静态输出 + Vercel 托管,子站 /tianyuanFood 是一个独立的 React 项目,构建产物直接放进 public/ 目录。
文章排版相关的配置集中在 global.css 里手写:中文行高 1.85、代码块 Shiki 双主题、KaTeX 数学公式。刻意没上 typography 插件——中文排版的细节(字距、标点悬挂)还是自己控制更顺手。
一点感受
工具的意义是让表达更专注。当「写一篇随笔」的心智成本降到「新建一个 md 文件」时,写作这件事才真正可持续。
下一篇打算写写光子计算那边参数扫描自动化的经验。
评论
评论区尚未启用:基于 giscus(GitHub Discussions)。在
giscus.app
生成配置后填入 src/config.ts
的 GISCUS
字段即可开启访客评论。