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

推荐订阅源

Engineering at Meta
Engineering at Meta
T
Threat Research - Cisco Blogs
V
Vulnerabilities – Threatpost
T
Tor Project blog
T
Troy Hunt's Blog
C
CERT Recently Published Vulnerability Notes
C
Cisco Blogs
W
WeLiveSecurity
Cloudbric
Cloudbric
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
爱范儿
爱范儿
Google Online Security Blog
Google Online Security Blog
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Simon Willison's Weblog
Simon Willison's Weblog
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
Martin Fowler
Martin Fowler
Cisco Talos Blog
Cisco Talos Blog
F
Full Disclosure
MongoDB | Blog
MongoDB | Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
I
Intezer
www.infosecurity-magazine.com
www.infosecurity-magazine.com
G
GRAHAM CLULEY
B
Blog RSS Feed
云风的 BLOG
云风的 BLOG
人人都是产品经理
人人都是产品经理
M
MIT News - Artificial intelligence
腾讯CDC
L
LangChain Blog
L
LINUX DO - 热门话题
H
Help Net Security
S
Schneier on Security
N
Netflix TechBlog - Medium
博客园 - Franky
酷 壳 – CoolShell
酷 壳 – CoolShell
Spread Privacy
Spread Privacy
S
Secure Thoughts
T
The Exploit Database - CXSecurity.com
P
Privacy International News Feed
P
Privacy & Cybersecurity Law Blog
Cyberwarzone
Cyberwarzone
A
About on SuperTechFans
NISL@THU
NISL@THU
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
D
DataBreaches.Net
The GitHub Blog
The GitHub Blog
Recorded Future
Recorded Future
雷峰网
雷峰网
AWS News Blog
AWS News Blog
V2EX - 技术
V2EX - 技术

动物的光合作用

使用 Peer Relay 提高 Tailscale 的速度 内网穿透下 NAS 使用 DNS 轮循作为负载均衡 <众安车保>上当指南 - 动物的光合作用 JS 中的 Shebang/Hashbang - 动物的光合作用 我的自建 NAS - 动物的光合作用 React 组件中复用代码的方式 - 动物的光合作用 负载均衡下的前端资源更新策略 - 动物的光合作用 CSS 基于视区的长度单位 - 动物的光合作用 我用 Docker 部署的一些服务 - 动物的光合作用 CSS 书写模式和逻辑属性 - 动物的光合作用 大量活动页面持续性维护的解决方案 - 动物的光合作用 Mac mini 搭建外网可访问的简易 NAS - 动物的光合作用 React Fragment 添加事件监听? - 动物的光合作用 如何在 React 解决竞态条件 - 动物的光合作用 使用脚本备份 Github 仓库 - 动物的光合作用 高性能 React 应用的几个小技巧 - 动物的光合作用 复习 DOM 事件 - 动物的光合作用 我的博客架构变迁之路 - 动物的光合作用 浏览器和 JavaScript 的一些新特性 - 动物的光合作用 useCallback 的误区 - 动物的光合作用 在 React 中使用事件分离状态 - 动物的光合作用 如何处理 RESTFUL 数据异常导致的前端错误 - 动物的光合作用 基于 Node.js 的 WebFont 解决方案
Excalidraw 支持自定义字体 - 动物的光合作用
mebtte · 2023-07-24 · via 动物的光合作用

Excalidraw 是一款开源的画板工具, 可以用来绘制带有手写风格的图. 虽然 Excalidraw 本身支持多语言, 但是其手写风格的字体只支持英文, 其他语言会回退到普通字体.

非英语会回退到普通字体
非英语会回退到普通字体

因为 Excalidraw 是开源的, 为了能让其手写风格的字体支持中文, 当时的想法是 fork 之后用支持的中文的手写字体替换原来的, 然后部署在自己的域名下. 这个修改非常简单, 但是带来了几个问题:

  • 上游修改需要手动同步到自己的仓库, 自动化拉取无法解决冲突问题
  • 一些依赖网络的功能比如实时协作, 因为非官方 Excalidraw 的域名导致无法正常工作

偶然想起页面调试 API 用到过请求拦截工具, 如果拦截并改写手写字体的请求, 这样的话就可以实现支持任意字体, 不仅仅是中文手写字体.

我使用的工具是 Requestly, 登录账号的情况下可以多设备同步数据, 只要在一台设备编辑配置就能同步到其他设备.

Requestly
Requestly

首先我们先下载一份喜欢的字体, 需要浏览器支持的格式(ttf/otf/woff/…), 可以在 Can I use 查阅字体格式在相关浏览器的兼容性.

然后将字体上传到任意静态资源服务器取得可以访问的 URL, 例如 https://example.com/favorite.ttf. 如果没有相关的静态资源服务可以使用 GitHub, 将字体放入 git 仓库然后推送到 GitHub, 就能使用 GitHub 的静态资源服务, 以 Excalidraw 本身为例, Virgil 字体直接访问的链接是 https://github.com/excalidraw/excalidraw/raw/master/public/Virgil.woff2.

使用 GitHub 的静态资源服务
使用 GitHub 的静态资源服务

以 Chrome 为例, 在 DevTools 找到手写字体的请求, 通过预览可以判断手写字体的 URL 是 https://excalidraw.com/Virgil.woff2.

预览中的手写字体
预览中的手写字体

在 Requestly 新建 Redirect Request, 将 https://excalidraw.com/Virgil.woff2 重定向到你的字体链接, 保存后打开该规则的开关. 回到 Excalidraw 的页面, 刷新后应该就能看到你定义的字体.

字体重定向
字体重定向
修改字体后的 Excalidraw
修改字体后的 Excalidraw

刷新后字体如果没有生效, 有可能是缓存导致的, 因为 Excalidraw 使用 Service Worker 对资源进行了缓存, 使用 DevTools 删除缓存后重新刷新, 就能够正确显示重定向后的字体了.

清除缓存
清除缓存

本文最早发表于 https://github.com/mebtte/excalidraw

使用 Discussions 讨论 Github 上编辑 分享到 X