Pretext是什么
Pretext 是前 React 核心成员 Cheng Lou 开源的,纯 JavaScript/TypeScript 的多行文本测量与布局库,用于纯算术方式精确测量多行文本尺寸,完全绕过 DOM 重排。Pretext 采用两阶段机制: prepare() 预处理文本(分词、Canvas 测量、缓存), layout() 纯数学计算布局。Pretext 支持全语言混排、RTL、emoji,500 段文本预处理 19ms、布局计算仅 0.09ms。工具适用虚拟滚动、聊天气泡、杂志排版及 AI 生成 UI 场景,让 AI 无需理解 CSS 可获得精确布局数据。
Pretext的主要功能
-
零 DOM 重排文本测量:绕过
getBoundingClientRect等触发重排的 API,通过纯数学计算获取文本高度和行数。 -
双阶段架构:
prepare()一次性预处理(分词+Canvas 测量+缓存),layout()纯算术计算布局,性能提升数百倍。 -
全语言支持 :支持中文、日文、阿拉伯语 RTL、emoji 混排、软连字符等复杂排版场景。
-
浏览器差异适配:识别 Safari 等浏览器的特殊渲染行为,真实渲染为”真值”反向拟合算法。
-
多场景布局 API :提供固定宽度换行、逐行路由(支持动态宽度)、收缩包裹(shrinkwrap)等高级功能。
-
跨端渲染支持:可输出至 DOM、Canvas、SVG,即将支持服务端渲染。
如何使用Pretext
- 安装引入:通过 npm 安装
@chenglou/pretext包,在项目中引入所需函数。 - 两阶段调用:用
prepare对文本进行一次性预处理(包含分词、Canvas 测量、结果缓存),再用layout进行纯算术布局计算,传入容器宽度和行高可获得文本高度与行数。 - 窗口自适应:容器宽度变化时(如窗口 resize),只需重新调用
layout,无需重复执行prepare,充分用缓存提升性能。 - 空白符保留:处理 textarea 类内容时,在
prepare中设置whiteSpace: 'pre-wrap'选项,可保留普通空格、制表符和换行符。 - 精细布局控制:改用
prepareWithSegments获取分段数据,配合layoutWithLines获取每行具体内容用于 Canvas/SVG 渲染,或使用layoutNextLine逐行处理,支持动态宽度场景如图文混排。 - 缓存管理:应用切换大量字体或文本变体时,调用
clearCache释放累积的内存缓存。
Pretext的关键信息和使用要求
- 核心定位:纯 JavaScript/TypeScript 文本测量库,绕过 DOM 重排,用纯算术方式计算多行文本高度和布局
- 性能指标:500 段文本批量预处理约 19ms,后续布局计算仅 0.09ms,比传统 DOM 测量快数百倍
- 语言支持:全语言混排(中文、日文、阿拉伯语 RTL、emoji)、双向文本、软连字符、浏览器差异适配
- 开发背景:前 React 核心成员 Cheng Lou 开发,借助 Claude Code 和 Codex 迭代数周完成
- 适用场景:虚拟滚动、聊天气泡、瀑布流/杂志排版、AI 生成 UI(提供纯函数接口,AI 无需理解 CSS)
- 环境要求:支持浏览器端(DOM/Canvas/SVG 渲染),即将支持服务端渲染
- 字体同步:传入的
font参数需与 CSSfont声明保持一致(字号、字重、样式) - 避免使用
system-ui:macOS 上字体可能导致测量不准确,建议使用具体字体名称
Pretext的核心优势
- 零 DOM 重排:完全绕过
getBoundingClientRect等触发重排的 API,布局计算不阻塞主线程,避免性能瓶颈。 - 极速性能:500 段文本预处理 19ms,后续布局仅 0.09ms,比传统 DOM 测量快数百倍,支持 120fps 滚动和实时调整。
- 纯算术计算:将文本布局转化为纯函数:输入内容、字体、宽度 → 输出高度和行位置,AI 可直接调用无需理解 CSS。
- 全语言兼容:支持中文、阿拉伯语 RTL、emoji 混排、双向文本、软连字符,自动适配浏览器差异(尤其 Safari)。
- 灵活输出:计算结果可渲染至 DOM、Canvas、SVG,支持虚拟滚动、聊天气泡、杂志排版、图文混排等复杂场景。
Pretext的项目地址
- GitHub仓库:https://github.com/chenglou/pretext
Pretext的应用场景
- 虚拟滚动/列表优化:工具提前精确知道每行文本高度,无需渲染即可计算滚动位置和可见区域,实现 120fps 流畅滚动。
- 聊天/消息应用:工具能动态计算多行消息气泡高度,”收缩包裹”布局(tight multiline bubbles),减少空白浪费。
- 瀑布流/杂志排版:卡片高度预测、多栏文本流、图文混排绕排障碍物,实现 Pinterest 式布局或复杂编辑页面。
- AI 流式输出:大模型逐字生成时实时计算文本高度,避免内容跳动和滚动位置错位。
© 版权声明
文章版权归作者所有,未经允许请勿转载。