我为什么要重做这个博客

  • 随笔
  • 博客
  • Astro

这是我这个博客的第一篇文章。写它之前,我先说清楚一件事:过去的博客被我放弃了,原因不是懒得写,而是那些文章不是我写的。

一、我想做什么

我的目标是 2027 年 2–4 月的春招,方向是大模型应用开发 / Agent 工程师。求职这件事,“说学过什么”没用,面试官要看的是线上能打开的站点、有 git 历史的代码、有数字的指标。

所以我需要一个载体,把接下来 19 周的学习过程记录下来。它要满足三个条件:

  1. 内容是真的 —— 每一篇都对应我真实动手做过的模块,写清数字和踩坑;
  2. 技术是可讲的 —— 站点本身就是一个工程项目,能在面试里被追问;
  3. 维护成本要低 —— 我用 Typora 写完 git push,就自动发布,不折腾。

二、实际发生了什么

我一开始想沿用以前用过的 Next.js + React 那一套。但设计文档里有一句话点醒了我:

这个项目是“内容站”,不是“应用”。

两者的正确选择不同。博客的本质是文档 + 少量交互,默认应该输出静态 HTML、零 JavaScript;而 Next.js 是应用优先,默认带运行时。用一个应用框架去做内容站,多出来的复杂度全是负担。

于是我把前端框架换成了 Astro,并做了三处“减法”:

  • 删掉所有组件库 —— 博客只有页头、列表、文章、搜索、对话五类界面;
  • 删掉 react-markdown 等 Markdown 插件 —— Astro 内置解析 + Shiki 高亮;
  • 暗色主题用几十行原生 CSS 变量实现,不引第三方主题库。

三、我是怎么解决的

站点结构按 Astro 的 Content Collections 组织:文章放在 src/content/posts/,用 zod schema 约束 frontmatter。字段写错、类型不对、周数越界,在构建阶段就会报错,不会等上线才发现。

// src/content.config.ts —— frontmatter 的类型约束
const posts = defineCollection({
  loader: glob({ pattern: '**/*.md', base: './src/content/posts' }),
  schema: z.object({
    title: z.string(),
    week: z.number().int().min(1).max(19), // 越界直接构建失败
    draft: z.boolean().default(false),
  }),
});

同样的思路,后面每加一个 AI 功能(检索、问答、评测),我都会先问一句:它是不是换了个载体重走了一遍课程内容? 如果是,就值得做;如果它要求我学课程之外的新技术,那就说明跑偏了。

四、结论与数字

这次重建的核心判断只有一条:内容站,就选内容优先的框架。

值得记录的数字是:

  • 前端直接依赖从“Next + React + 组件库 + 一堆 remark / rehype 插件”压缩到 7 个;
  • 文章页是预渲染的静态 HTML,首屏不加载框架运行时;
  • 新增一篇文章的成本 = 写一个 .md + git push。
# 写文章 → 提交 → 托管商自动构建发布
git add src/content/posts/ && git commit -m "post: 新文章" && git push

这篇文章本身也是一次验证:它不需要我碰任何大模型知识就能写出来。而接下来 18 周,这个站点会逐步长出检索、RAG 问答和评测 —— 到那时,它就既是我的学习记录,也是我最好的简历项目。

评论