JavaScriptテキストエンジン
PretextライブラリはWeb上で複数行テキストを計測する最速の方法です。この純粋なJavaScriptテキスト計測ライブラリは、DOMに一切触れずに改行、高さ、レイアウトを計算します — 従来のブラウザ計測より約600倍高速。Pretextライブラリはあらゆるフレームワーク、あらゆるブラウザ、あらゆる言語で動作します。
概要
Pretextライブラリは、Cheng Lou(元Reactコアチームメンバー、現Midjourney所属)が作成した純粋なJavaScript/TypeScriptテキスト計測エンジンです。テキストを計測するためにブラウザがDOMにレンダリングする必要がある従来のアプローチとは異なり、Pretextライブラリはテキストレイアウトを2つの軽量フェーズに分割します — JavaScriptで利用可能な最速のテキスト計測ライブラリです。
Pretextライブラリの第1フェーズは準備です。テキストとフォントを指定してprepare()を一度呼び出します。PretextライブラリはUnicodeルールを使用してテキストをセグメント化し、Canvas measureText() APIを介して各セグメントのグリフ幅を計測します。テキストの長さに応じて通常0.1〜1msかかります。
第2フェーズはレイアウトです。コンテナ幅と行の高さを指定してlayout()を呼び出します。Pretextライブラリはキャッシュされたセグメント幅を純粋な算術演算で処理します — DOMアクセスなし、強制リフローなし。Pretextライブラリでの1回のレイアウト呼び出しは約0.001msで、フレームあたり数千回実行するのに十分な速さです。preparedハンドルは再利用可能:同じハンドルから3つの演算でモバイル、タブレット、デスクトップの高さを計算できます。

$ npm install @chenglou/pretext import { prepare, layout } from '@chenglou/pretext' const prepared = prepare('Your text', '16px Inter') const { height, lineCount } = layout(prepared, 400, 24)
このライブラリを選ぶ理由
Pretextライブラリはパフォーマンスと開発者体験のためにゼロから設計されています。JavaScriptアプリケーションでのテキスト計測にPretextライブラリが最適な選択である理由をご紹介します。
Pretextライブラリはレイアウト中にDOMへの読み書きを一切行いません。最初のCanvas計測の後、以降のすべての操作は純粋な算術演算です。強制同期レイアウト、リフロー、レイアウトスラッシング — テキスト密度の高いアプリケーションにおける3大パフォーマンスキラーを排除します。
Pretextライブラリは依存関係ゼロのスタンドアロンJavaScriptモジュールです。React、Vue、Svelte、Angular、またはプレーンJavaScriptにインポートできます。Pretextライブラリはあらゆる環境 — クライアントサイド、サーバーサイド、Web Workerで同一に動作します。
PretextライブラリはUnicode対応テキストセグメンテーションにIntl.Segmenterを使用します。CJK、アラビア語、ヘブライ語、タイ語、韓国語、混合スクリプトテキストはすべて同じAPIで正確に計測されます。Pretextライブラリは双方向テキストや複雑なスクリプトを特別な処理なしに扱います。
Pretextライブラリでの各layout()呼び出しは約0.001ms — キャッシュされたグリフ幅に対する純粋な算術演算です。アニメーションフレームあたり数千回layout()を呼び出せます。これによりPretextライブラリはリアルタイムリフロー、レスポンシブリサイズ、インタラクティブタイポグラフィに最適です。
PretextライブラリはlayoutNextLine()による行ごとの幅制御をサポートします。テキストは障害物を避けたり、不規則な形状に沿ったり、複雑なエディトリアルレイアウトに適応できます。これはPretextライブラリで構築された雑誌スタイルのテキスト折り返しやクリエイティブタイポグラフィプロジェクトで使用されるのと同じテクニックです。
Pretextライブラリは完全な型定義付きでTypeScriptで記述されています。すべての関数、パラメータ、戻り値の型が強く型付けされています。IDEの自動補完と型チェックがそのまま動作 — プロジェクトでPretextライブラリを使用する際に@typesパッケージは不要です。
パフォーマンス比較
従来のDOM計測は不可視の要素を作成し、テキストをレンダリングし、計算された高さを読み取り、要素を削除します。Pretextライブラリはこのサイクル全体を排除します。PretextライブラリとDOMの標準アプローチの比較です。
| 項目 | DOM計測 | Pretextライブラリ |
|---|---|---|
| 計測あたりの速度 | 0.5–2ms(強制リフロー) | ~0.001ms(純粋算術演算) |
| DOMアクセス必要 | はい — 隠し要素を作成 | いいえ — DOM読み書きゼロ |
| レイアウトスラッシング | はい — ブラウザリフローを発生 | なし — リフロー不可能 |
| SSR / Web Workerサポート | いいえ — ブラウザDOMが必要 | はい — どこでも動作 |
| バンドルサイズ | ブラウザ組み込み(ただし遅い) | ~15KB gzip、依存関係0 |
| 同じテキストで複数幅 | 各幅で再レンダリング | ハンドル再利用 — 即座 |
| Unicode & CJKサポート | ブラウザレンダリングに依存 | Intl.Segmenter — 正確 |
活用シーン
Pretextライブラリはテキスト計測がボトルネックとなるあらゆる場面で力を発揮します。仮想スクロールからクリエイティブタイポグラフィまで、開発者がプロダクションでPretextライブラリを使用する最も一般的な方法をご紹介します。
Pretextライブラリを使用して、数千の可変高さリストアイテムの高さを事前計算。DOM要素不要。React Virtuoso、TanStack Virtual、あらゆる仮想化ライブラリで60fpsスクロールに対応。
Pretextライブラリでストリーミングされるアラスポンスのレンダリング完了前にメッセージバブルの高さを予測。レイアウトシフトとジャンプを排除。モバイルで無駄な余白を最小化するタイトラッピング。
Pretextライブラリでチャートツールチップ、テーブルセル、カードレイアウトのサイズを計算 — 強制同期リフローなし。数百のテキスト要素がリアルタイムで更新されても60fpsを維持。
Pretextライブラリを使用して、1回のprepare()呼び出しから複数のブレークポイントでテキスト高さを計算。モバイル、タブレット、デスクトップ — 同じハンドルから3つの算術演算、リフローゼロ。
テキストが障害物を避けて流れるエディトリアルレイアウト、雑誌スタイルの多段組、パーティクル駆動ASCIIアートを構築。Pretextライブラリは、CSSだけでは実現できない行ごとの制御を提供します。
Pretextライブラリは同じ2関数のAPIでCJK、アラビア語、ヘブライ語、タイ語、韓国語、混合スクリプトテキストを計測します。Unicodeセグメンテーションと双方向テキストは自動的に処理されます。
API
Pretextライブラリは小さく集中したAPIを公開します。Pretextライブラリのすべての関数は特定の目的を果たします — 準備またはレイアウト。完全な関数リファレンスです。
| 関数 | フェーズ | 目的 |
|---|---|---|
| prepare(text, font) | 準備 | テキストをセグメント化して計測。不透明ハンドルを返す。 |
| prepareWithSegments(text, font) | 準備 | prepare()と同様、ただしセグメントデータを高度な用途向けに公開。 |
| layout(prepared, width, lineHeight) | レイアウト | 行数と合計高さを計算。純粋算術演算。 |
| layoutWithLines(prepared, width, lineHeight) | レイアウト | layout()と同様、各行のテキストと幅も含む。 |
| layoutNextLine(prepared, cursor, width) | レイアウト | 一度に1行ずつレイアウト。行ごとに可変幅。 |
| walkLineRanges(prepared, width, cb) | レイアウト | 文字列を構築せずに行境界を反復。 |
クイックスタート
Pretextライブラリのインストールは1コマンドで完了。依存関係ゼロの単一npmパッケージとして提供。3ステップでプロジェクトでPretextライブラリの使用を開始できます。
npm、pnpm、またはyarnでプロジェクトにPretextライブラリを追加。パッケージは@chenglou/pretext — 約15KB gzip、依存関係ゼロ。
テキスト+フォントペアごとにprepare(text, font)を一度呼び出します。PretextライブラリがテキストをセグメントしてCanvasでグリフ幅を計測。複数のlayout呼び出しで再利用するためにハンドルを保存。
layout(handle, width, lineHeight)を呼び出して高さと行数を取得。Pretextライブラリは純粋な算術演算で約0.001msでこれを計算。同じハンドルを異なるコンテナ幅に再利用。
PretextライブラリはオープンソースでMITライセンス、プロダクション対応です。インタラクティブPlaygroundで試す、コミュニティデモを探る、またはGitHubでソースコードをご覧ください。Pretextライブラリで高速なDOM不要テキスト計測を実現する数千人の開発者に加わりましょう。
PretextライブラリはCheng Louによって作成されました。GitHub Pretextエコシステムについてもっと読む。