浏览器如何自定义默认字体(2):安装字体偏好扩展与管理设置
浏览器如何自定义默认字体 · 1 · 第 2 篇(当前) · 3 · 4
「网页字体偏好」扩展允许分别选择正文和代码字体,确认后同步到受支持网页,也可以按域名恢复原样或撤销上一次字体修改。字体来自本机目录,安装包不包含第三方字体。
可以下载安装包,解压后在 chrome://extensions 或 edge://extensions 开启开发者模式,加载含 manifest.json 的目录。安装或重载后先刷新已有网页,再从工具栏打开扩展选择字体。
安装与配置
m-chrome-extensions 中的 font-preferences-extension 使用 Chrome 的 fontSettings.getFontList()读取目录,保存返回的 fontId,展示 displayName。它只读取本机列表,不调用浏览器的全局字体设置写入接口。

点击工具栏的扩展图标即可完成设置。主面板展示正文、代码两个字体选择与小预览,点击字段进入带搜索和筛选的字体列表。悬停或用箭头浏览候选时只更新预览,点击候选或按 Enter 确认后,自动保存并同步到已打开的受支持网页;空选择表示跟随原站。
主面板只读取偏好和缓存名称,进入字体选择器才按需加载本机目录。目录缓存与偏好分开保存,内容脚本不接收整份字体列表。字体数量取决于本机安装情况,扩展没有内置这些字体。
正文默认筛选中文候选,代码默认筛选等宽候选,都可以取消筛选选择任意字体。显示名和实际家族名不同时一起展示,搜索也匹配两个名称;当前选择被筛选隐藏时仍会保留。
API 没有提供中文覆盖和等宽分类。中文检测把「中文永」放在两个不同的后备之前绘制,比较字形像素,避免把浏览器回退出的汉字算到被测字体上。汉字常有相同字宽,只比较宽度不能完成这项判断。没有可靠的比较条件时显示全部字体,由预览确认。代码筛选则依据一组拉丁字符的测量宽度给出候选。这些抽样能减少查找量,不能保证完整中文字库覆盖或所有字符等宽。
同一品牌的不同字重也未必放在同一个家族里。本机枚举出的 HYQiHei 25S 与 HYQiHei 55S 是两个独立选项,分别绘制为 HYQiHei-BES 和 HYQiHei-EES。检查当前安装文件时,两者都是静态字面,OS/2 字重字段均为 400,不能从产品名中的 25、55 推导 CSS 字重。扩展保留网页的 font-weight,不会自动把 25S 的粗体切换为 55S;真实样本在 400 和 700 下都保持选中的同一字面,加粗效果可能由浏览器合成。其他字体家族可以包含多个静态字面,也可以提供可变字重轴,需要按具体字体判断。

界面通过 prefers-color-scheme 跟随浏览器或操作系统的明暗偏好。浅色使用暖白表面与墨色文字,深色使用炭黑表面、浅灰文字和细分隔线,两套主题保持同一份布局。字体列表使用覆盖式滚动条,不为原生滚动条预留一列空白。


「撤销上次字体修改」恢复最近一次修改前的正文和代码选择,关闭再打开 Popup 后仍可使用;成功撤销后,这一步历史会被清空。它只撤销字体,不改变域名例外。所有网页都恢复原站时,可以将两个字体均设为「跟随网页」,或停用整个扩展后刷新网页。
默认全站开启,特殊域名恢复原样
主面板的「此域名使用自定义字体」默认开启。关闭后,当前页面及其内嵌 iframe 撤销扩展仍持有的样式与元素补丁,恢复网页自己的字体,并停止字体控制器的 DOM 观察。字体选择继续保留,其他域名不受影响;再次开启会重新应用,无需刷新。
例外以完整主机名匹配:www.example.com 与 login.example.com 分别设置,同一主机名的 HTTP、HTTPS 和不同端口共用开关。跨域 iframe 跟随顶层页面的域名,不按登录服务或 CDN 的域名单独决定开关。祖先来源被隐私策略遮蔽时,通过扩展消息向顶层确认,避免误用子框架自己的域名。

「例外域名」集中展示已关闭的主机名,点击「恢复替换」即可重新开启。字体与单域名变更共用后台提交队列,恢复字体的撤销操作不会把后来修改的域名开关一并回退。
仓库内构建命令是 pnpm --filter @m-chrome-extensions/font-preferences-extension build,加载目录为 apps/font-preferences-extension/dist。第三方字体没有随包分发;安装本机字体后刷新目录即可使用,也不会为了个人网页偏好修改系统菜单字体。
把学习结果固化进扩展
缓存也能作为下一次构建的内置数据。Popup 底部的「导出缓存」下载本机已学习的 JSON;导出前会尝试保存当前顶层页面待写入的方案,已有其他文档保存的条目也一起导出。文件会包含访问来源的 origin,分享或入库前应检查准备保留哪些站点。


两张截图来自独立 Chromium 的真实扩展文档,localhost 是受控测试来源。导出文件通过实际下载事件读取验证,字体选择没有变化。
在仓库根目录先预览,再显式写入并构建:
pnpm --filter @m-chrome-extensions/font-preferences-extension run bake:source-plans "./font-source-plans.json"
pnpm --filter @m-chrome-extensions/font-preferences-extension run bake:source-plans "./font-source-plans.json" --write
pnpm --filter @m-chrome-extensions/font-preferences-extension run build
写入目标是 src/shared/bundled-source-plans.json,一次替换整份内置表;脚本拒绝过期、重复或无效条目。重新加载构建后,内置方案与本机缓存通过相同校验,首次访问也可以命中。网站升级使摘要变化时仍会重新学习,所选字体继续取自用户偏好。
可以定期导出、审阅、重新构建,扩展本身不会自动上传访问来源或改写仓库。当前安装包的内置表为空,避免把临时测试来源带给读者;只有经过审阅的真实学习结果才适合随构建分发。
Popup 关闭后,保存由谁完成
Popup 点击外部就会关闭,Chrome 不允许让它在失焦后保持打开。因此,确认字体时立即向后台发送本次字段,保存逻辑不等到弹层退出,也不放在弹层里的延迟任务中。
后台串行读取和合并最新偏好,把字体选择与撤销记录一起保存。这样,正文和代码的连续写入不会互相覆盖,弹层关闭也不会取消后台已接收的请求。内容脚本继续通过存储变化同步网页。保存失败时,候选面板和已保存选择都会保留,用户可以重试。
每次实际字体变化会记录修改前、修改后的两个家族。撤销时先确认当前字体仍匹配上次提交,再恢复之前的字体字段,随后清空历史。记录留在扩展本地存储中,重新打开 Popup 后仍可撤销;如果字体被其他途径改写,过期历史不会强行覆盖当前选择。
总结
正文与代码偏好、域名开关和一次字体撤销记录分别保存。确认字体会立即提交后台,关闭 Popup 不会取消已经接收的保存;域名恢复也不会覆盖后来选择的字体。
本机目录与筛选只是选择入口,字体是否覆盖所需字符、不同字重怎样绘制,还要以页面实际资源为准。两个字体都跟随网页,或关闭某个域名后,控制器会撤销仍持有的修改并停止相应观察;需要完全停用扩展时,刷新网页让文档恢复原站资源。
上一篇:默认字体、system-ui 与字体回退。下一篇:在原位置转换字体声明。