我的博客 goblog 是自己用 Go 写的,建站 5 年多了。
最近开了 Claude 的 20x 套餐——之前 5x 不够用,换成 20x 之后每周又总能剩下一些。于是周末就变着法儿想,剩下的算力还能用在哪儿。这不,许久没更新的博客正好可以拿来收拾一下 😆
在这之前,其实已经让它做过一次类似的优化:今年春天,博客从 MySQL 迁到了 GitHub 仓库存储——文章以 Markdown 放在一个叫 blog-data 的仓库里,不再需要数据库。那次也是 Claude 干的。
有了上次的经验,这次我索性把整个项目连同数据一起丢给它通读了一遍,本来想看看还能加点什么好玩的功能,结果先被泼了一盆冷水。
先说个让我哭笑不得的
我的 robots.txt 里写的一直是 Disallow: /——翻译过来就是:所有搜索引擎,请不要收录我的任何页面。
但一直没生效,因为这文件以前叫 robot.txt,少一个 s。爬虫请求 /robots.txt 拿到 404,等于这文件不存在,等于随便抓。
坏就坏在 5 月 7 日那次重构,我顺手把它改名成了标准的 robots.txt。同一个提交里,我还加了 sitemap、canonical 和 OG 标签。 于是从那天起,我一边认真做 SEO,一边正式通知全世界的搜索引擎:别来了。四个多月 😲
既然都发现了,索性把整个博客好好整了一遍。下面是这轮改动的点。
多端适配,顺便把 Bootstrap 和 jQuery 扔了
原来前端是 Bootstrap + jQuery,手机上勉强能看。这次整个去掉,换成 CSS 变量加原生 JS,主题跟随系统深浅色。
文章目录在宽屏是右侧粘性侧栏,窄屏收成底部抽屉。表格在手机上改成横向滚动,不再被压成一字一行。
阅读体验
版面顺了,读文章这件事本身也跟着打磨了一遍:
- 文末有上一篇 / 下一篇,还有相关文章(按共同标签每个 +3 分、同分类 +1 分排出来,最多 4 篇)
- 图片可以点开看大图
- 标题都带锚点,方便直接分享到某一节
- 读到一半关掉,下次打开接着上次的位置
- 超过两年的技术文章顶部挂个过期提醒,提醒里面的版本和结论可能过时了
搜索与发现
文章多了,找起来也得方便。加了个 ⌘K 呼出的即时搜索面板,在内存里建索引,边打字边出结果。另外有个「随便看看」随机跳一篇,以及几个键盘快捷键。
Markdown 改成服务端直出
前面这些都是看得见的,这块看不见,却最花时间。原来正文是在浏览器里用 editor.md(也就是 marked 0.3.3)渲染的,意味着首屏是白的、必须加载 jQuery 和整套 editor.md,而且爬虫看到的 HTML 里根本没有正文。
现在改成在 Go 里用 blackfriday 直接渲染好再吐出来。麻烦在于两个渲染器对写得松散的 Markdown 理解不一样——我这几年随手写的那些缩进不规范的嵌套列表、紧挨着列表项的代码块、中文里的 **强调**,两边结果能差出十万八千里。
最后是在 blackfriday 前面加了一层预处理,把这些写法按 marked 的语义先规整一遍。验证方法比较笨:同时跑服务端和客户端两个渲染实例,逐篇对比 44 篇文章的 DOM,一直调到完全一致为止。
含流程图、时序图、公式的文章会自动回退到浏览器渲染,那些是 editor.md 的独有扩展。
可以离线看了
正文直出之后,缓存下来的一份 HTML 就是完整的文章,离线阅读也就顺理成章了。于是加了 PWA,可以装到手机主屏和桌面。读过的文章会自动存下来,断网也能打开;没读过的地址会显示一个离线页,并列出本地已经缓存的文章。
策略是页面走网络优先(5 秒超时回落到缓存),带指纹的静态资源缓存优先。配置里 pwa: false 可以一键关掉,而且会让已经装在访客浏览器里的 Service Worker 自己注销掉,不会留尾巴。
后台
前台说完,说说后台。手机上终于能用了,列表、表单、编辑器都重新排过。
另外几个实用的:
- 草稿。没写完的文章存在服务器的
.drafts/里,不公开、不进内容仓库,可以在后台预览,发布时才正式创建标签。 - 编辑器本地备份。关页、登录过期、保存失败都能恢复,不丢稿。
- 标签可以改名、合并、删除了,以前只能看。改成另一个标签已有的名字就是合并,文章会自动换过去——我数据里那两个带前导空格的
blog、mysql就是这么清掉的。
SEO 和性能
再回到开头那个 robots.txt。除了把它改成只屏蔽 /admin/、/api/ 这些,还补上了 canonical、Open Graph / Twitter Card(自动取文内首图)、JSON-LD 结构化数据,sitemap 地址也自动带在 robots 里。
静态资源加了指纹,带指纹的缓存一年,其余缓存一天。
一些小玩意
最后是一些纯属好玩的东西。做了个 /stats 博客数据页,能看到写了多少字、各分类占比、时间进度这些。还有「那年今日」、文章点赞、一个终端风格的 404 页,以及几个彩蛋。
改动大概就是这些。前后跑了 11 个版本,从 1.1.0 到 1.10.0,现在在手机上读自己的文章终于是件舒服的事了,断网也能看,完美~
顺便说说 AI
这轮改动基本是我和 Claude 一起做的,感受挺复杂。
强的地方是穷举和耐心。robots.txt 那个问题,得把文件内容、改名历史、还有“同一个提交里顺手加了 SEO 标签”这三件事串起来才能看出名堂,我自己盯一百遍也不会往那儿想。服务端渲染那块更典型——为了让输出和 editor.md 对得上,它去模拟 marked 对松散 Markdown 的理解,然后逐篇对比 44 篇文章的 DOM,一直调到完全一致。这种活儿枯燥到人根本干不下去。
但翻车也不少。上线时它没料到我服务器上压根没装 Go,部署断在一半,站点样式花了好几分钟;给我写的部署脚本在 macOS 自带的 bash 3.2 上直接报错,因为它是按 bash 5 的行为写的;这篇文章的第一版整个写偏了方向,我说不对味儿才回炉重写。初稿里还有它自己记岔的细节,比如把文章过期提醒的阈值写成三年——代码里明明是它自己写的两年——这种硬伤还是靠事后逐条核对才揪出来的。
不过话说回来,这些翻车基本都是我提一句、它自己就改回来了。整个过程里真正需要我动手的地方非常少,我只需要管一个大的方向:做什么、做到什么程度、什么时候收手。
最后,一点憧憬和不安
就这次的体验来说,目前的 Claude Fable 5.1 已经足够支撑这种要求和标准都不那么严苛的项目开发了,人工介入的内容非常少,只需要管理一个大的方向。
再往后,算力持续提升,模型能力和硬件一起往上走,感觉「程序员」这个岗位会缩减得非常厉害——每家公司可能只需要若干个“懂产品”的架构师就差不多了。或许在看得见的几年里,就能有非常明显的变化。
三年多前我写过一篇《惊喜又焦虑,AI 技术的发展》,那时候担心的事,现在正在一件件变成现实。
说实话,我现在越来越希望科技发展得慢一点。这个变化对于我们这一代人来说,似乎还是太快了,充满了不确定性。
评论