我为什么重做这个博客
旧站用了四年,五十多个插件,一秒八次重渲染。这次推倒重来,我想清楚了三件事:内容优先、性能是设计、好看不等于可用。
上一个博客是 2021 年搭的。Hugo 主题市场上挑了个看着最唬人的,侧边栏、悬浮球、彩色标签云、评论框、阅读进度条,全齐。那时候我觉得"齐"就是好。
四年之后我打开它自己的首页,用手机,4G 环境,白屏了四秒。
起因是一件很小的事
上个月一个朋友问我某个 Three.js 的问题,我说"我博客里写过",把链接发过去。他回了三个字:"打不开。"
不是挂了。是打开之后先滚了半天动画,正文在第三屏,字体还要再等一轮。他在地铁上,直接退出去了。
我那一刻意识到,这个站已经不是博客了。它是一个演示动画,只是恰好里面塞了点字。
三个决定
第一,内容必须在 HTML 里。 不是靠 JS 渲染出来的,不是靠 IntersectionObserver 淡入的。爬虫看到的和用户看到的是同一份东西。3D 是装饰,不是内容载体;壳挂了,字还得在。这条决定了整个架构:首屏 3D 场景是懒加载的独立 chunk,<noscript> 里也能读到完整的自我介绍。
第二,性能是设计约束,不是优化项。 上一版的做法是先做效果,最后拿 Lighthouse 打分,掉分了再砍。这次反过来:先定预算——首屏 JS 不含 3D 不超过 400KB gzip,移动端 LCP 2.5 秒内,3D 场景首访不超过 3MB——然后在这条线里面设计。凡是要突破预算的效果,必须有降级方案,写进代码,不是写在文档里。
第三,暗色不代表粗糙。 暗色页面最容易做成一片黑底白字,看两屏眼睛就累。真正好看的暗色靠的是微差明度分层:背景 #0b0b0c,卡片面 #141416,分隔线 #26262a。层级靠这几档灰度拉开,不靠加边框。
关于那个 3D 首屏
有人会问,既然是博客,为什么要搞 3D。
因为我想搞。这是个人站,不需要对任何人解释 ROI。
但我给它划了线:它不能挡住阅读,不能拖慢首屏,手机过热要能自动降级。它可以很酷,但它的失败必须是优雅的——用户不该知道它在后台悄悄关掉了后处理。
这次不做什么
不做评论系统,想看讨论去社交平台。不做阅读统计,我不靠这个吃饭。不做十二种主题切换,一套暗色打磨到底,浅色用系统偏好兜一下就够了。
做减法比做加法难,因为减法没有截图可以发。
先把字写清楚,再谈别的。