He just crawled through hell to fix the browser…

Fireship Youtube

上周看到 Cheng Lou 发布 Pretext 的时候,我第一反应是:这哥们又在折腾什么。前 React Core 成员,ReasonML 的布道者,现在在 Midjourney 写代码,这次说自己"crawled through depths of hell"就为了搞定文本测量。听起来像是那种工程师深夜emo发的朋友圈,但看完 demo 我意识到,这事儿没那么简单。

文本测量这个问题有多恶心,做过精细 UI 的人都懂。你想在渲染前知道一段文字到底占多大空间,浏览器给你的答案永远是"差不多吧"。Canvas measureText?只能测单行,遇到换行直接瞎。DOM getBoundingClientRect?得先把元素塞进页面,测完再删掉,性能灾难。更别提不同字体、不同 weight、不同 line-height 的组合,每一个变量都能让你的计算偏差几个像素。几个像素听起来不多,但对设计工具来说就是专业和业余的分水岭。

Pretext 的野心是把这事儿彻底解决。它直接去啃字体文件的二进制数据,自己算字形、算 kerning、算 line breaking,不依赖浏览器的任何渲染引擎。这意味着你可以在 Node.js 里、在 worker 里、在任何 JavaScript 能跑的地方,拿到像素级精确的文本尺寸。而且快,Cheng Lou 说比现有方案快几个数量级。

这东西谁最该关注?第一是设计工具的开发者。Figma、Canva 这类产品,文本排版的精度直接影响用户体验,现在的方案要么牺牲性能,要么牺牲精度。Pretext 给了第三条路。第二是做复杂 dashboard 或者数据可视化的团队,那些需要动态计算文本布局、又不想每次都触发 reflow 的场景,这库能省掉无数 hack。第三是 SSR 和 edge rendering 的场景,服务端没有 DOM,以前你根本没法准确预测文本尺寸,现在可以了。

但这事儿的难度不在于"想到要这么做",而在于实现的每一层都是深坑。字体文件格式本身就是个迷宫,OpenType、TrueType、WOFF,每种都有自己的怪癖。Unicode 的复杂度更是无底洞,ligature、emoji、从右到左的文字、combining characters,每一个 edge case 都能让你重写半个库。Cheng Lou 说他"crawled through hell",我信,因为这活儿就是那种"不做不知道,做了想骂人"的类型。

有意思的是,这种基础设施级别的工具,往往不是大厂出品。Google、Meta 有能力做,但他们的工程师更可能去优化自家产品的特定场景,而不是花几个月啃一个通用问题。反而是像 Cheng Lou 这种有点执念、又有足够技术深度的个人开发者,才会去填这种"所有人都需要但没人愿意碰"的坑。

如果你的产品里有大量动态文本布局,或者你正在做设计工具,Pretext 值得花半小时试试。如果你只是做普通 web app,现在的浏览器 API 够用了,别给自己加依赖。但无论如何,这个库的存在本身就在问一个问题:还有多少我们习以为常的"浏览器应该做但做得很烂"的事情,值得有人重新做一遍?