🏠 ホーム ニュース 📚 トピック解説 🏷️ タグ一覧 ℹ️ About
🔍 記事を検索
カテゴリ
📡 RSSフィード
Follow
X (Twitter) Threads
Quick Links
ニュース一覧 🏷️ タグから探す
🧠 Claude 🤖 Agent 💬 LLM 🔌 MCP 🛠️ Tool
Subscribe
📡 RSSフィード
Breaking News
2026.03.30 23:05 coding ui

TypeScript向け「Pretext」、DOM測定を不要にする高速テキストレイアウト実装

📝 ニュース
📝 AI Heartland News
TL;DR
chenglou氏が開発するPretextは、ブラウザのレイアウトリフローを回避しながら複数行テキストの測定・レイアウト処理を実現するPure JavaScriptライブラリ。全言語対応。

何が起きたか

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 で確認可能。ローカルでの動作確認は以下手順:

  1. リポジトリをクローン
  2. bun install でインストール
  3. bun start で開発サーバー起動
  4. /demos にアクセス(末尾スラッシュなし)

API は シンプルで prepare() 一度、layout() ループ内で何度も呼び出す設計。テキスト測定が頻繁に必要なリッチエディタやテキストレイアウトエンジン実装に向く。

参考リンク


この記事はAI業界の最新動向を速報でお届けする「AI Heartland ニュース」です。

よくある質問
Q. Pretext と従来の DOM API 測定の具体的なパフォーマンス差は?
Pretext はレイアウトリフロー を完全排除し純粋算術のみで動作するため、getBoundingClientRect() 呼び出しによるリフロー コストを削減。複雑な UI では顕著なパフォーマンス向上が期待できる。
Q. Pretext はどの言語のテキスト測定に対応している?
日本語、中文、アラビア語、絵文字を含む全言語に対応。ブラウザの標準フォントエンジンを基準にしているため、言語別の個別実装不要。
Q. prepare() と layout() の使い分けは?
prepare() はテキストとフォントスタイルから測定用キャッシュを生成(重い)。layout() はキャッシュを使って異なる幅での行折り返しを計算(軽い)。同一テキストで複数の幅を試す場合、prepare() は一度のみ。
Q. Canvas 測定に依存しているため、サーバーサイドでは使えない?
現在のバージョンは Canvas 測定が必須のため、Node.js 環境では動作不可。ただし開発チームはサーバーサイド対応を計画中。
Q. DOM、Canvas、SVG 以外のレンダリング対象は計画されている?
現段階では DOM、Canvas、SVG が主対象。将来的にはサーバーサイド対応が予定されているが、詳細な実装スケジュールは未公開。
← Harness Engineering完全ガイド:530個のリソースで学ぶプロンプト設計の実践 数字なし時計「Gonon」開発。幾何学で時間を表現する普遍的なデザイン →