Imagine um cenário onde você precisa executar código JavaScript vindo de fontes externas – seja um plugin de terceiros, um script de usuário ou até mesmo uma função maliciosa testada em ambiente controlado. Até hoje, as soluções disponíveis (como iframes, Web Workers ou realms personalizados) sempre vinham com limitações severas: perda de acesso ao DOM, overhead de comunicação ou complexidade de implementação. A nova API ShadowRealm promete mudar esse jogo.

Proposta originalmente no TC39 e já em fase de implementação em navegadores modernos, a ShadowRealm oferece um ambiente de execução verdadeiramente isolado – uma “realidade paralela” para o JavaScript. Esqueça gambiarras com iframes ou contextos de eval. Agora você pode executar código arbitrário com total isolamento de escopo, segurança reforçada e sem sacrificar a performance.

Neste artigo, vamos mergulhar fundo no que é a ShadowRealm, como ela funciona na prática e por que ela representa um avanço crucial para o desenvolvimento web moderno. Se você trabalha com sistemas de plugins, renderização no servidor, ou simplesmente quer proteger seu código de terceiros, continue lendo.


O que é uma Realidade (Realm) no JavaScript?

Antes de entendermos a ShadowRealm, precisamos revisar o conceito de realm no JavaScript. Um realm é basicamente um contexto de execução independente que possui seu próprio escopo global, protótipos e objetos intrínsecos. Por exemplo, o objeto globalThis em um iframe é diferente do da janela pai. Cada documento HTML, cada iframe, cada worker tem seu próprio realm.

O problema é que, até agora, criar um realm isolado exigia a criação de um iframe (com todos os custos de carregamento de recursos, CSS e DOM) ou recorrer a APIs como eval e Function – que compartilham o mesmo escopo global do código hospedeiro, abrindo portas para ataques e vazamentos de dados.

“ShadowRealm é o primeiro mecanismo nativo do JavaScript que cria um contexto totalmente isolado sem precisar de elementos DOM ou processos separados.”

ℹ️ Saiba mais: A especificação do ShadowRealm está no estágio 3 do TC39, o que significa que já é estável e pronta para ser implementada. Você pode acompanhar o progresso no repositório oficial do ECMAScript.

Como funciona a API ShadowRealm?

A API é surpreendentemente simples. Você cria uma instância de ShadowRealm e, a partir dela, pode executar código ou importar módulos em um ambiente completamente independente. O realm filho não tem acesso ao objeto global do pai, nem ao DOM, nem a qualquer recurso que não tenha sido explicitamente passado.

Principais métodos

  1. new ShadowRealm() – Cria um novo contexto isolado.
  2. realm.evaluate(source) – Executa uma string de código JavaScript no contexto do shadow realm e retorna o resultado. O código não tem acesso ao realm pai.
  3. realm.importValue(specifier, bindingName) – Importa um módulo (via URL) e retorna o valor exportado de um binding específico, também dentro do shadow realm.

Vamos a um exemplo prático:

// Cria um shadow realm
const realm = new ShadowRealm();

// Executa código simples
const resultado = realm.evaluate('2 + 2');
console.log(resultado); // 4

// O código no shadow realm não pode acessar o globalThis do pai
realm.evaluate('globalThis.segredo = "não vaza"');
console.log(typeof globalThis.segredo); // undefined
💡 Dica: O método evaluate é síncrono e executa o código no mesmo thread, mas em um contexto de escopo diferente. Para tarefas pesadas, considere usar Workers.

Importando módulos com segurança

Uma das funcionalidades mais poderosas é importValue. Você pode carregar um módulo externo (por exemplo, uma biblioteca de terceiros) e usar apenas as funções que precisa, sem que o módulo tenha acesso ao seu ambiente.

const saudacao = await realm.importValue('./saudacao.js', 'default');
console.log(saudacao('Mundo')); // Olá, Mundo

// O módulo importado não pode acessar window, document ou seu código

Isso é perfeito para sistemas de plugins onde você quer permitir que desenvolvedores terceiros rodem código no seu site sem comprometer a segurança.


Casos de uso reais para ShadowRealm

A versatilidade da API abre portas para várias aplicações no dia a dia do desenvolvimento web:

  • Sistemas de plugins seguros – Deixe que usuários escrevam scripts customizados (como em editores de site, CRMs ou ferramentas low-code) sem medo de ataques XSS ou roubo de dados.
  • Renderização no servidor (SSR) isolada – Execute componentes JavaScript em runtime Node.js sem poluir o escopo global, ideal para frameworks como Next.js ou Nuxt.
  • Testes de código malicioso (sandbox) – Analise scripts suspeitos em um ambiente controlado, sem colocar em risco seu sistema principal.
  • Polyfills e transpilers dinâmicos – Execute Babel ou TypeScript em runtime sem vazar variáveis para o escopo da aplicação.
  • Calculadoras e expressões matemáticas – Substitua o perigoso eval por realm.evaluate para avaliar expressões de usuário com segurança.
✅ Resultado: Com ShadowRealm, você elimina o risco de códigos não confiáveis acessarem cookies, tokens de autenticação ou manipular o DOM da página principal.

Comparativo: ShadowRealm vs. Alternativas

Para entender as vantagens, veja a tabela comparativa com as abordagens tradicionais:

Método Isolamento Performance Acesso ao DOM Facilidade de uso
eval() / Function() Nenhum Alta Total (perigoso) Fácil
Iframe (sandbox) Bom Média (carrega recursos) Nenhum (a menos que configurado) Complexa
Web Worker Excelente Alta (thread separada) Nenhum Média (comunicação via postMessage)
ShadowRealm Excelente Alta (síncrono, sem overhead de recursos) Nenhum (por design) Muito fácil

Como dá para ver, a ShadowRealm combina o melhor de todos os mundos: isolamento forte, performance semelhante a eval e simplicidade de uso.

⚠️ Atenção: Apesar do isolamento, a ShadowRealm ainda executa código no mesmo thread. Se o código for malicioso e causar um loop infinito, ele travará a página. Para bloquear isso, combine com técnicas de timeout ou Web Workers.

Status atual e suporte nos navegadores

A especificação está no estágio 3 desde 2022 e já conta com implementações iniciais. O Google Chrome começou a suportar ShadowRealm a partir da versão 105 (com flag experimental), e o Firefox está desenvolvendo a funcionalidade. Para testar hoje, você pode ativar as flags:

  • Chrome: chrome://flags/#enable-experimental-web-platform-features
  • Edge: similar ao Chrome.
  • Safari: ainda não há suporte (status: “Under Consideration”).

Felizmente, existem polyfills que simulam o comportamento usando Proxy e WeakMap, como o shadow-realm-polyfill. Isso permite que você já comece a usar a API em produção com fallback.


Conclusão: Hora de banir o JavaScript não confiável para o ShadowRealm

A API ShadowRealm representa um salto qualitativo na segurança e no design de software web. Finalmente temos uma maneira nativa, leve e segura de executar código JavaScript isolado sem precisar recorrer a iframes ou Workers. Se você desenvolve sistemas que aceitam scripts de terceiros, plugins, ou simplesmente quer proteger seu código de avaliação dinâmica, essa é a ferramenta que faltava.

Aplique a ShadowRealm hoje mesmo nos seus projetos experimentais. Comece com um polyfill, explore os casos de uso e prepare-se para quando o suporte nativo se tornar universal. O futuro do JavaScript é mais seguro – e agora, mais isolado.

“Com ShadowRealm, o código não confiável vai para o exílio – e você fica em paz.”

👉 Gostou do conteúdo? Compartilhe com sua equipe de desenvolvimento e experimente criar um sandbox simples com ShadowRealm. Nos comentários, conte qual caso de uso você pretende implementar primeiro!

Jonas Nunes
Escrito por Jonas Nunes

Com mais de 5 anos trabalhando com desenvolvimento web, design e marketing digital, já passei por projetos dos mais variados, desde sites e e-commerces até landing pages focadas em vendas e conversão. Um dos meus trabalhos mais marcantes e atual é na V4 Company, na unidade top 2 do ranking nacional, onde mergulhei de vez no universo de assessoria de marketing e criativos que realmente geram resultado. Hoje, além dos projetos, também sou professor do curso Web & Design, ensinando pessoas a entrarem no mercado digital com confiança. Trabalho com PHP, WordPress, Elementor, Crocoblock, Figma e Photoshop, e adoro quando técnica e criatividade se encontram num projeto bem feito.