The long and winding road That leads to your door Will never disappear I’ve seen that road before It always leads me here Lead me to your door
—— The Beatles, The Long and Winding Road
距离上一篇博文已经过去快八年了。中间工作越来越忙,blog 就一直荒着。这次终于下定决心把它捡回来,折腾了一整天,记录一下。
源码找回
先说一下现状有多惨:Hexo 的源码早就丢了,GitHub 仓库里只剩一堆构建后的 HTML。也就是说文章没死,但母版死了。好在文章内容都在构建产物里,于是写了个 Python 脚本把 46 篇文章的正文、分类、标签、日期从 HTML 里逆向提取出来,重新生成了 markdown 源码。过程像考古,好在 46 篇一篇不少。
过渡方案:Hugo
源码有了,先快速把站恢复上线。这次选了 Hugo,主题没有直接用现成的,而是照着 Free Mind 的风格自己写了一个——一直是我的审美偏好,干净、极简、不花哨。几个顺手做掉的小改进:
- 首页文章不再全文展示,加了 Read More 摘要
- 站名从 Nichome 换成了 Julio
- 首页摘要里的 LaTeX 公式终于能正常渲染了,之前截断处经常露出半截
$,很影响阅读
GitHub Actions 自动构建部署,现在 ulsonhu.cn 已经是一个正常的 Hugo 站了。
真正的目标:动态化
静态博客的问题是:想写点东西要先开编辑器、改 markdown、commit、push,等 CI 构建。对低频写作其实够用了,但我还想加评论、阅读统计这些东西,静态方案就得绕很多路。所以干脆做一次彻底的动态化改造,技术选型:
- Next.js + Payload CMS + PostgreSQL
- 所有文章存数据库,后台直接写
- 评论、阅读量、分类标签都是真实数据关系
今天先把技术验证原型跑通了。几个里程碑:46 篇旧文章全部导入数据库;Hexo 时代的旧文章地址做了 301 跳转,搜索引擎的收录不会丢;首页、文章页、归档、分类、标签、分页都按 Free Mind 的风格重新实现了一遍;后台写作界面也可以正常使用了。
八年了,AI 把前端变成了另一个行业
说实话,这次重构最让我感慨的不是技术细节,而是"怎么写代码"这件事本身已经天翻地覆了。
2018 年我写「网站迁移(hexo)」的时候,搭一个博客就是手工活:配主题、调 CSS、查文档、改配置,一个样式问题能磨半天。那时候"AI 写代码"还停留在玩具阶段,补全个变量名都算惊艳。
八年过去,这次重构我大部分时间不是在写代码,而是在描述需求和验收结果。从 HTML 逆向提取 46 篇文章的脚本、Hugo 主题的整套模板、Next.js 原型的 collections 定义和页面组件——大量代码是 AI 直接生成的,我只需要想清楚要什么、出了问题描述清楚现象、再验证结果对不对。一天之内,从源码找回、Hugo 上线到动态化原型跑通,放在八年前至少是几周的工作量。
这种冲击对前端行业尤其剧烈。曾经前端的护城河是"熟练":熟练地切页面、熟练地调兼容、熟练地配 webpack。而这些恰好是 AI 最先吃掉的部分。现在真正稀缺的变成了判断力——知道想要什么、知道什么叫好、知道哪里不对劲。手艺在贬值,品味在升值。
说不焦虑是假的,但更多的是兴奋。工具越强,一个人能做的事就越多。以前想给自己的 blog 加一个带评论系统的后端,光想想工程量就劝退了;现在一个晚上就能跑通原型。技术的民主化从来没有这么真实过。
踩坑记录
AI 再强,坑还是得自己踩。几个印象比较深的,留档:
- MathJax 的 CDN 直连不通,公式死活渲染不出来。排查半天发现是网络问题,最后直接把 MathJax 整个库本地化,一劳永逸。
- Next 16 不解码路由参数,中文分类名(如「数理统计」)拿到的 slug 是编码后的乱码,页面全 404,但英文的却正常。这种半死不活的 bug 最磨人。
- Node 24 的 CJS/ESM 兼容问题,Payload 的命令行工具直接跑不了,绕了路才解决。
有意思的是,这些坑的排查过程也都有 AI 参与——它负责假设和实验,我负责观察和拍板。像带了一个不眠不休的同事。
下一步
原型已经跑通了,后面还差几件事:评论的前端、文章上下篇导航、数据库从 SQLite 换成 PostgreSQL,以及最终的部署上线。慢慢来,反正已经重新写起来了。
Lying in the gutter, but looking at the stars.