Pretext.JS Overview
Pretext.JS es un motor rápido de maquetación de texto en JavaScript/TypeScript puro, diseñado para medir y posicionar texto multilínea únicamente mediante aritmética, sin tocar nunca el Document Object Model (DOM). Elimina el cuello de botella de rendimiento de los “forced synchronous reflows” causados por mediciones tradicionales del DOM como getBoundingClientRect(), ofreciendo una maquetación de texto significativamente más rápida y eficiente. Está basado en el principio de “measure once, lay out forever”, lo que hace que los cálculos de maquetación posteriores sean instantáneos.
Main Purpose
Proporcionar mediciones de maquetación de texto altamente eficientes, precisas y sin reflows (como altura y número de líneas) para interfaces web dinámicas y complejas. Resuelve el problema crítico de rendimiento del “browser thrashing” provocado por mediciones repetidas del DOM.
Target User Group
Desarrolladores web y equipos que construyen interfaces de usuario con requisitos de rendimiento muy exigentes y gran cantidad de texto. Esto incluye aplicaciones con listas de desplazamiento virtual, interfaces de chat de IA, editores de código, pizarras colaborativas, visualizaciones de datos y cualquier escenario donde la maquetación dinámica de texto deba ser fluida, rápida y responsiva sin comprometer la experiencia de usuario.
Function Details and Operations
Pretext.JS funciona en dos pasos principales:
-
prepare(text, font)
Esta función se ejecuta una sola vez para una cadena de texto y un estilo de fuente dados. Normaliza espacios en blanco, aplica las reglas de salto de línea Unicode, segmenta el texto y mide con precisión el ancho de avance de los glifos de cada segmento usando el motor de fuentes Canvas del navegador. Los resultados se almacenan en caché en un “handle” reutilizable. -
layout(handle, containerWidth, lineHeight)
Esta función es puramente aritmética y se ejecuta de forma instantánea. A partir del handle preparado, un ancho de contenedor y una altura de línea, calcula los saltos de línea sumando los anchos de los segmentos, determina el número total de líneas y calcula la altura global del texto. De forma crucial, esta etapa no realiza ninguna lectura del DOM, garantizando cero reflows.
Key Capabilities
-
Zero DOM Reads
Tras la llamada inicial aprepare(), todas las operacioneslayout()son puramente aritméticas, evitando por completogetBoundingClientRect(),offsetHeighty los forced synchronous reflows. -
Real Font Metrics
Utiliza el motor de fuentes nativo de Canvas del navegador para medir los anchos de glifos, asegurando una maquetación precisa que coincide con el renderizado real del navegador. -
Multilingual by Design
Ofrece soporte completo para sistemas de escritura complejos, incluidos CJK (chino, japonés, coreano), árabe, hebreo, tailandés e hindi, con segmentación Unicode correcta y gestión de texto bidireccional. -
TypeScript-Native
Desarrollado desde cero en TypeScript, proporciona tipos precisos para todas las funciones, parámetros y valores de retorno sin necesidad de paquetes externos@types. -
Reusable Prepared Handles
Una única llamada aprepare()genera un handle que puede reutilizarse para calcular la maquetación en distintos anchos de contenedor (por ejemplo, móvil, tablet, escritorio) con un coste mínimo. -
Zero Runtime Dependencies
Construido íntegramente sobre APIs estándar del navegador, lo que garantiza un tamaño de bundle reducido y ausencia de problemas inesperados con paquetes externos.
User Benefits
-
Exceptional Performance
Consigue hasta 500x más velocidad en la maquetación de texto en comparación con los métodos tradicionales basados en el DOM, permitiendo desplazamiento a 60fps y UIs altamente responsivas incluso con miles de elementos de texto dinámico. -
Enhanced User Experience
Elimina el “thrashing” de la interfaz, los saltos y movimientos bruscos, ofreciendo una experiencia visual fluida y estable, especialmente en feeds de contenido dinámico o interfaces de chat. -
Accurate Layout
Garantiza mediciones de texto precisas que se alinean con el renderizado real del navegador, evitando inconsistencias visuales. -
Simplified Development
Proporciona una API sencilla, nativa de TypeScript, que abstrae los retos complejos de medición de texto, aumentando la productividad del desarrollador. -
Global Application Readiness
El sólido soporte para sistemas de escritura diversos facilita la creación de aplicaciones verdaderamente internacionalizadas. -
Lightweight and Reliable
La ausencia de dependencias externas se traduce en un bundle más pequeño y mayor estabilidad.
Compatibility and Integration
-
Framework-Agnostic
Como biblioteca de JavaScript/TypeScript puro, Pretext.JS puede integrarse sin problemas en cualquier framework web moderno (por ejemplo, React, Vue, Angular, Svelte) o en proyectos con JavaScript “vanilla”. -
Modern Browser Support
Se basa en APIs estándar del navegador disponibles en todos los entornos web modernos. -
Installation
Fácilmente instalable mediante los gestores de paquetes más usados: npm, pnpm y bun. -
TypeScript Integration
El soporte nativo para TypeScript garantiza una integración fluida en proyectos TypeScript sin configuración adicional.
Real-World Applications and Demos
-
Virtual Scroll
Demostración del renderizado de 10,000 filas de altura variable con desplazamiento fluido a 60fps, calculado por completo sin lecturas del DOM. -
AI Chat
Se utiliza para precomputar la altura de las “burbujas” de chat en respuestas de IA en streaming, eliminando desplazamientos de maquetación y movimientos bruscos. -
Internationalization
Muestra una maquetación precisa para feeds de contenido multilingüe que mezclan texto chino, árabe, coreano y latino en una única lista virtualizada. -
Community Showcases
Incluye aplicaciones creativas como efectos de escritura en arena, visualizaciones geométricas de texto y ajuste de texto en objetos 3D en tiempo real, destacando su versatilidad.
Access and Activation Method
-
Installation
- Con npm:
$ npm install @chenglou/pretext - Con pnpm:
$ pnpm add @chenglou/pretext - Con bun:
$ bun add @chenglou/pretext
- Con npm:
-
Usage
- Importa las funciones
prepareylayout:
import { prepare, layout } from '@chenglou/pretext' - Llama a
prepare(text, font)una vez para obtener un handle reutilizable. - Llama a
layout(handle, containerWidth, lineHeight)para obtener al instante la altura y el número de líneas.
- Importa las funciones
-
Exploration
Un playground en vivo y varias demos están disponibles en la web oficial (pretextjs.dev) para pruebas inmediatas y mejor comprensión.