Signals de granularidade fina
Signals, memos e effects com atualizações em lote e consistentes.
Veloz é uma biblioteca de interface reativa em que os signals atualizam exatamente os nós do DOM que dependem deles. Sem DOM virtual, sem re-render: componentes rodam uma vez.
npm install @velozjs/domDOM renderizado
<h4>Resumo do pedido0 atualizações<p>2 itens × R$ 24,000 atualizações<p>Subtotal R$ 48,000 atualizações<p>Desconto —0 atualizações<p>Frete R$ 9,000 atualizações<strong>Total R$ 57,000 atualizaçõesO componente rodou 1 vez. Cada linha conta as próprias atualizações no DOM.
Mude o pedido. Só as linhas cujo texto muda acendem.
Um componente é uma função que monta DOM de verdade e o devolve. O que muda depois são as funções que você coloca no JSX: cada uma vira uma região viva ligada aos signals que ela lê.
{count} ou {() => a() + b()} atualizam; valores lidos no corpo do componente, não.access().import { render, createSignal, createMemo } from '@velozjs/dom';
function Counter() {
console.log('runs once');
const [count, setCount] = createSignal(0);
const doubled = createMemo(() => count() * 2);
return (
<button onClick={() => setCount((c) => c + 1)}>
{count} × 2 = {doubled}
</button>
);
}
render(() => <Counter />, document.body);Signals, memos e effects com atualizações em lote e consistentes.
renderToString no servidor, hydrate no cliente, mesmos componentes.
createResource com Suspense, ErrorBoundary e dados entregues à hidratação.
css, styled e a prop css, compatível com CSP e coletado no SSR.
Texto nunca vira HTML, URLs e nomes de atributo são validados, innerHTML é sanitizado.
Só ESM, TypeScript em primeiro lugar, sem dependências em tempo de execução.
Leia um recurso dentro do Suspense e o fallback aparece até a primeira carga terminar. Recargas mantêm o conteúdo na tela; falhas vão para o ErrorBoundary mais próximo. No servidor, o renderToStringAsync espera os dados e os entrega ao hydrate().
const [user] = createResource(userId, (id) =>
fetch(`/api/users/${id}`).then((r) => r.json())
);
<Suspense fallback={<Spinner />}>
{() => <h2>{() => user()?.name}</h2>}
</Suspense>Nada carregado ainda. O recurso só busca quando a fonte é definida.
Cada página daqui é renderizada em HTML pelo @velozjs/ssr no build e estilizada com o salve-css. Só as partes interativas (o playground, a demo assíncrona, o botão de tema e o menu) são hidratadas, então o resto chega sem JavaScript.
Guia de renderização no servidorhydrate() reaproveita esses elementos, liga eventos e effects e remove as chaves.@velozjs/coreSignals, memos, effects, recursos, contexto. Sem DOM.@velozjs/domRuntime JSX, render, hydrate, controle de fluxo, sanitizador.@velozjs/csscss``, styled() e a prop css, com coleta no SSR.@velozjs/ssrrenderToString, renderToStringAsync, renderToStream.vite-plugin-velozConfiguração do JSX e resolução de módulos no SSR para o Vite.Instale o pacote, adicione o plugin do Vite, escreva JSX.