惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

P
Proofpoint News Feed
V
V2EX
WordPress大学
WordPress大学
Google DeepMind News
Google DeepMind News
Martin Fowler
Martin Fowler
小众软件
小众软件
Blog — PlanetScale
Blog — PlanetScale
月光博客
月光博客
The Cloudflare Blog
T
Tailwind CSS Blog
H
Help Net Security
腾讯CDC
爱范儿
爱范儿
人人都是产品经理
人人都是产品经理
H
Hackread – Cybersecurity News, Data Breaches, AI and More
The GitHub Blog
The GitHub Blog
Microsoft Security Blog
Microsoft Security Blog
Stack Overflow Blog
Stack Overflow Blog
D
DataBreaches.Net
C
Check Point Blog
量子位
酷 壳 – CoolShell
酷 壳 – CoolShell
美团技术团队
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com

东东's Blog

Memos: MacOS 下编译安装 Aseprite 脚本 日本关西系列|Day 2 京都的半日闲逛 美国Apple官网购买礼品卡订阅 ChatGPT Plus 北京・中关村森林公园(2026) 日本关西系列|Day 1 抵达临空城与大阪首日 Memos: 查询 Apple ID 注册时间 Memos: Ghostty 开箱即用配置 代码考古:用 gitcharts 挖掘 Git 仓库的演变轨迹 烹饪日记:香煎罗非鱼 Memos: 新时代程序员的顶级焦虑 Memos: 博客新增图文布局和轮播图效果支持 Memos: 最适合空气炸锅烤着吃的红薯品类 Memos: 记录「95分」好吃的‘小帅香菇面’ 妻子爷爷的‘朝鲜军功奖章’ Memos: 博客切换为 Shiki 代码高亮方案 Memos: 博客新增划线、重点及荧光笔效果支持 Memos: 邻座吃饭的一家三口 人在囧途之哈囧 哈尔滨・乡村的冬季 查看香烟生产日期 哈尔滨・东北虎林园 Memos: 来自日本的 ndjp 提供免费的三级子域名 Memos: 刚听说 autojump, 真的好用 Memos: 体验 OpenCode + Superpowers + GPT 5.2 开发需求 Memos: 杰我睿爆雷 GoReleaser 自动发布 Go 镜像到 DockerHub & GitHub Release 初识 Volta & Corepack 前端版本管理工具 部署 Beszel 把 “小鸡们” 归拢起来 Memos: Claude Code in Action 中文版教程 2025 年度回顾
记录博客字体分包与字体子集化
2026-03-05 · via 东东's Blog

本博客中文字体采用了一段时间的字体分包方案,又尝试调整为按需字体子集化的方案,整理记录如下。

字体分包

博客使用 Oppo Sans 4.0 字体:https://www.coloros.com/article/A00000074/

使用 cn-font-split 工具分包

$ pnpx cn-font-split --input "OPPO Sans 4.0.ttf" --outDir dist-font

生成内容如下

01.webp

其中

  • index.html 是预览调试一个一个 Demo 网页
  • index.proto 是 Protocol Buffers 接口定义文件
  • reporter.bin 记录字体拆分的详细信
  • result.css 是引入的拆分字体的入口定义样式文件

使用的话,将拆分后的众多 .woff2 字体文件放到 OPPOSans4(自定义)目录,添加到博客静态目录中,编辑 result.css 文件,注意批量编辑 URL 中的路径。

@font-face{font-family:"OPPO Sans 4.0";src:local("OPPO Sans 4.0"),url("./fonts/OPPOSans4/b8d45a4b1842853318f4cdd5ba6ef8a4.woff2")format("woff2");font-style:normal;font-display:swap;

例如我的字体放在 css 当前目录的 fonts/OPPOSans4 下,路径就是 ./fonts/OPPOSans4/b8d45a4b1842853318f4cdd5ba6ef8a4.woff2

02.webp

博客加载过程中,会按需加载,以 OPPO Sans 字体为例,默认命令参数下拆分为 400+ 个字体文件,每篇文章动态加载了 10-30 个字体文件,比较零散。

按需字体子集化

这是另一个思路,把博客使用到文字汇总,将字体精简,精简后的字体文件只包含用到的字体,也能大幅减少字体文件的体积。

brew install fonttools

收集

find content -name "*.md" -exec cat {} \; > all_text.txt

过滤

sed -e 's/```.*//g' \  
-e 's/`[^`]*`//g' \  
-e 's/!\[[^]]*\](\([^)]*\))//g' \  
-e 's/\[[^]]*\](\([^)]*\))/\1/g' \  
all_text.txt > clean_text.txt

生成

pyftsubset "OPPO Sans 4.0.ttf" \  
--text-file=clean_text.txt \  
--output-file=opposans-blog.woff2 \  
--flavor=woff2 \  
--layout-features='*' \  
--no-hinting \  
--desubroutinize

使用

@font-face {
    font-family: 'OPPO Sans 4.0';
    src: url('fonts/OppoSans-Blog.woff2') format('woff2');
    font-weight: 400;
    font-style: normal;
    font-display: swap;
}

:root {
    --font-sans: 'OPPO Sans 4.0', 'Source Sans Pro', 'Helvetica Neue', Arial, sans-serif;
    --font-mono: 'JetBrains Mono', 'Roboto Mono', Consolas, Monaco, 'Courier New', monospace;
    --font-ui: var(--font-sans);
}

就只需要加载一个精简后字体文件。

03.webp

字体子集化方案较麻烦的是需要定期执行脚本生成字体,好在未匹配到的字体会自动降级为系统字体,偶尔两个中文降级到系统字体显示并非不可接受。

P.S. 经过几次调整,OPPO Sans 中文字体 + JetBrains Mono 代码显示效果是我目前最喜欢的搭配!