JavaScriptテキストエンジン

Pretextライブラリ

PretextライブラリはWeb上で複数行テキストを計測する最速の方法です。この純粋なJavaScriptテキスト計測ライブラリは、DOMに一切触れずに改行、高さ、レイアウトを計算します — 従来のブラウザ計測より約600倍高速。Pretextライブラリはあらゆるフレームワーク、あらゆるブラウザ、あらゆる言語で動作します。

~600×
DOMより高速
~15KB
gzip圧縮後のバンドル
0
依存関係
MIT
オープンソースライセンス

概要

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つの演算でモバイル、タブレット、デスクトップの高さを計算できます。

Pretextライブラリ — chenglou開発の最速JavaScriptテキスト計測ライブラリ
GitHubのPretextライブラリ(github.com/chenglou/pretext)— 23.6kスター、MITライセンス、純粋TypeScript(github.com/chenglou/pretext) —
Pretextライブラリ — 4行で始める
$ 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ライブラリの特長

Pretextライブラリはパフォーマンスと開発者体験のためにゼロから設計されています。JavaScriptアプリケーションでのテキスト計測にPretextライブラリが最適な選択である理由をご紹介します。

DOMアクセスゼロ

Pretextライブラリはレイアウト中にDOMへの読み書きを一切行いません。最初のCanvas計測の後、以降のすべての操作は純粋な算術演算です。強制同期レイアウト、リフロー、レイアウトスラッシング — テキスト密度の高いアプリケーションにおける3大パフォーマンスキラーを排除します。

フレームワーク非依存

Pretextライブラリは依存関係ゼロのスタンドアロンJavaScriptモジュールです。React、Vue、Svelte、Angular、またはプレーンJavaScriptにインポートできます。Pretextライブラリはあらゆる環境 — クライアントサイド、サーバーサイド、Web Workerで同一に動作します。

完全なUnicode & i18nサポート

PretextライブラリはUnicode対応テキストセグメンテーションにIntl.Segmenterを使用します。CJK、アラビア語、ヘブライ語、タイ語、韓国語、混合スクリプトテキストはすべて同じAPIで正確に計測されます。Pretextライブラリは双方向テキストや複雑なスクリプトを特別な処理なしに扱います。

サブマイクロ秒レイアウト

Pretextライブラリでの各layout()呼び出しは約0.001ms — キャッシュされたグリフ幅に対する純粋な算術演算です。アニメーションフレームあたり数千回layout()を呼び出せます。これによりPretextライブラリはリアルタイムリフロー、レスポンシブリサイズ、インタラクティブタイポグラフィに最適です。

可変幅行

PretextライブラリはlayoutNextLine()による行ごとの幅制御をサポートします。テキストは障害物を避けたり、不規則な形状に沿ったり、複雑なエディトリアルレイアウトに適応できます。これはPretextライブラリで構築された雑誌スタイルのテキスト折り返しやクリエイティブタイポグラフィプロジェクトで使用されるのと同じテクニックです。

TypeScriptファースト

Pretextライブラリは完全な型定義付きでTypeScriptで記述されています。すべての関数、パラメータ、戻り値の型が強く型付けされています。IDEの自動補完と型チェックがそのまま動作 — プロジェクトでPretextライブラリを使用する際に@typesパッケージは不要です。

パフォーマンス比較

Pretextライブラリ vs DOM計測

従来の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ライブラリを使用する最も一般的な方法をご紹介します。

📜

仮想スクロール

Pretextライブラリを使用して、数千の可変高さリストアイテムの高さを事前計算。DOM要素不要。React Virtuoso、TanStack Virtual、あらゆる仮想化ライブラリで60fpsスクロールに対応。

💬

チャット & AIインターフェース

Pretextライブラリでストリーミングされるアラスポンスのレンダリング完了前にメッセージバブルの高さを予測。レイアウトシフトとジャンプを排除。モバイルで無駄な余白を最小化するタイトラッピング。

📊

ダッシュボード & データテーブル

Pretextライブラリでチャートツールチップ、テーブルセル、カードレイアウトのサイズを計算 — 強制同期リフローなし。数百のテキスト要素がリアルタイムで更新されても60fpsを維持。

📱

レスポンシブレイアウト

Pretextライブラリを使用して、1回のprepare()呼び出しから複数のブレークポイントでテキスト高さを計算。モバイル、タブレット、デスクトップ — 同じハンドルから3つの算術演算、リフローゼロ。

🎨

クリエイティブタイポグラフィ

テキストが障害物を避けて流れるエディトリアルレイアウト、雑誌スタイルの多段組、パーティクル駆動ASCIIアートを構築。Pretextライブラリは、CSSだけでは実現できない行ごとの制御を提供します。

🌍

多言語コンテンツ

Pretextライブラリは同じ2関数のAPIでCJK、アラビア語、ヘブライ語、タイ語、韓国語、混合スクリプトテキストを計測します。Unicodeセグメンテーションと双方向テキストは自動的に処理されます。

API

Pretextライブラリ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ライブラリを始める

Pretextライブラリのインストールは1コマンドで完了。依存関係ゼロの単一npmパッケージとして提供。3ステップでプロジェクトでPretextライブラリの使用を開始できます。

1

Pretextライブラリをインストール

npm、pnpm、またはyarnでプロジェクトにPretextライブラリを追加。パッケージは@chenglou/pretext — 約15KB gzip、依存関係ゼロ。

2

テキストを準備

テキスト+フォントペアごとにprepare(text, font)を一度呼び出します。PretextライブラリがテキストをセグメントしてCanvasでグリフ幅を計測。複数のlayout呼び出しで再利用するためにハンドルを保存。

3

任意の幅でレイアウト

layout(handle, width, lineHeight)を呼び出して高さと行数を取得。Pretextライブラリは純粋な算術演算で約0.001msでこれを計算。同じハンドルを異なるコンテナ幅に再利用。

Pretextライブラリを使い始める

PretextライブラリはオープンソースでMITライセンス、プロダクション対応です。インタラクティブPlaygroundで試す、コミュニティデモを探る、またはGitHubでソースコードをご覧ください。Pretextライブラリで高速なDOM不要テキスト計測を実現する数千人の開発者に加わりましょう。

PretextライブラリはCheng Louによって作成されました。GitHub Pretextエコシステムについてもっと読む。

Pretextライブラリ — 最速のJavaScriptテキスト計測ライブラリ