曾是React核心贡献者、现任Midjourney工程师的Cheng Lou开源了Pretext,这是一个完全用TypeScript实现的文字排版引擎,能够在完全不接触DOM的情况下,通过算术运算完成多行文字的测量与排版。根据Cheng Lou提供的基准测试,在需要反复计算文字高度的热路径场景中,Pretext的性能约为传统DOM测量方式的500倍,但该比较未包含一次性初始测量的成本,作者也承认并非完全对等。
Cheng Lou展示的Pretext示例包括能精准贴合文字宽度的聊天气泡、可实时重排的多栏杂志式布局、自动展开与收起的手风琴组件、可变字宽的ASCII艺术,以及纯Canvas绘制的多行文字。这些原本大多需依赖DOM测量实现的排版效果,现在可以通过算术方式完成,从而减少触发浏览器重排布局(reflow)。
传统网页浏览器测量文字尺寸的方式,是将文字渲染到DOM中,再通过getBoundingClientRect()或offsetHeight等API读取结果。这种机制在单次操作时影响不大,但当UI需要频繁且大量地测量文字高度,且DOM读写交错时,这类读取操作容易触发浏览器同步布局计算,甚至反复重算布局,形成性能瓶颈。
Pretext将文字排版分为两步。第一步的prepare()函数会先整理字符串,根据语言排版规则切分成多个段落片段,并通过Canvas的文字测量功能获取各片段的宽度,缓存为一个可复用的数据结构。第二步的layout()函数则完全不操作DOM,而是直接在内存中,根据容器宽度与行高,利用已缓存的宽度进行纯算术运算,推算文字将分为几行,以及整段文字的总高度。由于这一阶段无需再次测量文字,仅进行加总与比较,因此在容器宽度发生变化时,只需重新执行layout()即可快速重新计算高度。
在国际化支持方面,Pretext使用浏览器原生的Intl.Segmenter进行语言感知分段,可处理中日韩断行,以及阿拉伯语等从右至左文字与英文、数字混合排版,同时兼容不同平台的表情符号差异。Cheng Lou在GitHub提供了多语言测试语料,涵盖泰语、中文、韩语、日语与阿拉伯语等公共领域长篇文本,并通过与浏览器实际渲染结果逐一对比,验证其排版准确性。
Cheng Lou在X社区发帖提到,Pretext的开发大量使用了Claude Code与Codex。他将浏览器的实际渲染结果作为基准提供给AI,让AI在各种关键容器宽度下反复测量、比对、修正,整个迭代过程持续数周。Pretext以MIT许可证开源,文件体积仅数KB,可通过NPM安装使用,目前GitHub星标数已突破两万。