Introdução: O Problema do Escopo Global
Se você programa em JavaScript há algum tempo, conhece a dor da poluição do escopo global. Cada framework, biblioteca ou polyfill que você adiciona ao projeto tem o potencial de colidir com seu próprio código. Esse é um problema fundamental que assombra a linguagem desde o seu início.
Mas e se você pudesse criar uma "sala limpa" para o seu código? Um lugar onde você pode executar JavaScript sem se preocupar com interferências do mundo externo? É exatamente isso que a nova proposta ShadowRealm visa resolver.
Neste guia, vamos mergulhar na API ShadowRealm, explorar seus casos de uso e entender como ela pode revolucionar a forma como escrevemos e testamos aplicações JavaScript.

O que é um ShadowRealm?
Um ShadowRealm é um novo tipo de realm em JavaScript que fornece um ambiente isolado para executar código. Diferente de uma aba do navegador ou de um Web Worker, um ShadowRealm não tem thread própria. Em vez disso, ele roda na mesma thread do código que o criou, mas com um objeto global completamente separado.
Vamos ver um exemplo simples:
// Cria um ShadowRealm
const shadow = new ShadowRealm();
// Define uma função global no realm externo
function funcaoGlobal() {};
// Verifica se ela existe no objeto global do realm externo
console.log(globalThis.funcaoGlobal); // Resultado: function funcaoGlobal()
// Verifica se ela existe no objeto global do ShadowRealm
console.log(shadow.evaluate('globalThis.funcaoGlobal')); // Resultado: undefined
Como você pode ver, a funcaoGlobal definida no realm externo não está disponível dentro do ShadowRealm. O objeto global do ShadowRealm permanece intacto, não importa o que aconteça lá fora.

Considerações de Segurança e Limitações
Embora os ShadowRealms sejam incrivelmente poderosos, eles não são um limite de segurança. O código executado dentro de um ShadowRealm ainda pode fazer inferências sobre o realm externo. Eles são, no entanto, um limite de integridade, o que significa que o código dentro de um ShadowRealm não pode interferir diretamente no realm externo, a menos que seja explicitamente permitido.
Limitações Principais
- Sem isolamento de segurança real: Código malicioso pode acessar dados sensíveis se conseguir inferi-los.
- Sem thread separada: O código roda na mesma thread, então cálculos pesados ainda vão bloquear a thread principal.
- Restrições de CSP: O método
evaluateestá sujeito à regraunsafe-evalda Content Security Policy.
Casos de Uso Práticos
- Testes: Execute suítes de teste em um ambiente limpo para evitar interferências do estado global.
- Sistemas de plugins: Execute código de terceiros em um ambiente sandbox.
- Avaliação de código: Avalie código gerado pelo usuário com segurança, sem poluir o escopo global principal.

Conclusão: O Futuro do Isolamento em JavaScript
A API ShadowRealm ainda está em fase de proposta (Estágio 2.7), mas representa um passo significativo na evolução do JavaScript. Ao fornecer uma maneira simples de executar código isoladamente, ela abre novas possibilidades para testes, sistemas de plugins e execução segura de código.
Como qualquer nova API, é essencial entender suas limitações. ShadowRealms não são uma bala de prata para segurança, mas são uma ferramenta poderosa para manter a integridade do código.
Próximos Passos para Aprender
- Acompanhe a proposta do TC39: Fique de olho na proposta ShadowRealm para atualizações.
- Experimente com polyfills: Existem polyfills disponíveis que você pode usar para testar a API hoje.
- Explore conceitos relacionados: Veja Web Workers e sandboxing de
iframepara entender diferentes estratégias de isolamento.
Junto com tendências relacionadas, como testes just-in-time e a implementação de AV1 da Meta, o ShadowRealm faz parte de um movimento maior em direção a ambientes JavaScript mais robustos e isolados.