文稿 / 技术折腾 / /posts/72940

破茧与重构:把博客搬进干净的晚风里

拆掉旧日冗余的脚手架,在 Astro 5 与边缘网络里重砌一间打开就能读字的小屋

HalfAir · 文摘卡片 2026-11-07 · 技术折腾
“不要温和地走进那个良夜。”
深秋夜里点开自己搭的旧博客,屏幕白了整整四秒钟。索性推倒重来,拆掉臃肿的脚本与跨洋阻塞,用 Astro 5 与 Cloudflare 边缘网络把屋子搬进干净的晚风里。

一、 白了四秒的屏幕:当旧屋子被挂件塞满

十月底的一个晚上,窗外的风刮过居民楼的防盗网,发出细碎又干燥的响声。我坐在书桌前,顺手点开自己一年前搭起来的旧博客,想翻找一段以前记下的软路由防火墙命令。

回车按下去之后,屏幕白了整整四秒钟。

先是顶部的加载条卡在百分之七十不动,紧接着几个早就记不清名字的第三方统计脚本在控制台里接连报出超时错误。好不容易等正文挤出来,侧边栏的挂件又慢半拍地往下撑开一截,直接把我正要看的那一行代码顶出了屏幕外面。

我盯着屏幕看了一会儿,忽然觉得挺没意思的。最开始在公网上搭这么个地方,本来只是因为记性不好,想找个牢靠的本子记点日常琐事和折腾硬件的笔记。结果后来每逛一次别人的技术站,就忍不住往自己屋里搬点东西——今天加个会飘雪花的画布,明天挂个实时在线人数牌,后天又塞进几百千字节的动画库。日子一长,这间屋子就像塞满了劣质塑料花的旧客厅,连推门走进去都要先绊一跤。

任何缺乏节制的系统,放任不管都会不可避免地走向失控。与其在一座地基已经松动的旧房子里继续糊墙纸,不如把旧钥匙收起来,干脆地推倒重来。

2024.10 · 初建 (Hexo Fluid / Butterfly)

博客首次上线 halfair.top,陆续接入评论区、访问统计与追番列表,但也埋下了前端脚本膨胀的隐患。

2024.11 - 2025.02 · 记录与沉淀

写完软路由单臂旁路由手记与三篇城市停摆脑洞推演,发现仓库里的未压缩截图开始拖慢跨洋访问速度。

2026.11 · 彻底推倒重来 (Astro 5 + Edge)

清空旧版主题包袱,手写三列持久化骨架、自建图床自动化管线与评论区自愈状态机。

二、 纸张与暗房:把版面还给字句

重砌这间屋子的第一步,是把那些花花绿绿的发光描边和厚重卡片全部铲掉。

长期对着屏幕看长文的人都知道,纯白底色(#FFFFFF)看久了像盯着灯管,纯黑底色(#000000)又会让白色的字边缘泛起刺眼的光晕。我把全站的底色重新调了一遍:浅色模式下用略带温度的暖纸白(#F9FAFB),像刚翻开的哑光铜版纸;深色模式下则退到深石板黑(#0E0F12),只保留一像素极细的半透明分割线。

针对现在普遍使用的宽屏显示器,版面固定为互不干扰的三列结构:左边放着头像、手写签名和主题开关;中间留出最宽裕的阅读区,正文行高放宽到 1.85,让长段落之间有自然的空气感;右边平时摆着安静待命的音乐盒和今日状态贴纸,一旦点进具体文章,黄金视线位置就自动切换成章节目录。

在全站任意地方按下 ⌘ +K 可以直接调出本地离线搜索框;读长文时嫌两边碍眼,按一下 键盘上的单键 Z 就能收起左右两栏进入专注阅读模式 。没有多余的弹窗,也不用去翻找藏在角落里的菜单。

Typography is what language looks like. 排版的本分不是跳出来提醒读者‘快看我多精致’,而是让眼睛顺着字句滑下去的时候,连一丁点磕绊都感觉不到。
— Ellen Lupton · Thinking with Type

三、 光速约束与边缘分流:消除看不见的泥潭

界面收拾干净之后,还得解决物理层面上的硬骨头。

太平洋底下的光缆长度是固定的,电磁波在光纤里的折射率也是固定的。把静态页面直接丢在海外默认节点上,一到晚上八九点钟的骨干网高峰期,TCP 握手和丢包重传就能吃掉好几秒。加上以前偷懒,写文章时截的 PNG 原图动辄一两兆,直接塞进代码仓库里,每次打开页面都像在泥潭里拽绳子。

这次我从底层做了两件事。第一件是彻底换掉前端引擎,改用默认零客户端 JavaScript 输出的 Astro 5。除了右侧必须驻留的音乐盒、搜索框和评论区,整篇文章编译完就是纯正的 HTML 和 CSS,配合 <ClientRouter /> 的持久化属性(transition:persist),翻页时只替换中间的正文节点,左右两栏纹丝不动。

第二件是把网络链路和图片资产拆开治理。域名接入 Cloudflare for SaaS 自定义主机名,将境内三网解析定向到优选的高速边缘节点池;同时写了一套本地上传脚本(scripts/upload-images.js),文章写完跑一行命令,本地图片就会先用 sharp 压成几十千字节的 WebP,计算 SHA-256 指纹去重后自动推上自建的图床(img.halfair.top),最后把 Markdown 里的本地路径替换成永久 CDN 链接。

境内电信、联通、移动解析指向自定义优选 CNAME 池,绕开晚高峰拥堵的默认国际出口,把首字节响应压进百毫秒内。

dns-split-routing.zone
ini
; HalfAir.top 权威 DNS 智能分线路解析规则
; 境外默认走 Cloudflare Pages 原生 Anycast
@ IN CNAME halfair-blog.pages.dev. ; [海外默认]
; 境内三网走 Cloudflare for SaaS 优选高速 CNAME
@ IN CNAME cf-vip.halfair.top. ; [中国电信 / 联通 / 移动]
img IN CNAME imgbed-edge.halfair.top.
twikoo IN CNAME twikoo-edge.halfair.top.

四、 驯服异步竞态:音乐盒与评论区的闭环

在静态站点里混用无刷新路由,最容易撞上幽灵一样的异步 Bug。

旧版博客里最让我头疼的有两个地方:一个是每次点开新文章,背景音乐就会咔哒一声断掉重头放,甚至有时候半夜刚打开网页,音响里突然蹦出一声动静把人吓一跳;另一个是底部的 Twikoo 评论区,如果在两篇文章之间快速切换,Vue 2 实例很容易因为挂载节点被提前替换而卡死成一片白板。

这次重构把这两个模块彻底拆开重写了。右侧的音乐盒取消了一切进站自动播放和全局点击唤醒的投机逻辑——页面打开时它只是安静地在后台拉取曲目元数据和歌词,除非你主动伸手点下播放键,否则它绝不发出一丁点声音。一旦开始播放,切去任何页面都不会中断当前的音频流。

而评论区则做成了一套带看门狗的状态机(TwikooSafeMount.astro)。每次翻页生成唯一的代际序号(tcomment-gen-N),挂载后用 MutationObserver 检查真实的表单输入框有没有渲染出来;一旦发现只生成了空壳或者网络超时,立刻按指数退避策略切换备用 CDN 重试,绝不留一块空白在页面底下。

TwikooSafeMount.astro (Watchdog Core)
typescript
const gen = ++engine.generation;
const mountAnchorId = `tcomment-gen-${gen}`;
host.innerHTML = `<div id="${mountAnchorId}"></div>`;
await window.twikoo?.init({ envId, el: `#${mountAnchorId}`, path: targetPath });
// 看门狗守卫:验证真实 .tk-submit 表单渲染,杜绝空壳假阳性
const verified = await verifyRealDomRendered(host, gen, engine);
if (!verified) throw new Error('Watchdog detected empty shell');
TABLE 01 // 核心交互模块重构前后工程对比
模块名称旧版顽疾与体验断层重构后的确定性方案
右侧音乐盒 进站突兀抢播、切页断流重头缓冲 纯手动显式触发 + 后台静默预载元数据 + 跨路由实例常驻
追番与外设单 依赖外部实时接口易超时、实拍图杂乱 本地离线快照 + 1px 工业线框蓝图与高清透明底双轨展示
图床资产流 仓库堆积数兆 PNG 拖慢拉取与构建 sharp 自动转码 WebP + SHA-256 指纹去重 + CDN 链接自动回写
评论区引擎 路由快切导致 DOM 竞态假死白屏 代际锚点隔离 + MutationObserver 真实节点看门狗 + 多源重连

五、 吹进窗户的晚风

把最后一行样式表保存好的时候,时间已经过了凌晨一点。

我关掉编辑器里密密麻麻的终端窗口,在浏览器里输入自己的域名。页面几乎在按下回车的同一瞬间就亮了起来,没有乱跳的进度条,也没有刺眼的报错红字。纸白色的背景干干净净,手写签名的墨迹安安静静地待在左上角。

在这个打开手机就被十几秒短视频和算法信息流推着走的时代,花好几个夜晚去抠一像素的边框粗细、调几百毫秒的响应延迟,仔细想想确实是件挺笨的事。在社交平台上写东西,人很容易不知不觉顺着点赞数去改自己的口气;但在这座完全由自己管着源代码的小屋里,不用凑任何人的热闹,也不用讨好任何一套推荐算法。

窗户推开了一条缝,十一月夜里的凉风带着楼下树叶的味道吹进来,桌上的纸页轻轻动了一下。屋子已经收拾利索了,灯也亮着,接下来只管安安心心地写字就好。

参考资料与延伸阅读 · References 共 3 篇
  1. [01]

    全站三列持久化骨架与无刷新客户端路由生命周期规范

  2. [02]

    跨网分线路 CNAME 优选与边缘静态回源技术文档

  3. [03]

    自建无服务器图床与 API 自动化上传管线

读后表态 · Reactions 读完觉得怎么样?顺手点张贴纸留个脚印吧

评论与留言

STANDBY...
SELF-HEALING v2
正在准备评论区运行环境...

全局全文搜索与快捷命令面板

快捷指令 PAGEFIND · STANDBY