No desenvolvimento web, a natureza monofilamento do JavaScript pode limitar o desempenho em tarefas intensivas de cálculo. Web Workers surgem como uma solução essencial para processar operações pesadas em segundo pleno, mantendo a interface do usuário responsiva.
O que é um Web Worker
Web Workers é uma tecnologia introduzida pelo HTML5 que possibilita a execução de scripts em threads separados do thread principal do navegador. Isso permite que operações demoradas ocorram paralelamente, sem bloquear a interface gráfica.
Características dos Web Workers
- Thread independente: rodam em um contexto isolado, separados do thread principal.
- Acesso restrito ao DOM: não é possível manipular elementos da página diretamente.
- Comunicação via mensagens: a troca de dados entre o worker e o script principal é feita com métodos como postMessage e onmessage.
- Ideal para tarefas computacionalmente pesadas: como processamento de grandes volumes de dados ou cálculos complexos.
Exemplo Prático de Utilização
A seguir, demonstramos como empregar um Web Worker para calcular a média de uma grande lista de números, mantendo a página interativa durante o processamento.
Estrutura do Projeto
O exemplo inclui um arquivo HTML para a interface, um script principal para controle, e um script do worker para a lógica de cálculo.
Arquivo index.html
<html lang="pt">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Exemplo de Web Worker</title>
</head>
<body>
<h1>Web Worker: Cálculo de Média</h1>
<button id="iniciar">Iniciar Cálculo</button>
<p id="resultado"></p>
<script src="app.js"></script>
</body>
</html>
Arquivo app.js
// Seleciona elementos do DOM
const botaoIniciar = document.getElementById('iniciar');
const campoResultado = document.getElementById('resultado');
// Instancia o Web Worker
const workerProcesso = new Worker('calculo.js');
// Escuta respostas do worker
workerProcesso.onmessage = function (evento) {
const media = evento.data;
campoResultado.textContent = `A média calculada é: ${media}`;
};
// Trata erros do worker
workerProcesso.onerror = function (erro) {
console.error('Falha no worker:', erro.message);
campoResultado.textContent = 'Erro durante o cálculo. Tente novamente.';
};
// Ao clicar no botão, envia dados para o worker
botaoIniciar.addEventListener('click', () => {
// Gera uma lista com 10 milhões de números aleatórios
const dadosNumericos = Array.from({ length: 10000000 }, () => Math.random() * 1000);
// Envia os dados para o worker
workerProcesso.postMessage(dadosNumericos);
// Atualiza a interface
campoResultado.textContent = 'Processando... Aguarde.';
});
Arquivo calculo.js
// Recebe mensagens do script principal
self.onmessage = function (evento) {
const valores = evento.data; // Obtém os dados enviados
// Calcula a média dos valores
const total = valores.reduce((acumulador, item) => acumulador + item, 0);
const mediaCalculada = total / valores.length;
// Envia o resultado de volta
self.postMessage(mediaCalculada);
};
Conceitos Chave
- Criação do worker:
new Worker('arquivo.js')inicializa uma instância. - Escuta de mensagens: utilize
worker.onmessagepara capturar respostas. - Tratamento de erros: implemente
worker.onerrorpara falhas no worker. - Envio de dados: chame
worker.postMessage(dados)para transmitir informações. - Encerramento: finalize com
worker.terminate()quando não for mais necessário. - Dentro do worker: use
self.onmessagepara receber dados eself.postMessagepara responder.