R
Interview Deckreact · next.js · senior/staff
0·0·122
Performance

Web Workers no React

Workers processam código pesado em thread separada sem travar a UI. Comunicação via postMessage + setState.

Web Workers permitem rodar JavaScript em threads separadas do main thread. Não têm acesso ao DOM. Ideais para cálculos pesados (parsing, encriptação, image processing). Comunicação via postMessage/onmessage.

Problema
Cálculos pesados no thread principal travam a UI — scroll, animações e inputs ficam sem resposta.
Solução
Criar Worker no useEffect (uma vez). Enviar via postMessage. Receber resultado e aplicar via setState.
Tip
Nunca criar Worker dentro do render ou de useMemo — cria nova thread a cada render. Sempre useEffect + useRef.
useEffect(() => {
  workerRef.current = new Worker(
    new URL('./worker.js', import.meta.url)
  );
  workerRef.current.onmessage = ({ data }) => setResult(data);
  return () => workerRef.current?.terminate();
}, []);
Q.Worker vs SharedWorker vs Service Worker?
A.Worker: thread por aba. SharedWorker: compartilhado entre abas da mesma origem. Service Worker: roda em background mesmo sem aba aberta, intercepta requests (PWA, offline).
Q.Comlink simplifica Workers?
A.Sim. Comlink (Google) abstrai postMessage/onmessage em chamadas async normais. Você chama worker.heavyFunc(data) como se fosse local, e ele lida com a comunicação por baixo.
Q.Workers podem fazer fetch?
A.Sim, fetch funciona em Workers. Útil para descarregar parsing de respostas grandes (JSON gigante, CSV, etc.) sem travar a UI.
19/122← →