临近年末,手上的活少了一点,断断续续又写了几篇博客的草稿,然而还是开坑多填坑少,一篇新的都没有发。
但!是!文章虽然没写完,博客还是可以更新的,我最近又改进了博客主题的一些地方,我觉得可以先水一篇文章,以避免去年一年只发布了一篇总结的尴尬。
距离上一次博客主题重写也才半年左右,之前提过,现在我的博客文章是在 AFFiNE 上写的,并且可以被我开发的 OctoBase 解析并读写,半年前 AFFiNE 发布了一个新版本,基于 SubDoc 来拆分文章,以实现对大体积 Workspace 的懒加载,但是 OctoBase 当时还没有支持,所以我依然在使用比较老的版本。SubDoc 在 Yjs 里实际上只是一个标识符,它会告诉你这个 CRDT 节点的内容需要从另外一个 Doc 里读取。这个我在博客更新后不久就支持上了,所以这次博客主题更新顺理成章地更新到了最新版本的 AFFiNE 后端。
除此之外,这半年里我还彻底铲掉了 OctoBase 之前依赖的 Yrs。Yrs 是一个 Rust 里的 Yjs 兼容实现, API 设计上完全照抄 Yjs,在内部实现上带上了对 CRDT 没有意义的事务实现,内部实现也完全不考虑多线程情况,而且随意 Panic,这导致之前 OctoBase 在实现时包含了大量的容错代码,在单线程环境运行会有额外的性能损耗。现在 OctoBase 换上了自己重写的 CRDT 底层之后,Worker 本体编译速度从一分多钟下降到 20-25 秒,运行在生产环境的 Worker 里做 300 多个 page 的全量 SSR 时长也从原来 2 分钟以上下降到 10 来秒,提升还是很明显的。
除了服务端的更新,我还做了一些前端的更新。之前我使用 Stitches 作为样式框架,主要考虑到他可以静态渲染样式,并且支持 styled 式的层叠样式写法。但是后来我发现这玩意不是完全的 Zero Runtime,而且几个月前宣布停止维护了,所以决定整个铲掉,现在把大部分样式都换成了 style9 生成 Atomic CSS,博客体积又缩小了大概 20kb,这其中至少有八九 kb 是 Stitches 的 Runtime 和相关依赖,剩下的是因为 Atomic CSS 节省的大小。
另一个更新是增加了评论区,现在评论区用的是 Artalk,一个支持 Self-Hosted 的开源方案,虽然评论区有很多商业方案都是个人免费的,而且评论这种东西其实不需要考虑隐私性之类的,但是我不喜欢引入一大坨外部 js,所以还是考虑开源方案了,之前自己折腾了一个基于 Worker 的评论区方案,但是后来发现想要管理还得先糊一个管理页面,要不然想删 Spam 还得直接操作数据库,很蛋疼。而 Artalk 这个自带管理界面,而且功能比较齐全,样式也不丑,目前就暂时先用着了,之后看看能不能给他们发 pr,把服务器编译成 wasm 弄到 cf worker 里跑好了。
现在的博客样式比之前好看了,但是感觉还是有点太素了,而且各种边角感觉有点杂乱,是时候学点设计了,争取下次更新主题把整个版面弄得好看点。