Visão geral do Pretext.JS
Pretext.JS é um mecanismo rápido de layout de texto em JavaScript/TypeScript puro, projetado para medir e posicionar texto multilinha inteiramente por meio de aritmética, sem tocar no Document Object Model (DOM). Ele elimina o gargalo de desempenho dos “forced synchronous reflows” causados por medições tradicionais de DOM como getBoundingClientRect(), oferecendo um layout de texto muito mais rápido e eficiente. É baseado no princípio “measure once, lay out forever”, tornando instantâneas as cálculos de layout subsequentes.
Objetivo principal
Fornecer medições de layout de texto altamente performáticas, precisas e livres de reflow (como altura e contagem de linhas) para interfaces web dinâmicas e complexas. Ele resolve o problema crítico de desempenho de “browser thrashing” causado por medições repetidas do DOM.
Público-alvo
Desenvolvedores web e equipes que constroem interfaces de usuário com requisitos críticos de desempenho e grandes volumes de texto. Isso inclui aplicações com listas de scroll virtual, interfaces de chat de IA, editores de código, quadros brancos colaborativos, visualizações de dados e qualquer cenário em que o layout de texto dinâmico precise ser suave, rápido e responsivo sem comprometer a experiência do usuário.
Detalhes de função e operação
Pretext.JS opera em duas etapas centrais:
-
prepare(text, font)
Esta função é executada uma vez para uma determinada string de texto e estilo de fonte. Ela normaliza espaços em branco, aplica as regras de quebra de linha Unicode, segmenta o texto e mede com precisão a largura de avanço dos glifos de cada segmento usando o mecanismo de fontes do Canvas do navegador. Os resultados são armazenados em cache em um “handle” reutilizável. -
layout(handle, containerWidth, lineHeight)
Esta função é puramente aritmética e roda instantaneamente. Dado o handle preparado, uma largura de contêiner e uma altura de linha, ela calcula as quebras de linha somando as larguras dos segmentos, obtém o número total de linhas e determina a altura total do texto. Fundamentalmente, essa etapa não realiza nenhuma leitura de DOM, garantindo ausência de reflows.
Principais capacidades
-
Zero leituras de DOM
Após a chamada inicial deprepare(), todas as operações delayout()são puramente aritméticas, evitando completamentegetBoundingClientRect(),offsetHeighte forced synchronous reflows. -
Métricas de fonte reais
Utiliza o mecanismo de fontes nativo do Canvas do navegador para medir as larguras dos glifos, garantindo um layout de texto que corresponde fielmente à renderização real do navegador. -
Multilíngue por design
Oferece suporte completo a sistemas de escrita complexos, incluindo CJK (chinês, japonês, coreano), árabe, hebraico, tailandês e híndi, com segmentação Unicode correta e tratamento de texto bidirecional. -
TypeScript-nativo
Desenvolvido desde o início em TypeScript, oferecendo tipos precisos para todas as funções, parâmetros e valores de retorno, sem exigir pacotes@typesexternos. -
Handles preparados reutilizáveis
Uma única chamada deprepare()gera um handle que pode ser reutilizado para calcular o layout em várias larguras de contêiner (por exemplo, mobile, tablet, desktop) com sobrecarga mínima. -
Zero dependências em tempo de execução
Construído inteiramente sobre APIs padrão do navegador, garantindo bundle enxuto e ausência de problemas inesperados com pacotes externos.
Benefícios para o usuário
-
Desempenho excepcional
Alcança até 500x mais velocidade no layout de texto em comparação com métodos tradicionais baseados em DOM, permitindo scroll suave a 60fps e UIs altamente responsivas mesmo com milhares de elementos de texto dinâmicos. -
Experiência do usuário aprimorada
Elimina “thrashing” na UI, deslocamentos e instabilidade visual, proporcionando uma experiência fluida e estável, especialmente em feeds de conteúdo dinâmico ou interfaces de chat. -
Layout preciso
Garante medições de texto exatas, alinhadas com a renderização real do navegador, evitando inconsistências visuais. -
Desenvolvimento simplificado
Oferece uma API direta, TypeScript-nativa, que abstrai os desafios complexos de medição de texto, aumentando a produtividade do desenvolvedor. -
Pronto para aplicações globais
O suporte robusto a diversos sistemas de escrita facilita a criação de aplicações verdadeiramente internacionalizadas. -
Leve e confiável
A ausência de dependências externas resulta em um bundle menor e maior estabilidade.
Compatibilidade e integração
-
Agnóstico de framework
Como biblioteca em JavaScript/TypeScript puro, Pretext.JS pode ser integrado sem esforço a qualquer framework web moderno (por exemplo, React, Vue, Angular, Svelte) ou projeto em JavaScript puro. -
Suporte a navegadores modernos
Baseia-se em APIs padrão disponíveis em todos os ambientes de navegador modernos. -
Instalação
Fácil de instalar via gerenciadores de pacotes populares: npm, pnpm e bun. -
Integração com TypeScript
O suporte nativo a TypeScript garante integração fluida em projetos TypeScript sem configuração adicional.
Aplicações reais e demos
-
Virtual Scroll
Demonstra a renderização de 10.000 linhas de altura variável com scroll suave a 60fps, calculadas inteiramente sem leituras de DOM. -
AI Chat
Utilizado para pré-calcular alturas de balões de chat para respostas de IA em streaming, eliminando mudanças de layout e instabilidade. -
Internacionalização
Mostra layout preciso para feeds de conteúdo multilíngue misturando texto em chinês, árabe, coreano e latino em uma única lista virtualizada. -
Showcases da comunidade
Apresenta aplicações criativas como efeitos de escrita na areia, visualizações geométricas de texto e text wrapping em objetos 3D em tempo real, destacando sua versatilidade.
Método de acesso e ativação
-
Instalação
- Usando npm:
$ npm install @chenglou/pretext - Usando pnpm:
$ pnpm add @chenglou/pretext - Usando bun:
$ bun add @chenglou/pretext
- Usando npm:
-
Uso
- Importe as funções
prepareelayout:
import { prepare, layout } from '@chenglou/pretext' - Chame
prepare(text, font)uma vez para obter um handle reutilizável. - Chame
layout(handle, containerWidth, lineHeight)para obter instantaneamente a altura e a contagem de linhas.
- Importe as funções
-
Exploração
Um playground ao vivo e vários demos estão disponíveis no site oficial (pretextjs.dev) para testes imediatos e melhor entendimento.