在今年的二月九日,我把 PureRead 的 1.0.0 版本传上了 GitHub。一个换网页字体的浏览器扩展,也是我第一次正经写插件。
为什么想写这么个东西?
七月份之前我还在用 Windows,一台 19 年的拯救者。微软雅黑实在不合我的审美,系统里是这样,网页里更明显,看久了眼睛和心情都不太好。我反而更喜欢苹方、汇文明朝、尚古黑体这一类的字。
Chrome 本身是有字体设置的,在决定写插件之前,我一直靠它凑合。但它解决不了全部问题:临时想换一套方案,得打开设置;想看看某个字体在具体网页里的样子,还是得打开设置改,看完再改回来。麻烦,而且是重复的麻烦。
也试过几款换字体的扩展,界面和机制都不太对味。在这个 AI 盛行的时代,写个小插件已经算不上什么门槛,我干脆自己写一个。
1.0.0 那一版,我把功能设计得很复杂。除了字体替换,还塞了一堆阅读体验相关的东西:行间距、字号缩放、字重补偿、阅读进度条、专注模式、智能暗色模式、阅读时间估算、快捷键、CSS 选择器。甚至还想过提取正文、单独生成一个干净的阅读页面,后来因为一些原因放弃了。
接下来的几个版本基本都在打补丁:1.0.1 换了图标,1.0.2 加上更新检测,1.0.3 和 1.0.4 修 bug、补上漏打包的文件。
改动最大的一次是 1.0.5。我把选择器系统推倒重写了一遍,分成标准、等宽、数学公式三类,外加一个排除列表,还顺手补了数据迁移,老配置不用重新填。
虽然 1.0.5 还是有瑕疵,但我的阅读体验确实好了不少。到这里其实已经可以归档了——结果最近仓库里多了一个 star,又把我的目光拉了回来。
我想让它更专注一点。
于是有了 v1.1.0。是的,没错,直接从 1.0.5 跳到了 1.1.0。阅读进度条、专注模式、智能暗色、阅读时间、排版微调、快捷键,全部移除,只留下核心的字体更换功能。
减法的同时也在做加法:中英双语界面、字体用自身的字形预览、长列表虚拟滚动、拾取器支持四类目标、方案库、站点管理,存储和备份的界面也一并重做,图标、文档、打包脚本也都更新了。
最让我满意的是排除机制的重写。旧版是先把字体铺满全站,再把不该动的元素改回去;新版直接在选择器层面用 :not() 把它们摘出去。图标字体不会变成豆腐块,代码块不会被换成比例字体,播放器控件也不会错位。代码少写了一堆,效果反而更稳。
1.1.0 用了几天,我还是发现了瑕疵。你知道的,我这个人比较追求完美。
问题都出在边界上。iframe 里的内容换不掉,Shadow DOM 里的也换不掉,还有些页面是在脚本注入之后才慢慢加载出来的,一样落空。这些毛病平时遇不到,一旦遇上就很碍眼,像衬衫上冒出来的一根线头,不扯一下总觉得不舒服。
1.2.0 就是来收拾这些的。内容脚本现在会进入所有子框架,站点规则按顶层页面的域名解析,跨域的也认;开放的 shadow root 会被递归注入,嵌套组件不用再单独加匹配;CodeMirror、Monaco、Ace、xterm 这些编辑器统一走代码那一档字体,而且只改 font-family,不强行改行高,免得光标和对齐乱掉。
拾取器也学会了处理 ::part() 和嵌套 shadow root 里的链式选择器,排除项会把元素钉回页面原字体。界面字体换成了系统字体,远程字体请求也一并删了。
隐私这块进行了收紧。现在整个扩展只发一个请求,向 GitHub 读最新版本号;权限还是 storage、activeTab、fontSettings、alarms 四个,没有申请任何 host 权限。
现在我日常用下来,感觉相当不错。如果你也有换网页字体的需求,欢迎试试,在 Releases 下载最新的压缩包,解压后打开 chrome://extensions/,开启开发者模式,点「加载已解压的扩展程序」选中那个文件夹,就装好了。
有更好的建议,或者遇到了问题,也欢迎到 Issues 提。
评论