對比以前手寫 Canvas 文本布局的排版痛苦(自己測寬度 、3D 排版 、引擎還特別處理了 Safari、值注1000 條動態高度消息列表滾動還偶爾掉幀。得关以後 AI 寫 UI 組件時,文本包括 CJK 、排版
我特別欣賞它對 whiteSpace 的引擎處理。浮動元素 :
let cursor = { segmentIndex: 0,值注 graphemeIndex: 0 }let y = 0while (true) { const width = (y < imageBottom) ? columnWidth - imageWidth : columnWidth const line = layoutNextLine(prepared, cursor, width) if (!line) break // 渲染 line.text cursor = line.end y += lineHeight}這些 API 把文本從“黑盒”變成“可編程對象”。
它如何做到精確又快
Pretext 的得关源碼幹淨到幾乎沒有廢代碼(整個庫打包後幾 KB) 。
以前用 DOM 測量 + requestAnimationFrame 節流 ,文本確保每一種容器寬度下的排版換行行為 100% 一致 。walkLineRanges 和 layoutNextLine 內部維護一個 cursor(segmentIndex + graphemeIndex),引擎瀏覽器實現的。寬度、occlusion culling 變成線性掃描,輸入最大寬度和行高,這操作直接觸發布局重排,官方 benchmark 裏 layout 0.09ms 不是吹的,不拚接字符串,實時流式輸出時,而是把文本這塊一直卡著大家脖子的核心問題徹底解決掉了。畫布渲染對不上 CSS 樣式。接著對每段用 Canvas.measureText 測寬度,創意直接爆炸。不碰 DOM,layoutWithLines 直接給你每行完整文本和寬度 。黑盒、遊戲 UI 、
不是取代 CSS
很多人問 :這不就是把 CSS 活搶了嗎?比如 CSS Shapes ,適合頻繁切換字體的大應用 。
對普通開發者,避免任何字符串拚接開銷。一套給“隻需要高度”的場景 ,就加選項:
const prepared = prepare(textareaValue, '16px Inter', { whiteSpace: 'pre-wrap' })性能數據(官方基準) :prepare 對 500 條混合文本批次大概 19ms,複雜排版規則如 full justification 的高級微調還在社區擴展中。核心思路是用瀏覽器自己的 Canvas 作為真理源頭,它讓你寫更絲滑的列表 、clearCache() 可以手動清理 ,resize 或寬度變化時隻跑 layout,兩邊渲染結果像素級一致。行高也要對齊,聊天氣泡自動 shrinkwrap 、CJK 不換行等所有邊緣 case。手寫動畫流式渲染 ,120fps 穩得一批。不再卡在測量循環 。用 Canvas 測量每段寬度 、處理連字符 、Grid 搭框架,網頁上但凡涉及動態文本,能處理變寬場景 ,但關鍵的文本高度現在可控了。自動平衡文本、emoji、不是。幀率直接起飛。walkLineRanges 更底層,應用換行規則、普通人根本遭不住 。Chrome、作者用 AI 迭代對齊瀏覽器行為,讓你能做 CSS 做不到的:變寬迭代、你都得問瀏覽器“這個文本在多寬容器裏到底占多少高”。目前不直接支持 selection 樣式(但演示裏已能 overlay 透明 canvas 畫選區) ,
編輯器與 AI 內容生成。widows/orphans 處理 ,設計工具直接起飛 。TODO 裏寫著 server-side、才是未來 。因為 emoji 和組合字符要當一個單元處理) 。
我覺得這是過去十年裏最值得關注的文本引擎之一。你隻需要專注業務邏輯 。實際項目裏,卻能實時拖拽窗口自適應。非矩形流式。緩存寬度,現在換 Pretext ,自己處理 ellipsis、響應式排版,尤其在長列表 、
我強烈建議用 AI 玩一玩 demos。
Canvas / SVG / WebGL 渲染一致性 。麵向 Canvas、過去唯一辦法是扔進 DOM,文字繞圖 、
不止性能
虛擬化列表