Como Detectar o Ambiente de Execução em JavaScript: Node.js, Browser ou Web Worker
Executar o mesmo código em diferentes ecossistemas pode causar falhas graves ao acessar variáveis globais inexistentes (como window no servidor ou process no navegador). O uso de um snippet de detecção de ambiente resolve essa incompatibilidade ao checar com segurança os objetos globais disponíveis e identificar onde a aplicação está rodando.
JavaScript
/**
* Identifica o ambiente de execução atual do JavaScript.
* @returns {'node' | 'browser' | 'webworker' | 'unknown'} O nome do ambiente detectado.
*/
function detectarAmbiente() {
// Verifica se possui o processo global típico do Node.js
const isNode = typeof process !== 'undefined' &&
process.versions != null &&
process.versions.node != null;
// Verifica se está rodando dentro de um Web Worker
const isWorker = typeof WorkerGlobalScope !== 'undefined' &&
self instanceof WorkerGlobalScope;
// Verifica se está no navegador padrão com acesso ao DOM (window e document)
const isBrowser = typeof window !== 'undefined' &&
typeof window.document !== 'undefined';
if (isNode) return 'node';
if (isWorker) return 'webworker';
if (isBrowser) return 'browser';
return 'unknown';
}
// --- Exemplo Prático de Uso ---
const ambienteAtual = detectarAmbiente();
console.log(`[Runtime] Código executando em ambiente: ${ambienteAtual}`);
if (ambienteAtual === 'node') {
console.log(`Versão do Node.js: ${process.version}`);
} else if (ambienteAtual === 'browser') {
console.log(`URL da página: ${window.location.href}`);
} else if (ambienteAtual === 'webworker') {
console.log('Executando em uma thread de background.');
}
Pontos-chave
- Operador
typeofSeguro: A verificação comtypeofprevine exceções do tipoReferenceErrorao checar variáveis globais que podem não ter sido declaradas no escopo atual. - Ordem das Checagens: Testar
WorkerGlobalScopeantes dewindowprevine falsos positivos, já que Web Workers possuem o objetoself, mas não possuem o objetowindow.document. - Uso em Bibliotecas Isomórficas: Essencial para criar pacotes executáveis tanto no backend quanto no frontend (código universal), permitindo carregar dependências específicas de cada ambiente condicionalmente.
- Atenção com Bundlers: Ferramentas como Webpack ou Vite podem injetar polyfills do
processno navegador; por isso, verificarprocess.versions.nodegarante maior precisão na detecção do Node.js real.
