JS pur · Zéro lecture DOM · TypeScript-first

Pretext.js

Mesure de texte qui ne touche jamais le DOM.

Pretext mesure et positionne le texte multiligne entièrement par calcul arithmétique — pas de getBoundingClientRect, pas de reflow, pas de thrashing. Rapide dès le premier appel. Instantané pour chaque appel suivant.

Editorial EngineDrag orbs · Click to pause · Zero DOM reads
14k+
Étoiles GitHub pour Pretext
0
Lectures DOM dans Pretext layout()
~2ms
Pretext met en page 1 000 blocs
12+
Systèmes d'écriture supportés par Pretext
// le problème

Pourquoi Pretext existe : chaque mesure DOM est un piège de performance.

Chaque fois que votre JavaScript appelle getBoundingClientRect(), offsetHeight ou scrollHeight sur un nœud DOM, le navigateur doit mettre en pause l'exécution du script, traiter tous les changements de style en attente et effectuer un passage de rendu complet — juste pour répondre à votre question sur la taille d'une boîte.

Cela s'appelle le reflow synchrone forcé, et c'est l'une des opérations les plus coûteuses qu'un navigateur puisse effectuer. Dans une boucle serrée — par exemple, mesurer mille éléments dans une liste à défilement virtuel — cela provoque du thrashing : le navigateur alterne entre le rendu et l'exécution JavaScript des centaines de fois par frame, mettant même le matériel moderne à genoux.

La cruelle ironie est que la plupart du temps, vous n'avez besoin que d'un nombre : quelle sera la hauteur en pixels de ce texte, pour cette largeur de conteneur ? Il n'y a aucune raison pour que cette question nécessite de toucher le DOM. Pretext existe pour prouver exactement cela.

traditional-approach.js
// Force le layout du navigateur à chaque itération
const heights = items.map((item) => {
  const el = createElement(item.text);
  document.body.appendChild(el);

  // ← force le reflow ici
  const h = el.getBoundingClientRect().height;
  reflow !

  document.body.removeChild(el);
  return h;
});

// 1000 éléments = 1000 reflows = ~94ms ≈ 6 frames perdues
// comment fonctionne Pretext

Comment fonctionne Pretext : mesurer une fois, mettre en page pour toujours.

Faites glisser le séparateur pour comparer l'approche DOM traditionnelle avec Pretext. L'une déclenche un reflow à chaque appel. Pretext utilise de l'arithmétique pure.

with-pretext.js
import { prepare, layout } from '@chenglou/pretext'

// prepare() s'exécute une seule fois — utilise Canvas
const prepared = prepare(
  'The quick brown fox jumped.',
  '16px Inter'
);

// layout() est de l'arithmétique pure
const { height, lineCount } = layout(
  prepared,
  containerWidth,
  lineHeight
); pas de reflow

// 1000 éléments = 0 reflows = ~0.05ms
// 500x plus rapide, zéro accès DOM
traditional-approach.js
// Force le layout du navigateur à chaque itération
const heights = items.map((item) => {
  const el = createElement(item.text);
  document.body.appendChild(el);

  // ← force le reflow ici
  const h = el.getBoundingClientRect().height;
  reflow !

  document.body.removeChild(el);
  return h;
});

// 1000 éléments = 1000 reflows = ~94ms
// ≈ 6 frames perdues à 60fps
Before
After
1

Segmenter le texte

Normaliser les espaces, appliquer les règles de retour à la ligne Unicode et diviser la chaîne en unités mesurables en utilisant la segmentation de texte native du navigateur.

2

Mesurer avec Canvas

Passer chaque segment par Canvas measureText() pour obtenir les largeurs réelles des glyphes du moteur de police. Les résultats sont mis en cache.

3

Pretext utilise de l'arithmétique pure

Étant donné une largeur de conteneur, calculer les retours à la ligne en additionnant les largeurs des segments. Multiplier le nombre de lignes par la hauteur de ligne. Retourner la hauteur. Pas de DOM, jamais.

// fonctionnalités

Fonctionnalités de Pretext : conçu pour les cas critiques en performance.

Pretext est conçu pour les développeurs qui construisent des interfaces complexes et riches en texte où la mesure DOM traditionnelle est devenue un goulot d'étranglement. Voici les fonctionnalités qui le rendent prêt pour la production.

Zéro lecture DOM

Dans Pretext, après prepare(), chaque appel layout() est de l'arithmétique pure. Pas de getBoundingClientRect, pas d'offsetHeight, pas de reflow synchrone forcé — jamais.

🔡

Métriques de police réelles

Pretext mesure les largeurs de glyphes en utilisant le moteur de police Canvas natif du navigateur, pas des heuristiques ou des tables de correspondance. Le résultat correspond à ce que le navigateur rendrait réellement.

🌍

Multilingue par conception

Pretext supporte entièrement les systèmes d'écriture CJK, arabe, hébreu, thaï, hindi et coréen, y compris la segmentation Unicode correcte et le traitement du texte bidirectionnel.

📘

TypeScript natif

Écrit en TypeScript de A à Z. Types précis pour chaque fonction, paramètre et valeur de retour — pas de packages @types nécessaires, pas de gymnastique de types.

♻️

Handles prepared réutilisables

Un seul appel prepare() couvre toutes les largeurs de conteneur. Calculez les hauteurs pour mobile, tablette et desktop en trois opérations arithmétiques à partir du même handle.

📦

Zéro dépendance runtime

Pas de packages externes, pas de polyfills, pas de surprises dans votre bundle. Pretext s'appuie entièrement sur les API standard du navigateur disponibles dans tout environnement moderne.

// démos

Pretext dans des scénarios réels.

Pretext excelle là où la mesure DOM traditionnelle atteint ses limites. Ces exemples montrent comment Pretext résout de vrais défis de production — du défilement virtuel aux interfaces de chat multilingues.

Tous les exemples →
// showcases communautaires

Construit avec Pretext.

Démos créatives de la communauté — drum machines de texte, simulations de fluides, tableaux blancs collaboratifs et plus encore. Découvrez ce que les développeurs construisent avec Pretext.

Tous les showcases →
// démarrage

Installez Pretext en trois minutes.

Pretext est publié sur npm et inclut des déclarations TypeScript complètes. Installez-le avec votre gestionnaire de paquets préféré, importez les deux fonctions dont vous avez besoin, et vous êtes prêt à mesurer du texte sans toucher le DOM.

$npm install @chenglou/pretext
$pnpm add @chenglou/pretext
$bun add @chenglou/pretext
quickstart.ts
import { prepare, layout } from '@chenglou/pretext'

// Étape 1 : prepare une fois pour un couple texte+police
const handle = prepare(
  'Hello, Pretext — no reflow needed.',
  '16px "Inter"'
);

// Étape 2 : layout à n'importe quelle largeur, instantanément
const { height, lineCount } = layout(
  handle,
  400,  // largeur du conteneur en px
  24    // hauteur de ligne en px
);

console.log(height);    // → 48
console.log(lineCount); // → 2

// Étape 3 : réutilisez le handle pour différentes largeurs
const narrow = layout(handle, 240, 24); // → 3 lignes
// blog

Blog Pretext.

Analyses approfondies sur le rendu de texte, les performances des navigateurs et comment Pretext résout les problèmes que les développeurs rencontrent chaque jour — qu'ils connaissent la cause profonde ou non.

Tous les articles →
// prochaines étapes

Essayez Pretext dès aujourd'hui.

Que vous construisiez une liste à défilement virtuel, un éditeur de code, une interface de chat IA, ou quoi que ce soit d'autre où la hauteur du texte compte — Pretext vous donne des mesures précises sans coût de performance.

Pretext.js - Mesure de texte qui ne touche jamais le DOM.