在网页嵌入 [中文] 字体的最佳实践是?
系统肯定没得中文字体、
字体切割,按需加载单个汉字
github.com/KonghaYao/cn-font-split
www.ruanyifeng.com/blog/2014/07/chinese_fonts.html
一个字体 36M 。
我记得有个 js 可以收集当前网页里的中文字动态生成一个字体地址。
以前有个叫 字蛛(FontSpider) 的挺好用:从 HTML 中找到需要字后修改字体文件只保留用到的字。
现在找不到了。
补 #4
这里似乎有一份源码:
github.com/aui/font-spider/
意思是最佳实践是用系统字体?
ecomfe.github.io/blog/fontmin-getting-started/ 这个和上面的字蛛功能也差不多。但这种只适合固定内容,动态内容要么使用整个字体,或者使用云字体服务。
可以这样说。设计那边我都是建议不要在动态内容上使用特殊字体。
最佳实践是指什么场景?如果你需要适配各种安卓系统、Windows 、macOS 和 Linux 桌面,font-family 就写这些系统上都有的子集,优先考虑现代浏览器的话,最先写:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;
就是优先显示系统的 UI 字体
目前我们的做法是,前端项目在登录页 or 落地页之类的,用户第一次进入的页面,写一个脚本提取这些页面中包含的所有中文,提取出字体文件中的这部分中文,然后这些页面直接使用这种字体文件,一般这个文件体积很小,对加载几乎无影响,然后异步加载完整的字体文件,并且在加载完成后用 indexeddb 存一下,设置为字体 A ,非首次进入的页面使用的字体设置为 A 、B ,优先加载自定义字体 A ,若没有会降级到系统字体 B ,基本上可以保证绝大部分用户无感加载字体
提取文字的脚本在流水线中打包前运行即可,无需人工维护
github.com/ecomfe/fontmin
这个也可以
#10 大佬,不懂就问。那接口拉下来的文字怎么处理呢,这部分文字等完整字体拉下来之后,是不是依然会有字体闪的问题
之前收藏过一个链接,可以参考下捏《中文网络字体优化最佳实践》 chinese-font.netlify.app/zh-cn/post/performace_turbo/
中文字体太大了,一般就特殊用到的提取一下
这个东西有可能在 flutter web 中使用吗? flutter web 由于无法使用系统字体,中文字体加载过慢目前是一个硬伤。
来来来
github.com/syhyz1990/mactype
动态内容怎么搞?
这事很值得说道,楼上的方法我都有使用。因为最近在手搓一个博客主题,我在里面放了 4 款自定义字体,经过优化以后 pagespeed 依然满分。
简单说下中文字体的优化过程:
1 、下载字体文件转 ttf 格式
2 、用 Fontmin 提取 3500 常用汉字,或 7000 通用汉字。一般 3500 足矣。
3 、用 cn-font-split 进行字体切片,切成大量 woff2 子集,以应对动态变化的字体。官网子集只能切成 75kb 大小,本地运行可以自定义子集大小,我切成平均 25kb 大小。
4 、再把 UI 中的静态字符,例如“主页”“返回”等,单独提取一个 UI 子集出来,并列出对应的 unicode 。5 、在 head 中给 UI 子集设置一条 preload ,确保 UI 字体提前加载。大量切片不能预加载。
6 、引入 fontface 并设置好 unicode 范围,再设置下 fontfamily 就可以了。
另外,以上是静态字体的处理方式,如果是可变字体,处理方式又有点不一样。你这款字体应该是静态,够用了。
这是我的处理后的字体仓库,里面有 3500 常用汉字 github.com/radishzzz/astro-theme-retypeset/tree/master/public/font
一般首次进入的页面,不太会有完全不可控的动态文字内容,因为你要保证用户首次进入网站时的加载速度,尽可能保证内容静态,而等到用户进入读取网站内容时,基本字体文件都加载好了,以后优先从 indexeddb 读取字体文件即可,不用重复网络加载了
当然如果有那种媒体流网站确实会有这种问题,首次进入的页面内容就是动态的,这种就老老实实用系统字体吧,哈哈
再补充一下:
1 、动态字体用 fonttools 的 pyftsubset 工具提取子集,需要在 subset.txt 内填入想要的字符。
2 、引入 fontface 时要设置 display:swap
3 、fontfamily 里 UI 子集需要放在切片子集的前面,这样的话,在 UI 子集里命中的字符,就不会在切片子集里再次查找。
4 、fontfamily 需要选用系统字体作为后备,可以参考 tailwind 里 sans 或者 serif 的预设。
ssshooter.com/font-optimization/
做成 app ,集成字体
#14 刚刚点进这个网站,在其他页面点击左上角 icon 跳转首页一定会卡死,很奇怪
我的 python 版本是 3.11.1, 用 requests 或者 httpx 做 http 请求时经常遇到 ssl 错误,忽略证书验证就会提示一大串警告,或者就是直接超时…
最近看到几篇类似的讨论: www.hesudu.com/t/1005711 www.hesudu.com/t/1005903 正好我也面临类似的问题,合理讨论下,先说明下需…
用过 ultraedit ,notepad ,everedit ,editplus 这些,vscode 不够轻量,Sublime Text ,atom 都是很多年前出的了,现在…