当前位置: 首页 > news >正文

Pretext:前端文本布局的性能革命

点击上方 前端Q,关注公众号

回复加群,加入前端Q技术交流群

一个 15KB 的库,把 Web 文本布局从 50ms 干到 0.09ms,还不碰 DOM。

先说结论:Pretext 是什么

Pretext 是 2026 年 3 月底由 Cheng Lou(React Motion、ReScript 作者,现 Midjourney 工程师)发布的一个零依赖 TypeScript 库,只有 15KB。

它做的事情一句话说清:在不触碰 DOM 的前提下,完成多行文本的测量和布局,速度比传统方案快 300~500 倍。

发布 48 小时内 GitHub Star 突破 14000,X 上曝光超过 1900 万次。MIT 开源协议。


它到底解决了什么问题

Web 文本布局有个 30 年的老痛点:你想知道一段文字有多高,就必须把它塞进 DOM 里让浏览器算一遍。

传统做法是调用getBoundingClientRect()或读offsetHeight,但每次调用都可能触发布局回流(Layout Reflow)——浏览器不得不重新计算整棵渲染树的几何信息。

这件事有多贵?打个比方:一个居民开了下前门,整个城市得重新画一遍地图。

在现代前端场景里,这个问题尤其致命:

场景为什么痛
聊天消息列表每条消息高度不同,滚动时频繁测量导致卡顿
Masonry 瀑布流卡片高度靠文字决定,得先渲染再测量再定位,页面"跳"
AI 流式输出模型一边吐字一边要重排,测量在热路径上反复跑
多列编辑排版文字绕图、分栏、流式排版全靠 DOM reflow,帧率直接掉
虚拟滚动未渲染的元素高度只能靠猜,滚动条来回跳

Pretext 的核心洞察:把文本布局从 DOM 里搬出来。用 Canvas 的measureText()API 做字体度量的"地面真值",剩下的全靠纯数学计算。不碰 DOM 节点,不触发回流,不阻塞渲染线程。


核心原理:两阶段模型

Pretext 的设计非常优雅,就两步:

▎阶段一:prepare()—— 一次性预处理

typescript

const prepared = pretext.prepare(text, {
fontFamily: 'system-ui',
fontSize: 16,
// ...
});

这一步做的事情:

▸规范化空白字符

▸文本分段(word segmentation)

▸应用语言相关的粘连规则(比如中文标点不能开头)

▸通过 CanvasmeasureText()测量各段宽度

▸把结果缓存为一个不透明的数据结构

500 段文字大概 19ms,是一次性成本。

▎阶段二:layout()—— 纯数学的热路径

typescript

const height = pretext.layout(prepared, {
maxWidth: 320,
lineHeight: 1.5,
});

这一步完全不碰 DOM,只做加减乘除。500 段文字只要 0.09ms。

因为是纯数学,你可以在每一帧动画里重复调用,窗口拖拽、物理模拟、实时重排都不会掉帧。

▎进阶 API

API用途
layout()返回段落高度
layoutWithLines()返回每一行的详细对象
walkLineRanges()遍历行宽范围,用于紧凑气泡计算
layoutNextLine()逐行布局,支持每行不同宽度——这就是"文字绕障碍物"的关键

layoutNextLine()是最有意思的:你可以给每一行传不同的maxWidth,文字就会自动绕着圆形、图片或任何不规则形状排布。这在印刷排版里是常规操作,在 Web 上以前基本做不到。


性能到底快多少

直接看数据:

操作DOM 传统方案Pretext差距
500 段文字高度计算~50ms0.09ms~500x
单次 layout 调用触发 reflow纯算术无 reflow
120fps 下每帧余量8.3ms0.09ms绰绰有余

关键的不只是"快",而是快到改变了编程模型

▸以前:布局计算是异步的、昂贵的,你得小心翼翼地批量操作、节流防抖

▸现在:布局计算是同步的、可预测的,可以当一个普通函数随便调


使用场景

▎1. AI 聊天 / 流式输出界面

AI 逐 token 输出时,消息高度在不断变化。用 Pretext 可以在每个 token 到达时同步计算高度,做到流畅滚动和动画,不用等 DOM 渲染完再去量。

▎2. 紧凑聊天气泡

微信/Slack 那种气泡,传统做法是先渲染、测量、再调宽度。Pretext 的walkLineRanges()可以直接算出保持相同行数的最小宽度,消灭气泡右边的空白浪费。

▎3. Masonry 瀑布流

Pinterest 风格的瀑布流,每张卡片高度不同。以前得"隐形渲染→测量→定位"三步走,现在prepare()完直接预测高度,不用渲染就知道每张卡多高。

▎4. 文字绕障碍物排版

杂志级排版效果——文字自动绕着图片、拉引框、装饰元素流动。用layoutNextLine()逐行传入不同宽度即可实现,而且是实时的,拖动障碍物文字会立即重排。

▎5. 多列编辑排版

类似 Medium 或报纸的多栏布局,文字从一栏溢出自动流入下一栏,配合拉引语和分隔元素。全程 0 次 DOM 测量。

▎6. 虚拟滚动的高度预测

长列表虚拟化的老问题——未渲染项的高度只能猜。有了 Pretext,可以直接算出每一项文字内容的精确高度,滚动条终于不跳了。


语言和排版支持

Pretext 不是只能处理英文:

▸所有语言脚本(中文、日文、韩文、阿拉伯文等)

▸RTL(从右到左)文本

▸双向混排(同一行里有英文和阿拉伯文)

▸Emoji 和复合字素簇(不会在 emoji 中间断行)

white-space: normalpre-wrap模式

▸制表符和硬换行保留

渲染目标也不限于 DOM,支持 Canvas、SVG,服务端渲染在路线图中。


社区反响:发布一周内的疯狂 Demo

Pretext 发布后,社区的创造力直接爆发:

作者Demo亮点
@yiningkarlliKnuth-Plass 排版算法把高端印刷排版的段落对齐算法带到 Web
@Riyvir飞龙穿越文字龙在文字块中飞行,喷火时周围文字融化并被推开
@mhauken手机水平仪阅读手机倾斜时字母像物理对象一样滑落堆积
@TalsiachX Times AI 报纸用 Grok 分析内容,Pretext 实时排版头版
@KaygeeartworksThree.js 鱼群 + 文字鱼在文字间游动,文字实时物理响应
@LOliveirasousa阅读障碍辅助自定义字号和字间距优化器

Vercel CEO Guillermo Rauch、Remix 的 Ryan Florence 等前端大佬都公开点赞。


限制和注意事项

Pretext 不是万能的,使用前需要了解这些边界:

限制说明
不处理渲染Pretext 只负责"算",不负责"画"。算完之后你得自己把结果渲染到 DOM / Canvas / SVG
无障碍性需自行保障把布局从浏览器接管到用户态后,可访问性(Accessibility)不再由浏览器自动处理,需要开发者自己补 ARIA 属性等
CSS 行为覆盖有限目前支持white-space: normalpre-wrap,不覆盖所有 CSS text 属性的细微差异
需要专业认知这不是"写 CSS 就完事"了,你需要理解排版原理(字素、分词、BiDi 算法等)
浏览器字体度量差异不同浏览器的 CanvasmeasureText()可能存在微小差异,Pretext 通过大量语料校准来保证像素级准确
服务端渲染尚未支持SSR 在路线图中但还没发布
新项目,API 可能变动发布不到一周,还处于早期阶段

简单说:如果你的场景不涉及频繁的文本高度计算或动态排版,直接用浏览器原生能力就够了。Pretext 是给那些被 DOM reflow 卡住脖子的场景准备的。


快速上手

bash

npm install pretext

一个最简单的例子——算一段文字在 320px 宽容器里的高度:

typescript

import { prepare, layout } from 'pretext';

const prepared = prepare('这是一段需要计算高度的文字,可能很长很长...', {
fontFamily: 'system-ui',
fontSize: 16,
});

const height = layout(prepared, {
maxWidth: 320,
lineHeight: 24,
});

console.log(E6DB74">`文字高度: ${height}px`);

逐行布局、绕障碍物排版:

typescript

import { prepare, layoutNextLine } from 'pretext';

const prepared = prepare(longText, fontOptions);

let y = 0;
let line;
while ((line = layoutNextLine(prepared, {
maxWidth: getWidthAtY(y), // 每行根据 y 坐标动态算宽度
lineHeight: 24,
}))) {
renderLine(line, y);
y += 24;
}

更多 Demo 可以直接看官方演示页:chenglou.me/pretext


总结

维度说明
是什么15KB 零依赖 TypeScript 文本布局库
核心能力不碰 DOM 完成多行文本测量和布局
性能比 DOM 方案快 300~500 倍,可在 120fps 下每帧调用
作者Cheng Lou(React Motion / ReScript / Midjourney)
适合聊天界面、AI 流式输出、瀑布流、编辑排版、虚拟滚动、文字动画
不适合简单静态文本展示、不需要动态测量的场景
状态2026.3 发布,MIT 开源,23000+ Star,API 可能还会演进

Pretext 的意义不只是"快了 500 倍"。它真正改变的是:文本布局从浏览器的黑盒操作,变成了开发者可以自由调用的同步函数。30 年来 Web 文本排版第一次有机会追上印刷和原生应用的水平。


参考资料:

▸Pretext GitHub

▸Pretext 官方 Demo

▸Pretext: The Tiny Library That Makes Web Text Layout 500x Faster

▸Midjourney engineer debuts Pretext to revolutionize web design

往期推荐

Multi-Agent Teams:让多个专家 Agent 像团队一样协作

AI Agent 是怎么"想一步做一步"的?拆解 ReAct 模式

从零开始:用 LangChain.js 构建你的第一个 Tool-Calling Agent

最后

点个在看支持我吧

http://www.jsqmd.com/news/575755/

相关文章:

  • PADS Logic避坑指南:封装向导创建STM32原理图时90%人会犯的3个错误
  • Wan2.2-I2V-A14B效果展示:xFormers加速下流畅动态海鸥飞行视频作品
  • DeepSeek-OCR-2应用实战:快速提取发票信息,财务效率翻倍
  • Ubuntu 20.04 下 LVI-SAM 复现全记录:从 gtsam 版本踩坑到 OpenCV 头文件修改
  • 新手友好:通过快马平台和openclaw 101轻松入门机器人抓取
  • FaceFusion商业应用案例:电商模特图快速换脸实战解析
  • 013、部署篇:从本地开发到云原生(Docker/K8s)服务化部署
  • AudioSeal实际作品分享:5类AI生成音频(TTS/配音/合成)水印实测
  • Unity HUB国际版模块管理指南:彻底删除与重装Android SDK
  • export MPLBACKEND=Agg命令使用
  • 网盘文件直链解析工具实用指南
  • 别再死记硬背了!用‘海绵宝宝和派大星’帮你秒懂无线信道里的时延与带宽
  • 从ChatGLM到语音识别:实战Xinference多模态模型部署,让你的AI应用不再单一
  • Qwen3-ASR-1.7B镜像免配置:insbase-cuda124-pt250-dual-v7一键启动
  • 新手必看,用快马AI生成带详解的链表Python实现代码,轻松入门数据结构
  • 如何利用YimMenu彻底改变你的GTA5游戏体验:终极GTA5增强工具完全指南
  • Qwen3.5-9B企业级运维:supervisor异常自动恢复+磁盘日志轮转配置
  • AutoGLM-Phone-9B商业应用:快速搭建移动端多模态内容创作工具
  • 自建轻量级视频中心:H-Player V2从部署到精通
  • 攻克国标监控系统痛点:WVP-GB28181-Pro零代码构建企业级视频平台
  • IPATool:跨平台iOS应用资源获取的终极解决方案
  • SDXL-Turbo企业级部署:基于SpringBoot的微服务架构设计
  • Incapsula Reese84 JSVMP逆向避坑指南:从‘通杀’到‘精准适配’的思维转变
  • Meshroom终极指南:零基础学会开源3D重建,从照片到模型的完整方案
  • 实战应用案例:通过快马平台开发静电地板施工全流程现场管理助手
  • OpenClaw进阶实战(二):本地模型量化与加速——GGUF、vLLM、OpenVINO实战
  • 后端实战实战案例
  • 2025届毕业生推荐的十大降重复率方案推荐榜单
  • 实战导向:在快马平台用ai生成文件加密工具c语言代码实战
  • Nunchaku FLUX.1-dev部署案例:Kubernetes集群中模型服务化部署