JS puro · Cero lecturas del DOM · TypeScript-first

Pretext.js

Medicion de texto que nunca toca el DOM.

Pretext mide y posiciona texto multilínea mediante aritmética pura — sin getBoundingClientRect, sin reflow DOM, sin bloqueos. Rápido en la primera llamada. Instantáneo en todas las siguientes.

Editorial EngineDrag orbs · Click to pause · Zero DOM reads
14k+
Estrellas en GitHub para Pretext
0
Lecturas del DOM en layout() de Pretext
~2ms
Pretext procesa 1,000 bloques de texto
12+
Sistemas de escritura que soporta Pretext
// the problem

Por qué existe Pretext: cada medicion de texto en el DOM es una trampa de rendimiento web.

Cada vez que tu JavaScript llama a getBoundingClientRect(), offsetHeight o scrollHeight sobre un nodo del DOM, el navegador debe pausar la ejecución del script, aplicar todos los cambios de estilo pendientes y realizar un pase de renderizado de texto completo — solo para responder tu pregunta sobre el tamaño de un elemento.

Esto se conoce como reflow DOM sincrónico forzado, y es una de las operaciones más costosas que un navegador puede ejecutar. En un bucle cerrado — por ejemplo, midiendo mil elementos en una lista con scroll virtual — provoca thrashing: el navegador alterna entre renderizado de texto y ejecución de JavaScript cientos de veces por frame, paralizando incluso el hardware más moderno.

La cruel ironía es que la mayoría de las veces solo necesitas un número: ¿cuántos píxeles de alto tendrá este texto dado este ancho de contenedor? No hay razón para que esa pregunta requiera tocar el DOM. Pretext existe para demostrarlo.

traditional-approach.js
// Forces browser layout on every iteration
const heights = items.map((item) => {
  const el = createElement(item.text);
  document.body.appendChild(el);

  // ← forces layout reflow here
  const h = el.getBoundingClientRect().height;
  reflow!

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

// 1000 items = 1000 reflows = ~94ms ≈ 6 dropped frames
// how pretext works

Cómo funciona Pretext: mide una vez, calcula el layout para siempre.

Arrastra el divisor para comparar el enfoque tradicional del DOM con Pretext. Uno provoca reflow DOM en cada llamada. Pretext usa aritmética pura.

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

// prepare() runs once — uses Canvas
const prepared = prepare(
  'The quick brown fox jumped.',
  '16px Inter'
);

// layout() is pure arithmetic
const { height, lineCount } = layout(
  prepared,
  containerWidth,
  lineHeight
); no reflow

// 1000 items = 0 reflows = ~0.05ms
// 500x faster, zero DOM access
traditional-approach.js
// Forces browser layout on every iteration
const heights = items.map((item) => {
  const el = createElement(item.text);
  document.body.appendChild(el);

  // ← forces layout reflow here
  const h = el.getBoundingClientRect().height;
  reflow!

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

// 1000 items = 1000 reflows = ~94ms
// ≈ 6 dropped frames at 60fps
Before
After
1

Segmentar el texto

Normaliza los espacios en blanco, aplica las reglas Unicode de salto de línea y divide la cadena en unidades medibles usando la propia segmentación de texto del navegador.

2

Medir con Canvas

Pasa cada segmento por Canvas measureText() para obtener los anchos reales de avance de glifos del motor de fuentes. Los resultados se almacenan en caché.

3

Pretext usa aritmética pura

Dado un ancho de contenedor, calcula los saltos de línea sumando los anchos de los segmentos. Multiplica el número de líneas por el line-height. Devuelve la altura. Sin DOM, nunca.

// capabilities

Capacidades de Pretext: diseñado para casos donde el rendimiento web es crítico.

Pretext es un motor de layout de texto diseñado para desarrolladores que construyen interfaces complejas con mucho texto, donde la medicion de texto tradicional del DOM se ha convertido en el cuello de botella. Estas son las capacidades que lo hacen listo para producción.

Cero lecturas del DOM

En Pretext, después de prepare(), cada llamada a layout() es aritmética pura. Sin getBoundingClientRect, sin offsetHeight, sin reflow DOM sincrónico forzado — nunca.

🔡

Metricas de fuente reales

Pretext mide los anchos de glifos usando el propio motor de fuentes Canvas del navegador, no heurísticas ni tablas de consulta. El resultado coincide con lo que el navegador realmente renderizaría.

🌍

Multilingüe por diseño

Pretext soporta completamente los sistemas de escritura CJK, árabe, hebreo, tailandés, hindi y coreano, incluyendo segmentación Unicode correcta y manejo de texto bidireccional.

📘

Nativo en TypeScript

Escrito en TypeScript desde cero. Tipos precisos para cada función, parámetro y valor de retorno — sin paquetes @types necesarios, sin gimnasia de tipos.

♻️

Handles reutilizables de prepare()

Una sola llamada a prepare() cubre cualquier ancho de contenedor. Calcula alturas para móvil, tablet y escritorio en tres operaciones aritméticas desde el mismo handle.

📦

Cero dependencias en runtime

Sin paquetes externos, sin polyfills, sin sorpresas en tu bundle. Pretext es una libreria JavaScript que depende únicamente de APIs estándar del navegador disponibles en cualquier entorno moderno.

// demos

Pretext en escenarios reales.

Pretext brilla donde la medicion de texto tradicional del DOM se queda corta. Estos ejemplos muestran a Pretext resolviendo desafíos reales de producción — desde scroll virtual hasta interfaces de chat multilingües.

Todos los ejemplos →
// community showcases

Construido con Pretext.

Demos creativos de la comunidad — máquinas de ritmo con texto, simulaciones fluidas, pizarras colaborativas y más. Descubre lo que los desarrolladores están construyendo con Pretext.

Todos los showcases →
// get started

Instala Pretext en tres minutos.

Pretext está publicado en npm y viene con declaraciones TypeScript completas. Instálalo con tu gestor de paquetes preferido, importa las dos funciones que necesitas y estarás listo para medir texto sin tocar el DOM.

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

// Step 1: prepare once for a given text + font pair
const handle = prepare(
  'Hello, pretext.js — no reflow needed.',
  '16px "Inter"'
);

// Step 2: layout at any width, instantly
const { height, lineCount } = layout(
  handle,
  400,  // container width in px
  24    // line height in px
);

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

// Step 3: reuse the handle for different widths
const narrow = layout(handle, 240, 24); // → 3 lines
// blog

Blog de Pretext.

Análisis profundos sobre renderizado de texto, rendimiento web del navegador, y cómo Pretext resuelve problemas que los desarrolladores enfrentan a diario — sepan o no cuál es la causa raíz.

Todos los artículos →
// next steps

Prueba Pretext hoy.

Ya sea que estés construyendo una lista con scroll virtual, un editor de código, una interfaz de chat con IA, o cualquier cosa donde la altura del texto importe — Pretext te da metricas de fuente precisas sin el costo de rendimiento web.

Pretext.js - Medicion de texto que nunca toca el DOM.