简介
Pretext 是一个纯 JavaScript/TypeScript 开发的高性能文本测量与布局库。它解决了 Web 开发中一个长期存在的痛点:在不需要将文本实际插入 DOM 的情况下,精准计算多行文本的高度、行数和换行位置。
传统的 Web 文本布局依赖浏览器的布局引擎(Reflow),通过 getBoundingClientRect()或 offsetHeight获取尺寸,这不仅会触发昂贵的重排操作,还必须在 DOM 渲染后才能进行。Pretext 通过实现自己的文本测量逻辑,利用 Canvas 的 measureText作为“真相源”,将文本测量从“渲染后”提前到“渲染前”,实现了纯计算级的文本布局预测。这对于虚拟列表、Canvas 渲染、服务端渲染(SSR)和 AI 驱动的 UI 生成器至关重要。
主要功能
-
零 DOM 依赖的文本测量:核心功能是
prepare+layout。只需提供文本内容、字体样式和容器宽度,即可返回height和lineCount,全程不接触 DOM,不触发浏览器重排。 -
多语言与复杂文本支持:原生支持混合双向文本(Bidi,如阿拉伯语+英语)、emoji 表情、以及各种复杂脚本(如中文、日文、阿拉伯文),解决了 Canvas 原生换行对复杂语言支持差的问题。
-
多后端渲染支持:虽然核心是测量,但其输出的布局数据(行、位置)可直接用于 DOM、Canvas 2D、SVG 甚至未来的 WebGL 和 服务端(Node.js) 渲染。
-
高性能缓存机制:
prepare阶段会缓存文本段(Segment)的宽度测量结果。在频繁调用的场景(如窗口缩放、虚拟列表滚动)中,只需调用极快的layout函数进行算术计算,无需重复测量字符宽度。
安装与配置
环境要求
-
运行时:现代浏览器(支持 Canvas API)或 Node.js 环境(需配置 Canvas 环境)。
-
包管理器:支持 npm、yarn、pnpm、bun。
安装步骤
-
安装包:
npm install @chenglou/pretext -
导入使用(ES Module):
import { prepare, layout } from '@chenglou/pretext'; -
字体配置(关键):
Pretext 依赖 Canvas 测量,因此必须确保 CSS 中定义的字体与传入的
font字符串完全一致。例如,如果 CSS 中使用了font-family: Inter, sans-serif;,那么传给prepare的字体参数必须是'16px Inter, sans-serif',否则测量结果会不准确。
如何使用
Pretext 的使用遵循“预计算 + 布局”的两步模式,旨在将昂贵的操作(测量)与频繁的操作(布局)分离。
-
预计算(Prepare):在文本或样式不变时,提前调用
prepare函数。它会处理空白符规范化、文本分段(Segment)和字形测量,并返回一个不可变的PreparedText对象。 -
布局计算(Layout):当容器尺寸(
maxWidth)或行高(lineHeight)变化时(如窗口缩放),调用layout函数,传入预计算好的对象和新的参数。这是一个纯数学计算过程,速度极快(微秒级)。 -
高级布局:对于需要自定义渲染(如 Canvas 逐行绘制、环绕图片排版),可以使用
prepareWithSegments配合layoutWithLines或layoutNextLine,获取每一行文本的具体内容和位置坐标。
应用场景实例
场景一:虚拟列表(Virtual List)的“定海神针”
痛点:在渲染海量列表(如聊天记录、日志)时,为了计算滚动条高度和可视区域,需要知道每一项的高度。传统方案要么先渲染后测量(导致闪烁和性能卡顿),要么使用估计高度(导致滚动条跳动)。
Pretext 方案:在数据层,直接使用 Pretext 根据消息文本的长度和已知的 UI 宽度,计算出每一项的精确高度。虚拟列表管理器无需等待 DOM 渲染,即可构建出准确的滚动容器,实现丝滑的滚动体验。
场景二:Canvas 富文本编辑器与图表
痛点:在 Canvas 上绘制多行文本(如数据图表的标签、自定义文本编辑器)时,Canvas API 没有自动换行功能,开发者需要手动实现复杂的换行算法,且对多语言支持极差。
Pretext 方案:先用 Pretext 计算出所有文本行的位置(layoutWithLines),然后在 Canvas 上按行调用 fillText。开发者无需关心复杂的文本断行逻辑,Pretext 会处理好所有语言的字形组合(Grapheme Cluster)和换行规则。
场景三:AI 驱动的 UI 生成器(UI Composer)
痛点:在 AI 生成 UI 代码或设计稿时,AI 很难准确预测一段文本在特定容器内会占据多少空间,导致生成的布局经常出现文本溢出或留白过多。
Pretext 方案:在无头(Headless)环境中(如 Node.js + Canvas),AI 或代码生成器可以调用 Pretext 进行离线测量,确保生成的组件尺寸(如 Button 的宽度、Card 的高度)与文本内容完美匹配,从源头避免布局偏移(Layout Shift)。
GitHub 地址
-
开源协议:MIT License

492

被折叠的 条评论
为什么被折叠?



