从 Hugo 和 Next.js 回到 Astro 7:一次博客重构复盘

1509 字
8 分钟
从 Hugo 和 Next.js 回到 Astro 7:一次博客重构复盘

为什么又一次重构博客#

这个博客前后换过几套方案:最早用 Next.js 搭过完整的 React 应用,后来为了减少维护成本迁到 Hugo,到了 2026 年又重新回到 Astro。

这次回到 Astro,并不是因为 Hugo 不好,而是因为当前需求变得更具体了:

  • 文章数量和标签数量都很多,需要更稳定的内容组织和搜索
  • 希望保留静态站点的部署方式,不引入数据库和长期运行的后端
  • 需要在同一套站点里同时放文章、归档、标签、RSS、搜索和分享海报
  • 希望页面结构、组件和样式都能直接维护,而不是被主题配置限制

Astro 的静态输出正好适合这个场景。文章在构建时生成 HTML,浏览器只加载需要的脚本,部署仍然是一份纯静态文件。

从模板到可维护的博客#

一开始使用的是 Firefly 主题,功能很齐全,但也带来了大量模板配置。真正开始写作后,问题逐渐集中在三件事:

  1. 页面里有很多主题自带的功能和默认文案
  2. 框架版本已经落后,部分依赖出现了兼容问题
  3. 移动端功能太多,页面虽然有动画,但滚动和点击体验不够轻

这次没有继续堆功能,而是先把项目整理成一个可以长期写作的基础工程。

Astro 7 升级踩到的坑#

从 Astro 6 升到 Astro 7 后,最大的变化不是页面组件,而是 Markdown 处理流程。

这个博客依赖大量 remark 和 rehype 插件,包括数学公式、代码块、Mermaid、PlantUML、Callout、外链处理和标题锚点。Astro 7 默认使用新的 Markdown 处理器后,原来的插件配置需要迁移到 @astrojs/markdown-remark 的 unified() 中。

同时还需要处理:

  • TypeScript 6 对脚本上下文和模块声明的更严格检查
  • Astro 7 不再接受旧的实验性配置
  • 部分图标依赖在升级后需要改为内联 SVG
  • Astro 图标、Svelte、Tailwind 和 Expressive Code 的版本需要同步

这类升级最重要的不是“升到最新”,而是升级后文章内容仍然能正常渲染。构建检查通过之后,我又逐项检查了标题、代码块、数学公式、RSS 和搜索索引。

手机端性能优化#

这次重构最明显的变化来自移动端。

优化前,首页 Lighthouse 性能约 81,文章页约 74。页面本身不算特别重,但有几个问题叠在一起:

  • 侧栏一次性渲染了 960 个标签
  • 手机同时下载了桌面和手机两张背景图
  • 头像和 favicon 都是 253 KB 左右的大 PNG
  • 手机导航栏持续使用毛玻璃模糊
  • 页面入场动画和大量阴影增加了绘制负担

调整后,侧栏只显示常用的 60 个标签,完整标签放到独立页面;背景图改成按屏幕加载;头像和 favicon 换成响应式 WebP;手机端关闭了不必要的模糊和入场动画。

本地移动端测试结果约为:

  • 首页性能:81 → 94
  • 文章页性能:74 → 98
  • 首页下载量:约 1 MB → 337 KB
  • 文章页下载量:约 1.1 MB → 398 KB

性能优化不是把所有效果都删掉,而是把“桌面端效果”和“手机端必要效果”分开。

图片和小图标也要工程化#

以前的头像和 favicon 直接使用一张 512×512 的大图。浏览器在导航栏里只显示几十像素,却要下载完整的 PNG,这是很典型的资源浪费。

现在的做法是:

  • 头像由 Astro 生成多尺寸响应式图片
  • 博客背景图区分桌面横图和手机竖图
  • 手机背景提供多个宽度,让浏览器按 DPR 选择
  • favicon 使用圆形透明图标,并减少文件尺寸

图片优化看起来是小事,但对移动端首屏影响很大。

Swup 页面过渡留下的状态#

这次还定位了一个持续的导航问题:

手机端从首页进入归档后,再点击主页返回首页,页面结构回去了,但背景 Banner 仍然保持离开首页时的隐藏状态,需要刷新才能恢复。

原因是 Banner 容器没有参与 Swup 的内容替换,而离开首页时写入的内联 transform 和 opacity 一直保留着。修复方式是在页面内容替换完成后,如果当前已经回到首页,就主动清除旧的隐藏状态并恢复 Banner。

这个问题也说明,页面过渡库并不只是“加一个动画”。只要某些 DOM 被放在替换容器之外,就必须单独同步它的状态。

部署与最后的检查#

项目现在部署在 Vercel,使用 pnpm install --frozen-lockfile 安装依赖,构建时先跑 Astro 检查,再生成静态页面和 Pagefind 搜索索引。

最终验证包括:

  • Astro 和 TypeScript 检查无错误
  • Biome 格式检查通过
  • 309 个页面成功构建
  • Pagefind 索引 271 个页面
  • 站内链接检查没有发现坏链接
  • Vercel 自动部署完成,线上首页、文章页和标签页均可访问

总结#

这次重构的重点不是换一个框架,而是把博客从“能用的主题模板”整理成“可以持续写文章的基础设施”。

对个人博客来说,真正重要的不是功能最多,而是:

  • 写作流程足够简单
  • 页面在手机上足够稳定
  • 内容能被搜索和归档
  • 部署失败时能快速定位
  • 以后再升级时,结构不会牵一发而动全身

Astro 7 现在承担的是这个基础角色。接下来更重要的,是把时间重新放回内容本身。

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

从 Hugo 和 Next.js 回到 Astro 7:一次博客重构复盘
https://blog-astro-ddd.vercel.app/posts/astro7-blog-rebuild/
作者
Danny
发布于
2026-11-10
许可协议
CC BY-NC-SA 4.0
Danny avatar
Danny
记录技术、生活与日常观察。
公告
这里记录技术折腾、生活观察和各种日常体验,文章仅代表个人经验。
分类
标签
站点统计
文章
277
分类
5
标签
986
总字数
216,462
运行时长
0 天
最后活动
0 天前

目录