這個開源項目,號稱解決了文字排版的世紀難題

作者:前端新視野brizer
日期:2026年4月22日 下午11:56
來源:WeChat 原文

整理版優先睇

速讀 5 個重點 高亮

Pretext 徹底解決了困擾前端 20 年的 DOM 文字測量難題,實現了不觸發 Reflow 的高性能排版。

  • 核心痛點:傳統瀏覽器排版需依賴 DOM 測量文字高度,頻繁觸發昂貴的迴流(Reflow)操作且無法緩存。
  • 技術突破:由 Framer Motion 作者開發,利用 Canvas 預先計算字符寬高並存儲,將佈局計算轉化為純算術運算。
  • 功能亮點:支持中日韓(CJK)、Emoji 及混合雙向文字,能精確計算多行文字的最小寬度實現完美貼合(Shrink Wrap)。
  • 應用場景:極大優化虛擬列表、瀑布流佈局及手風琴動畫,在渲染前即可預知精確高度,消除頁面抖動。
  • 性能優勢:支持萬級氣泡同時渲染而不卡頓,為對性能有極致要求的複雜 Feed 流提供終極解決方案。
值得記低
工具 github.com

Pretext

由 Cheng Lou 開發的高性能文字測量與佈局 JavaScript 庫,支持不觸碰 DOM 的情況下計算排版。

連結 chenglou.me

Pretext 官方文檔與 Demo

包含詳細的技術說明與實際排版效果演示。

整理重點

文字排版的「世紀難題」:昂貴的 DOM 測量

做前端開發最怕遇到容器高度突然跳動。無論是聊天氣泡、瀑布流卡片,還是手風琴展開動畫,背後都卡在同一個瓶頸:瀏覽器必須先量完文字,才知道容器該給多大。

整理重點

Pretext:跳過 DOM 直接計算佈局

Pretext 是由 Framer Motion 作者 Cheng Lou 推出的開源項目。它不走尋常路,直接繞過 DOM 引擎來解決問題。

核心思路:利用 Canvas 調用瀏覽器的字體引擎,提前將每個字符的寬高數據算好並存儲,後續佈局只需進行純算術運算。

這種做法讓文字排版從「測量」變成了「計算」,速度提升了幾個數量級,且完全不會引起頁面抖動。

整理重點

三大實戰場景:從瀑布流到流暢動畫

Pretext 的出現讓許多原本棘手的 UI 交互變得輕而易舉:

整理重點

全方位的語言支持與技術細節

Pretext 並非只針對英文優化,它對複雜文本的處理能力非常強悍,適合全球化產品開發。

Pretext 核心支持特性 markdown
• 支持 CJK (中日韓) 字符排版
• 支持 Emoji 渲染與測量
• 支持混合雙向文字 (如阿拉伯文與英文混排)
• 處理 Grapheme Clusters (字符簇) 分割

 

這個開源項目,號稱解決了文字排版的世紀難題

做前端的同學,大概都被這個問題坑過:

聊天消息渲染之後,父容器高度突然變了?瀑布流卡片排列好之後,頁面抖了一下?手風琴展開動畫,卡在"等 DOM 算完高度"這一步?

這背後都是同一個元兇:DOM 文字測量

瀏覽器要量完文字才知道容器該多大,這個動作會觸發迴流(reflow),是頁面性能最貴的操作之一,而且沒法緩存——每次文字變了都要重新量。

這個問題存在了 20 年,一直沒有好的解決方案。

直到最近,我看到了這個項目。

圖片

它是什麼?

這個庫叫 Pretext,作者 Cheng Lou——Framer Motion 的作者。

Pretext 是一個純 JavaScript/TypeScript 的文字測量和佈局庫。核心能力:在不觸 DOM 的前提下,精確計算多行文字的高度和佈局

實現思路:用 Canvas 調用瀏覽器自己的字體引擎,提前把每個字符的寬高全部算好存起來,後續只需要做純算術運算,不再需要讀 DOM。


用它能做哪些事?

氣泡對話的完美貼合

聊天氣泡,CSS 的 width: fit-content 只能跟隨最寬那行,導致短行右邊留空白。

Pretext 能找到讓文字恰好換行 N 行的最小寬度,真正做到 "shrink wrap"。一萬個氣泡同時渲染,瀏覽器眼睛都不眨一下。

手風琴展開,動畫想多流暢都行

手風琴菜單展開時,內容區高度通常靠 CSS transition 硬撐或者寫死高度。

Pretext 在展開之前就已經知道展開後有多高,動畫路徑完全預知,transition 想做多流暢都可以。

瀑布流,真正的預知高度

瀑布流卡片排列,最難的就是:不知道每張卡片有多高,排完之後整個佈局還要重新計算。

Pretext 在渲染之前就算好了每張卡片的高度,瀑布流一次性排好,不需要二次回爐。


支持中日韓、emoji、混合雙向文字

從 Demo 截圖能看到,Pretext 處理 CJK 字符、emoji、阿拉伯文混合雙向文字都沒問題,連字符分割(grapheme clusters)都處理了。

圖片

適合誰用?

  • • 做虛擬列表/虛擬滾動的同學,需要精確預判每項高度
  • • 做聊天/Feed 流的同學,多媒體內容高度不確定
  • • 做瀑布流/masonry 佈局的同學
  • • 對性能優化有強迫症的同學

GitHub:

https://github.com/chenglou/pretext

文檔和 Demo 都在官網:chenglou.me/pretext


這個問題存在了 20 年,現在終於有人給出了一個完整答案。先收藏,不虧。

#前端 #開源 #JavaScript #性能優化 #程序員