Pretext是什麼
Pretext 是前 React 核心成員 Cheng Lou 開源的,純 JavaScript/TypeScript 的多行文本測量與佈局庫,用於純算術方式精確測量多行文本尺寸,完全繞過 DOM 重排。Pretext 採用兩階段機制: prepare() 預處理文本(分詞、Canvas 測量、緩存), layout() 純數學計算佈局。Pretext 支持全語言混排、RTL、emoji,500 段文本預處理 19ms、佈局計算僅 0.09ms。工具適用虛擬滾動、聊天氣泡、雜誌排版及 AI 生成 UI 場景,讓 AI 無需理解 CSS 可獲得精確佈局數據。

Pretext的主要功能
-
零 DOM 重排文本測量:繞過
getBoundingClientRect等觸發重排的 API,通過純數學計算獲取文本高度和行數。 -
雙階段架構:
prepare()一次性預處理(分詞+Canvas 測量+緩存),layout()純算術計算佈局,性能提升數百倍。 -
全語言支持 :支持中文、日文、阿拉伯語 RTL、emoji 混排、軟連字符等複雜排版場景。
-
瀏覽器差異適配:識別 Safari 等瀏覽器的特殊渲染行爲,真實渲染爲”真值”反向擬合算法。
-
多場景佈局 API :提供固定寬度換行、逐行路由(支持動態寬度)、收縮包裹(shrinkwrap)等高級功能。
-
跨端渲染支持:可輸出至 DOM、Canvas、SVG,即將支持服務端渲染。
如何使用Pretext
- 安裝引入:通過 npm 安裝
@chenglou/pretext包,在項目中引入所需函數。 - 兩階段調用:用
prepare對文本進行一次性預處理(包含分詞、Canvas 測量、結果緩存),再用layout進行純算術佈局計算,傳入容器寬度和行高可獲得文本高度與行數。 - 窗口自適應:容器寬度變化時(如窗口 resize),只需重新調用
layout,無需重複執行prepare,充分用緩存提升性能。 - 空白符保留:處理 textarea 類內容時,在
prepare中設置whiteSpace: 'pre-wrap'選項,可保留普通空格、製表符和換行符。 - 精細布局控制:改用
prepareWithSegments獲取分段數據,配合layoutWithLines獲取每行具體內容用於 Canvas/SVG 渲染,或使用layoutNextLine逐行處理,支持動態寬度場景如圖文混排。 - 緩存管理:應用切換大量字體或文本變體時,調用
clearCache釋放累積的內存緩存。
Pretext的關鍵信息和使用要求
- 核心定位:純 JavaScript/TypeScript 文本測量庫,繞過 DOM 重排,用純算術方式計算多行文本高度和佈局
- 性能指標:500 段文本批量預處理約 19ms,後續佈局計算僅 0.09ms,比傳統 DOM 測量快數百倍
- 語言支持:全語言混排(中文、日文、阿拉伯語 RTL、emoji)、雙向文本、軟連字符、瀏覽器差異適配
- 開發背景:前 React 核心成員 Cheng Lou 開發,藉助 Claude Code 和 Codex 迭代數週完成
- 適用場景:虛擬滾動、聊天氣泡、瀑布流/雜誌排版、AI 生成 UI(提供純函數接口,AI 無需理解 CSS)
- 環境要求:支持瀏覽器端(DOM/Canvas/SVG 渲染),即將支持服務端渲染
- 字體同步:傳入的
font參數需與 CSSfont聲明保持一致(字號、字重、樣式) - 避免使用
system-ui:macOS 上字體可能導致測量不準確,建議使用具體字體名稱
Pretext的核心優勢
- 零 DOM 重排:完全繞過
getBoundingClientRect等觸發重排的 API,佈局計算不阻塞主線程,避免性能瓶頸。 - 極速性能:500 段文本預處理 19ms,後續佈局僅 0.09ms,比傳統 DOM 測量快數百倍,支持 120fps 滾動和實時調整。
- 純算術計算:將文本佈局轉化爲純函數:輸入內容、字體、寬度 → 輸出高度和行位置,AI 可直接調用無需理解 CSS。
- 全語言兼容:支持中文、阿拉伯語 RTL、emoji 混排、雙向文本、軟連字符,自動適配瀏覽器差異(尤其 Safari)。
- 靈活輸出:計算結果可渲染至 DOM、Canvas、SVG,支持虛擬滾動、聊天氣泡、雜誌排版、圖文混排等複雜場景。
Pretext的項目地址
- GitHub倉庫:https://github.com/chenglou/pretext
Pretext的同類競品對比
| 維度 | Pretext | Canvas measureText | DOM 測量 |
|---|---|---|---|
| 核心機制 | Canvas 測量 + 純算術換行算法 + 緩存 | 瀏覽器原生 Canvas API | 實際渲染後讀取尺寸 |
| 是否觸發重排 | ❌ 零 DOM 重排 | ❌ 無 DOM 操作 | ✅ 觸發重排 |
| 性能 | 極快(佈局 0.09ms) | 中等(需手動實現換行) | 極慢(批量測量卡頓) |
| 多行文本支持 | ✅ 內置完整換行算法 | ❌ 需自行實現 | ✅ 瀏覽器自動處理 |
| 語言支持 | ✅ 全語言(含 RTL、emoji) | ⚠️ 基礎支持 | ✅ 瀏覽器原生支持 |
| 使用難度 | 低(封裝完整) | 高(需自建佈局系統) | 低(API 簡單) |
| 適用場景 | 虛擬滾動、聊天、AI 生成 UI | Canvas 遊戲、簡單文本 | 靜態頁面、低頻次測量 |
Pretext的應用場景
- 虛擬滾動/列表優化:工具提前精確知道每行文本高度,無需渲染即可計算滾動位置和可見區域,實現 120fps 流暢滾動。
- 聊天/消息應用:工具能動態計算多行消息氣泡高度,”收縮包裹”佈局(tight multiline bubbles),減少空白浪費。
- 瀑布流/雜誌排版:卡片高度預測、多欄文本流、圖文混排繞排障礙物,實現 Pinterest 式佈局或複雜編輯頁面。
- AI 流式輸出:大模型逐字生成時實時計算文本高度,避免內容跳動和滾動位置錯位。
© 版權聲明
文章版权归作者所有,未经允许请勿转载。
相關文章
暫無評論...