Pretext.JS Überblick
Pretext.JS ist eine schnelle, reine JavaScript/TypeScript-Text-Layout-Engine, die mehrzeiligen Text vollständig über Arithmetik misst und positioniert, ohne jemals das Document Object Model (DOM) zu berühren. Sie beseitigt den Performance-Engpass der „erzwungenen synchronen Reflows“, wie sie durch klassische DOM-Messungen wie getBoundingClientRect() entstehen, und bietet deutlich schnellere und effizientere Textlayouts. Sie basiert auf dem Prinzip „einmal messen, für immer layouten“, wodurch alle nachfolgenden Layout-Berechnungen praktisch sofort erfolgen.
Hauptzweck
Bereitstellung hochperformanter, präziser und reflow-freier Textlayout-Messungen (wie Höhe und Zeilenanzahl) für dynamische und komplexe Weboberflächen. Sie löst das kritische Performanceproblem des „Browser Thrashing“, das durch wiederholte DOM-Messungen entsteht.
Zielgruppe
Webentwickler und Teams, die performancekritische, textlastige Benutzeroberflächen aufbauen. Dazu gehören Anwendungen mit virtuellen Scroll-Listen, KI-Chat-Interfaces, Code-Editoren, kollaborative Whiteboards, Datenvisualisierungen und alle Szenarien, in denen dynamisches Textlayout flüssig, schnell und reaktiv sein muss, ohne die User Experience zu beeinträchtigen.
Funktionsdetails und Ablauf
Pretext.JS arbeitet in zwei zentralen Schritten:
-
prepare(text, font)
Diese Funktion wird einmal pro Textstring und Schriftstil ausgeführt. Sie normalisiert Leerzeichen, wendet Unicode-Zeilenumbruchregeln an, segmentiert den Text und misst die Vorbreite jedes Segments auf Glyphenebene mithilfe der Canvas-Schrift-Engine des Browsers. Die Ergebnisse werden in einem wiederverwendbaren „Handle“ zwischengespeichert. -
layout(handle, containerWidth, lineHeight)
Diese Funktion ist reine Arithmetik und läuft praktisch verzögerungsfrei. Auf Basis des vorbereiteten Handles, einer Containerbreite und einer Zeilenhöhe berechnet sie Zeilenumbrüche durch Aufsummieren der Segmentbreiten, bestimmt die Gesamtzahl der Zeilen und ermittelt die gesamte Texthöhe. Entscheidend: In diesem Schritt werden keinerlei DOM-Lesezugriffe durchgeführt, sodass keine Reflows entstehen.
Zentrale Fähigkeiten
-
Zero DOM Reads
Nach dem initialenprepare()-Aufruf sind allelayout()-Operationen reine Arithmetik und vermeiden vollständiggetBoundingClientRect(),offsetHeightund erzwungene synchrone Reflows. -
Echte Schriftmetriken
Nutzt die native Canvas-Schrift-Engine des Browsers zur Messung der Glyphenbreiten und garantiert damit Layout-Genauigkeit, die dem tatsächlichen Browser-Rendering entspricht. -
Von Grund auf mehrsprachig
Bietet vollständige Unterstützung für komplexe Schriftsysteme wie CJK (Chinesisch, Japanisch, Koreanisch), Arabisch, Hebräisch, Thai und Hindi – mit korrekter Unicode-Segmentierung und Bidirektionalitätsbehandlung. -
TypeScript-native
Von Grund auf in TypeScript entwickelt und liefert präzise Typen für alle Funktionen, Parameter und Rückgabewerte, ohne dass externe@types-Pakete nötig sind. -
Wiederverwendbare Prepared Handles
Ein einzigerprepare()-Aufruf erzeugt ein Handle, das für Layout-Berechnungen mit unterschiedlichen Containerbreiten (z. B. Mobile, Tablet, Desktop) mit minimalem Overhead wiederverwendet werden kann. -
Zero Runtime Dependencies
Baut ausschließlich auf standardisierten Browser-APIs auf – für ein schlankes Bundle und keine unerwarteten Probleme mit externen Paketen.
Vorteile für Anwender
-
Außergewöhnliche Performance
Erzielt bis zu 500‑fach schnellere Text-Layouts im Vergleich zu klassischen DOM-Methoden und ermöglicht flüssiges Scrolling mit 60 fps sowie hochreaktive UIs, selbst bei Tausenden dynamischer Textelemente. -
Verbesserte User Experience
Beseitigt UI‑„Thrashing“, Layout-Verschiebungen und „Springen“ von Elementen und sorgt für ein ruhiges, stabiles visuelles Erlebnis – insbesondere in dynamischen Feeds oder Chat-Interfaces. -
Präzises Layout
Garantiert exakte Textmessungen, die mit dem tatsächlichen Browser-Rendering übereinstimmen, und verhindert visuelle Inkonsistenzen. -
Vereinfachte Entwicklung
Stellt eine einfache, TypeScript-native API zur Verfügung, die komplexe Herausforderungen bei Textmessungen kapselt und so die Produktivität von Entwicklerteams erhöht. -
Globale Einsatzbereitschaft
Robuste Unterstützung unterschiedlicher Schriftsysteme erleichtert den Aufbau wirklich internationalisierter Anwendungen. -
Leichtgewichtig und zuverlässig
Keine externen Abhängigkeiten bedeuten kleinere Bundle-Größe und höhere Stabilität.
Kompatibilität und Integration
-
Framework-agnostisch
Als reine JavaScript/TypeScript-Bibliothek lässt sich Pretext.JS nahtlos in jedes moderne Webframework (z. B. React, Vue, Angular, Svelte) oder in Projekte mit Vanilla JavaScript integrieren. -
Support für moderne Browser
Stützt sich auf Standard-Browser-APIs, die in allen modernen Webumgebungen verfügbar sind. -
Installation
Einfache Installation über gängige Paketmanager: npm, pnpm und bun. -
TypeScript-Integration
Native TypeScript-Unterstützung gewährleistet eine reibungslose Einbindung in TypeScript-Projekte ohne zusätzliche Konfiguration.
Echte Anwendungsfälle und Demos
-
Virtuelles Scrolling
Demonstriert das Rendern von 10.000 Zeilen variabler Höhe mit flüssigen 60 fps – vollständig ohne DOM-Lesezugriffe berechnet. -
KI-Chat
Wird verwendet, um Chatblasen-Höhen für gestreamte KI-Antworten vorab zu berechnen und Layout-Verschiebungen sowie Sprünge zu verhindern. -
Internationalisierung
Zeigt präzise Layouts für mehrsprachige Content-Feeds, die Chinesisch, Arabisch, Koreanisch und lateinische Schriften in einer einzigen virtualisierten Liste kombinieren. -
Community-Showcases
Präsentiert kreative Anwendungen wie Sand-Schreibeffekte, geometrische Textvisualisierungen und Echtzeit-Textumfluss um 3D-Objekte – ein Beleg für die Vielseitigkeit der Bibliothek.
Zugriff und Aktivierung
-
Installation
- Mit npm:
$ npm install @chenglou/pretext - Mit pnpm:
$ pnpm add @chenglou/pretext - Mit bun:
$ bun add @chenglou/pretext
- Mit npm:
-
Verwendung
prepare- undlayout-Funktionen importieren:
import { prepare, layout } from '@chenglou/pretext'prepare(text, font)einmal aufrufen, um ein wiederverwendbares Handle zu erhalten.layout(handle, containerWidth, lineHeight)aufrufen, um Höhe und Zeilenanzahl sofort zu berechnen.
-
Erkunden
Ein Live-Playground und verschiedene Demos stehen auf der offiziellen Website (pretextjs.dev) für direktes Testen und Verständnis bereit.