TypeScript/JavaScriptの純粋実装テキストレイアウトライブラリ「Pretext」が公開された。GitHubで17.2k の Star を集める本ライブラリは、従来のDOM測定(getBoundingClientRect、offsetHeightなど)による高コストなレイアウトリフロー を完全に回避。Canvas測定をベースにした自前実装で、複数行テキストの正確な高さと行数を算出する。DOM、Canvas、SVG、将来的にはサーバーサイドへのレンダリングにも対応予定。
ブラウザでテキストレイアウトを測定する際、getBoundingClientRect()やoffsetHeightといったDOM APIは強制的なレイアウトリフロー を引き起こす。これはレンダリングパイプラインの最も重い処理の一つで、複雑なUI(特にリアルタイム更新が必要な場合)ではパフォーマンス低下に直結する。Pretext は、ブラウザの標準フォントエンジンを「真実の源」として活用しながら、純粋な算術演算による高速な計算パスを提供することで、この課題を根本的に解決する。
Pretext は2段階の処理構造を採用。
第一段階の prepare() は一度だけ実行:
第二段階の layout() は高速なホットパス:
const prepared = prepare('AGI 春天到了. بدأت الرحلة 🚀', '16px Inter')
const { height, lineCount } = layout(prepared, textWidth, 20)
// 純粋な算術演算。DOM レイアウト不要
キャッシュされた幅情報に対して純粋な算術処理のみを行うため、DOM 操作は完全に排除される。日本語、アラビア語、絵文字など全言語対応。
| ライブラリ | 手法 | 特徴 | 欠点 |
|---|---|---|---|
| Pretext | Canvas 測定 + キャッシュ算術 | レイアウトリフロー なし、全言語対応 | Canvas への依存 |
| DOM API | getBoundingClientRect | ブラウザ標準 | 強制リフロー発生 |
| TextMetrics | Canvas textMetrics API | シンプル | 行折り返し処理が限定的 |
| 従来型テキストレイアウト | DOM 実測 + キャッシュ | 確実 | パフォーマンス問題顕著 |
開発者チームは以下の拡張を予定している:
GitHubリポジトリは積極的な開発が続いており、Issues 13件、Pull requests 19件が進行中。
npm install @chenglou/pretext
公式デモは https://chenglou.me/pretext で確認可能。ローカルでの動作確認は以下手順:
bun install でインストールbun start で開発サーバー起動/demos にアクセス(末尾スラッシュなし)API は シンプルで prepare() 一度、layout() ループ内で何度も呼び出す設計。テキスト測定が頻繁に必要なリッチエディタやテキストレイアウトエンジン実装に向く。
この記事はAI業界の最新動向を速報でお届けする「AI Heartland ニュース」です。