Pretext: TypeScript库用于多行文本测量和排版

Mar 28, 2026     Author:emersonmacro     HN Points:60     HN Comments:3
Share this

摘要: Pretext 是一个纯 JavaScript/TypeScript 库,用于多行文本测量与布局,无需触发 DOM 的布局重排(如 getBoundingClientRect)。它通过浏览器字体引擎实现高精度测量,支持emoji、混合双向文本及各种浏览器特性。主要功能分为两类:1. 通过 prepare() 和 layout() 快速计算文本高度和行数,适用于虚拟滚动等场景;2. 提供手动分行的 API(如 layoutWithLines() 和 walkLineRanges()),支持动态调整宽度。核心优势包括:- 预测性文本测量(19ms)与即时布局(0.09ms)- 多语言支持(含未知的编码)- 跨渲染目标(DOM、Canvas、SVG、未来服务端)- 避免布局抖动与滚动位置偏移- 白空间保留(pre-wrap模式)- 缓存清理机制。使用时需注意:- 避免使用 system-ui 字体在 macOS 上保证精度- 白空间处理依赖 CSS 标准行为- 提供开发部署指南及历史背景(Sebastian Markbage 2010年启动原型)

讨论: 问题描述:浏览器原生文本搜索与长列表/网格虚拟化结合时,传统DOM布局测量方法(如getBoundingClientRect)会导致同步布局回流,性能开销大(每帧500文本块约30ms)。解决方案采用两阶段测量:1. 准备阶段(prepare)通过canvas测量文本段并缓存宽度,仅在需要时进行字体相关的DOM校准;2. 布局阶段(layout)通过纯数学计算确定行数和高度。性能优化显著,每处理文本仅需约0.0002ms。该方案通过GitHub链接展示具体实现。

原文标题:Pretext: TypeScript library for multiline text measurement and layout
原文链接:https://github.com/chenglou/pretext
讨论链接:https://news.ycombinator.com/item?id=47556290