不止性能
虛擬化列表。值注不用再猜文本高度 ,得关另一套給“手動控製每一行”的文本高級玩法 。作者設計時就考慮了 AI 友好:API 極簡,排版而是引擎“模仿”瀏覽器引擎最準確的那部分 ,讀 getBoundingClientRect 或者 offsetHeight ,值注
我強烈建議用 AI 玩一玩 demos。得关演示裏的文本動態布局 demo,社區已經有人做爆炸文字 、排版
我特別欣賞它對 whiteSpace 的引擎處理。自動換行輸入框、值注它讓你寫更絲滑的得关列表 、
高級 API 更狠,文本CJK 不換行等所有邊緣 case 。排版還特別處理了 Safari 、引擎
Pretext 是一個用 TypeScript 實現的用於多行文本精確測量和布局的引擎。文字繞圖、Flex、
先看簡單那套 ,注意 font 參數必須和 CSS 裏 font 聲明完全一致(大小、以後 AI 寫 UI 組件時,我完全相信 。斷點 ,Pretext 把這一切全繞過去 :一次 prepare 預計算,又在 Midjourney 幹過視覺生成 ,高度已知,做貪心 + 必要回溯,算完立即返回 ,而是一次前端文本能力的重啟 。行高 24px
prepare 做一次性重活 :規範化空白 、layoutNextLine 是迭代器,不是 。希伯來文 、這條路以後會成為標配 。現在一行 layout 調用搞定。
參考資料
- github.com/chenglou/pretext
- Pretext Demos
- 試試這個小遊戲
prepare 階段先用 Intl.Segmenter 把文本按 grapheme 切分(不是簡單 char,它證明了:把瀏覽器字體引擎的真相前置緩存 + 純 JS 布局 ,布局偏移 、layoutWithLines 直接給你每行完整文本和寬度。全都可編程。目前不直接支持 selection 樣式(但演示裏已能 overlay 透明 canvas 畫選區) ,雜誌式多欄動態流式、
如果你的文本是 textarea 那種 ,Grid 搭框架,justification(Knuth-Plass 算法已有人基於 Pretext 實現)、還跨瀏覽器一致 。支持所有主流語言 ,直接調用 Pretext 驗證不溢出 。緩存結果,layout 就純計算,
響應式高級排版 。遊戲 UI、跨平台一致、要保留空格 、適合頻繁切換字體的大應用 。自動平衡文本、因為它就是數組索引 + 加減法。後麵 layout 全是純算術 ,但關鍵的文本高度現在可控了。更多語言支持 ,字重、讓智能界麵真正智能起來。像印出來的雜誌,精確 shrinkwrap 、畫布渲染對不上 CSS 樣式 。現在換 Pretext ,隻給寬度和光標位置,滾動時容易閃。walkLineRanges 更底層,Chrome 、這就是為什麽它能跨瀏覽器精確 :不是自己造輪子,瀏覽器實現的 。AI 生成內容實時流式輸出的時候,甚至能把整頁排版算好再吐 HTML,然後用純 JS 實現換行邏輯。普通人根本遭不住 。variable font ASCII art……以前 CSS 做這些要一堆 hack ,硬換行可見,line breaking 算法基於緩存的段寬度,
緩存機製是性能王牌。以前 CSS 隻能給你最終渲染結果,每次推進時隻算當前行能塞多少段 ,混合文字方向下的真實表現。對著瀏覽器真實渲染結果反複比對,避免任何字符串拚接開銷。演示裏幾十萬文本框滾動絲滑 ,因為文本測量看似簡單 ,毫秒級出結果,而是把文本這塊一直卡著大家脖子的核心問題徹底解決掉了 。傾斜閱讀、
結論
Pretext 不是一個庫,多次 prepare 相同文本和字體直接複用 。
它如何做到精確又快
Pretext 的源碼幹淨到幾乎沒有廢代碼(整個庫打包後幾 KB) 。就能幹掉 DOM reflow 這個老大難。3D 排版、妥協精度 ,
我覺得這是過去十年裏最值得關注的文本引擎之一。麵向 Canvas、黑盒 、接著對每段用 Canvas.measureText 測寬度 ,實際項目裏,
以前用 DOM 測量 + requestAnimationFrame 節流,行高也要對齊 ,以前 variable height 虛擬列表要麽估高、
對比以前手寫 Canvas 文本布局的痛苦(自己測寬度、它剛剛發布,應用換行規則 、ReasonML 、但作者開放態度明顯,性能直接雪崩 。hydration 零不匹配。複雜排版規則如 full justification 的高級微調還在社區擴展中 。確保每一種容器寬度下的換行行為 100% 一致 。你依然可以用 Tailwind 、包括 CJK 、手寫動畫流式渲染 ,緩存估算值 、Firefox 各自的換行 quirks 。Pretext 把控製權還給 JS,你都得問瀏覽器“這個文本在多寬容器裏到底占多少高”。輸入最大寬度和行高,響應式排版 ,
當然,預先把文本拆成最小可測量單元,emoji、
Canvas / SVG / WebGL 渲染一致性