Pretext.JS Overview
Pretext.JS est un moteur de mise en page de texte rapide, pur JavaScript/TypeScript, conçu pour mesurer et positionner du texte multiligne uniquement par le calcul arithmétique, sans jamais toucher au Document Object Model (DOM). Il élimine le goulet d’étranglement de performances des « reflows synchrones forcés » causés par les mesures DOM traditionnelles comme getBoundingClientRect(), offrant une mise en page du texte nettement plus rapide et plus efficace. Il repose sur le principe « mesurer une fois, mettre en page pour toujours », ce qui rend les calculs de mise en page ultérieurs instantanés.
Objectif principal
Fournir des mesures de mise en page de texte extrêmement performantes, précises et sans reflow (comme la hauteur et le nombre de lignes) pour des interfaces web dynamiques et complexes. Pretext.JS résout le problème critique de performances lié au « browser thrashing » provoqué par des mesures DOM répétées.
Groupe cible d’utilisateurs
Les développeurs web et les équipes qui construisent des interfaces utilisateur textuelles sensibles aux performances. Cela inclut les applications avec listes à défilement virtuel, interfaces de chat IA, éditeurs de code, tableaux blancs collaboratifs, visualisations de données, et tout scénario où la mise en page de texte dynamique doit rester fluide, rapide et réactive sans compromettre l’expérience utilisateur.
Détails des fonctions et fonctionnement
Pretext.JS opère en deux étapes fondamentales :
-
prepare(text, font)
Cette fonction ne s’exécute qu’une seule fois pour une chaîne de texte et un style de police donnés. Elle normalise les espaces, applique les règles de coupure de ligne Unicode, segmente le texte, et mesure précisément la largeur d’avance des glyphes de chaque segment à l’aide du moteur de police Canvas du navigateur. Les résultats sont mis en cache dans un « handle » réutilisable. -
layout(handle, containerWidth, lineHeight)
Cette fonction est purement arithmétique et s’exécute instantanément. À partir du handle préparé, d’une largeur de conteneur et d’une hauteur de ligne, elle calcule les retours à la ligne en additionnant les largeurs des segments, détermine le nombre total de lignes et calcule la hauteur globale du texte. Point crucial : cette étape ne lit jamais le DOM, garantissant zéro reflow.
Fonctionnalités clés
-
Aucune lecture du DOM
Après l’appel initial àprepare(), toutes les opérationslayout()sont purement arithmétiques, évitant totalementgetBoundingClientRect(),offsetHeightet les reflows synchrones forcés. -
Vraies métriques de police
Exploite le moteur de police natif Canvas du navigateur pour mesurer la largeur des glyphes, garantissant une exactitude de mise en page conforme au rendu réel du navigateur. -
Multilingue par conception
Fournit un support complet pour les systèmes d’écriture complexes, notamment CJK (chinois, japonais, coréen), arabe, hébreu, thaï et hindi, avec segmentation Unicode correcte et gestion du texte bidirectionnel. -
Natif TypeScript
Développé nativement en TypeScript, avec des types précis pour toutes les fonctions, paramètres et valeurs de retour, sans nécessiter de paquets@typesexternes. -
Handles préparés réutilisables
Un seul appel àprepare()génère un handle qui peut être réutilisé pour calculer la mise en page sur diverses largeurs de conteneur (par exemple mobile, tablette, desktop) avec un surcoût minimal. -
Zéro dépendance à l’exécution
Construit entièrement sur les API standard du navigateur, garantissant un bundle léger et aucun problème inattendu lié à des paquets externes.
Avantages pour l’utilisateur
-
Performances exceptionnelles
Offre jusqu’à 500× plus de rapidité pour la mise en page du texte par rapport aux méthodes DOM traditionnelles, permettant un défilement fluide à 60 fps et des interfaces ultra réactives même avec des milliers d’éléments textuels dynamiques. -
Expérience utilisateur améliorée
Élimine le « thrashing » de l’UI, les décalages et les sautillements, pour une expérience visuelle fluide et stable, en particulier dans les flux de contenus dynamiques ou les interfaces de chat. -
Mise en page précise
Garantit des mesures de texte exactes, alignées sur le rendu réel du navigateur, évitant les incohérences visuelles. -
Développement simplifié
Propose une API simple, native TypeScript, qui masque la complexité des mesures de texte et augmente la productivité des développeurs. -
Prêt pour les applications globales
Un support robuste des systèmes d’écriture variés facilite la création d’applications réellement internationalisées. -
Léger et fiable
L’absence de dépendances externes se traduit par un bundle plus petit et une plus grande stabilité.
Compatibilité et intégration
-
Agnostique aux frameworks
En tant que bibliothèque JavaScript/TypeScript pure, Pretext.JS s’intègre facilement à n’importe quel framework web moderne (par exemple React, Vue, Angular, Svelte) ou à un projet JavaScript vanilla. -
Support des navigateurs modernes
S’appuie sur les API standard disponibles dans tous les environnements web modernes. -
Installation
Installation facile via les gestionnaires de paquets populaires : npm, pnpm et bun. -
Intégration TypeScript
Le support TypeScript natif assure une intégration fluide dans les projets TypeScript sans configuration supplémentaire.
Cas d’usage réels et démos
-
Virtual Scroll
Démonstration du rendu de 10 000 lignes de hauteur variable avec un défilement fluide à 60 fps, calculé entièrement sans lecture du DOM. -
Chat IA
Utilisé pour pré-calculer la hauteur des bulles de chat pour des réponses IA en streaming, supprimant les décalages de mise en page et les sautillements. -
Internationalisation
Montre une mise en page précise pour des flux de contenus multilingues mélangeant texte chinois, arabe, coréen et latin dans une seule liste virtualisée. -
Exemples de la communauté
Met en avant des applications créatives comme des effets d’écriture dans le sable, des visualisations géométriques de texte et de l’habillage de texte en temps réel autour d’objets 3D, illustrant la polyvalence de Pretext.JS.
Méthode d’accès et d’activation
-
Installation
- Avec npm :
$ npm install @chenglou/pretext - Avec pnpm :
$ pnpm add @chenglou/pretext - Avec bun :
$ bun add @chenglou/pretext
- Avec npm :
-
Utilisation
- Importer les fonctions
prepareetlayout:
import { prepare, layout } from '@chenglou/pretext' - Appeler
prepare(text, font)une fois pour obtenir un handle réutilisable. - Appeler
layout(handle, containerWidth, lineHeight)pour obtenir instantanément la hauteur et le nombre de lignes.
- Importer les fonctions
-
Exploration
Un playground en ligne et diverses démos sont disponibles sur le site officiel (pretextjs.dev) pour tester et comprendre immédiatement Pretext.JS.