O que é Progressive JSON?
Progressive JSON é uma abordagem para transmitir e processar dados JSON de forma incremental, permitindo que o cliente consuma partes do JSON à medida que elas chegam, sem precisar esperar o documento inteiro ser carregado. O objetivo é melhorar a experiência do usuário e a performance em cenários onde o JSON é muito grande ou gerado dinamicamente, como APIs de streaming, dashboards de dados ou aplicações em tempo real.
Por que Progressive JSON é necessário?
Imagine que você está desenvolvendo uma aplicação que consome um relatório gigante ou um feed de dados em tempo real. Se você esperar o JSON inteiro ser gerado e transferido para só então começar a processar, o usuário pode ficar esperando vários segundos (ou até minutos!). Com Progressive JSON, você pode começar a exibir informações parciais imediatamente, enquanto o restante dos dados ainda está sendo processado e enviado pelo servidor.
Como Progressive JSON funciona na prática?
A ideia é dividir o JSON em partes menores (chunks) e transmiti-las ao cliente conforme ficam prontas. O cliente, por sua vez, vai processando cada parte assim que ela chega, atualizando a interface de forma incremental. Isso pode ser feito usando streams HTTP, WebSockets ou qualquer protocolo que suporte transmissão contínua de dados.
Exemplo prático de uso
Vamos supor que você tem uma API que retorna uma lista de usuários muito grande. Em vez de esperar tudo ficar pronto, o servidor pode ir enviando cada usuário como um chunk separado:
No servidor (Node.js/Express):
import express from 'express';
const app = express();
app.get('/api/progressive-users', (req, res) => {
res.setHeader('Content-Type', 'application/json');
res.setHeader('Transfer-Encoding', 'chunked');
res.write('['); // Início do array
let first = true;
const users = getBigUserList(); // Imagine uma função que retorna milhares de usuários
users.forEach((user, idx) => {
setTimeout(() => {
if (!first) res.write(',');
res.write(JSON.stringify(user));
first = false;
if (idx === users.length - 1) res.end(']');
}, idx * 100); // Simula envio progressivo
});
});
function getBigUserList() {
// Exemplo simplificado
return Array.from({ length: 5 }, (_, i) => ({ id: i + 1, name: `User ${i + 1}` }));
}
app.listen(3000, () => console.log('Servidor rodando na porta 3000'));
Exemplo de consumo progressivo em TypeScript
No cliente, você pode consumir esse JSON progressivamente usando a API de streams do navegador:
async function fetchProgressiveUsers(url: string, onUser: (user: any) => void) {
const response = await fetch(url);
const reader = response.body?.getReader();
const decoder = new TextDecoder();
let buffer = '';
let insideArray = false;
if (!reader) throw new Error('No stream available');
while (true) {
const { done, value } = await reader.read();
if (done) break;
buffer += decoder.decode(value, { stream: true });
// Processa cada usuário individualmente
let match;
const regex = /{[^}]+}/g;
while ((match = regex.exec(buffer)) !== null) {
const user = JSON.parse(match[0]);
onUser(user);
}
}
}
// Uso:
fetchProgressiveUsers('/api/progressive-users', (user) => {
console.log('Usuário recebido:', user);
});
Ferramentas e bibliotecas úteis
Se você quer algo mais robusto, pode usar bibliotecas como stream-json
ou JSONStream
no Node.js para processar grandes volumes de dados JSON de forma eficiente e baseada em eventos.
Exemplo com stream-json
:
import { parser } from 'stream-json';
import { streamArray } from 'stream-json/streamers/StreamArray';
import * as fs from 'fs';
fs.createReadStream('usuarios.json')
.pipe(parser())
.pipe(streamArray())
.on('data', ({ value }) => {
console.log('Usuário:', value);
});
Vantagens do Progressive JSON
- Experiência do usuário melhor: O usuário vê dados aparecendo na tela imediatamente, sem esperar o carregamento completo.
- Menor uso de memória: Não é preciso carregar o JSON inteiro na memória, útil para arquivos grandes.
- Resiliência: Se houver falha no meio do caminho, parte dos dados já foi processada.
- Escalabilidade: Permite processar e exibir dados em tempo real, ideal para dashboards, feeds e relatórios extensos.
Conclusão
Progressive JSON é uma solução elegante para cenários onde o volume de dados é grande ou a latência importa. Ele permite que aplicações web e APIs sejam mais responsivas, escaláveis e eficientes, aproveitando streams e processamento incremental. Se você trabalha com grandes volumes de dados ou quer melhorar a experiência do usuário, vale a pena experimentar!
Top comments (0)