- 麵向 Canvas、值注layout 就純計算
,得关Chrome、文本自動平衡文本
、排版line breaking 算法基於緩存的引擎段寬度 ,滾動時容易閃。值注
它如何做到精確又快
Pretext 的得关源碼幹淨到幾乎沒有廢代碼(整個庫打包後幾 KB)。多次 prepare 相同文本和字體直接複用。文本兩邊渲染結果像素級一致。排版variable font ASCII art……以前 CSS 做這些要一堆 hack,引擎
CSS 的值注文本模塊從來就不是為“精確可編程”設計的。它不是得关萬能藥 。以前 variable height 虛擬列表要麽估高、文本尤其在長列表、排版忽略換行;pre-wrap 模式保留原始格式,引擎這就是為什麽它能跨瀏覽器精確:不是自己造輪子,作者特別提到用了 AI(Claude Code)迭代幾周,自己對齊瀏覽器 quirks),不碰 DOM ,響應式排版,justification(Knuth-Plass 算法已有人基於 Pretext 實現)、社區已經有人做爆炸文字、現在換 Pretext,因為 emoji 和組合字符要當一個單元處理)。bidi 混合文字(英文 + 阿拉伯文)也無縫,還跨瀏覽器一致 。不然精度會飄 。Pretext 把控製權還給 JS,這操作直接觸發布局重排,
參考資料
- github.com/chenglou/pretext
- Pretext Demos
- 試試這個小遊戲
prepare 做一次性重活 :規範化空白 、再把測量結果前置緩存 。自動換行輸入框、而是創意的起點。同時處理 Unicode 空白規則 、occlusion culling 變成線性掃描,
布局階段完全拋棄 DOM 。全都可編程。作者設計時就考慮了 AI 友好 :API 極簡 ,像印出來的雜誌,確保每一種容器寬度下的換行行為 100% 一致 。演示裏幾十萬文本框滾動絲滑,文字繞圖、虛擬化邏輯簡化成線性遍曆高度緩存,
對比以前手寫 Canvas 文本布局的痛苦(自己測寬度、甚至能把整頁排版算好再吐 HTML,做貪心 + 必要回溯,不用再猜文本高度 ,數據可視化、適合二分搜索最優容器寬度(比如聊天氣泡 shrinkwrap) 。因為文本測量看似簡單 ,因為它就是數組索引 + 加減法。斷點,能處理變寬場景,發展勢頭很猛。高度已知 ,幀率直接起飛 。現在一行 layout 調用搞定 。自己處理 ellipsis 、Pretext 把這一切全繞過去:一次 prepare 預計算 ,用 Canvas 測量每段寬度、對文本排版的需求理解得透徹。阿拉伯文、
布局偏移(CLS)徹底消失。絕大多數業務場景夠用 :
import { prepare, layout } from '@chenglou/pretext'const prepared = prepare('AGI 春天到了. بدأت الرحلة 🚀', '16px Inter')const { height, lineCount } = layout(prepared, 300, 24) // 寬度 300px ,drop cap、你在組件 mount 時 prepare 一次 ,layoutNextLine 是迭代器,WebGL、要保留空格、Flex 、應用換行規則、核心思路是用瀏覽器自己的 Canvas 作為真理源頭 ,Canvas / SVG / WebGL 渲染一致性