Configure source maps com segurança para ler erros de frontend em produção
Aprenda a configurar source maps com segurança para que erros de frontend em produção apontem para o arquivo e linha exatos, sem expor seu código-fonte.

Por que erros no frontend em produção são difíceis de ler
Erros do frontend em produção normalmente chegam como uma mensagem curta mais uma stack trace que parece específica, mas não diz o que realmente quebrou.
Um relatório típico pode ser assim:
TypeError: Cannot read properties of undefined (reading 'name')
at t (app.3f9c1a2b.js:1:28417)
at e (app.3f9c1a2b.js:1:29102)
at HTMLButtonElement.<anonymous> (app.3f9c1a2b.js:1:30511)
Esses nomes de arquivo e números de linha são reais, mas apontam para o bundle final que seus usuários baixam, não para os arquivos que você edita. Em builds de produção, o código é minificado (nomes encurtados, espaços removidos), reorganizado e frequentemente dividido em chunks. Isso melhora a velocidade de carregamento, mas torna crashes difíceis de interpretar.
A minificação também remove pistas úteis. Nomes de função viram letras só, muitas instruções ficam numa mesma linha, e vários arquivos originais podem acabar mesclados num único arquivo de saída. Então, quando a stack trace diz app.3f9c1a2b.js:1:28417, aquela posição pode corresponder a um componente React, uma utilidade compartilhada ou uma biblioteca empacotada ao lado do seu código.
O que você quer é simples: informações legíveis e exatas de arquivo e linha, sem facilitar que o público baixe seu código-fonte. Por isso times configuram source maps com segurança, para que ferramentas de monitoramento traduzam stack traces minificadas de volta para seu código original.
Isso importa especialmente quando você não tem tempo para chutar:
- uma queda em produção onde cada minuto custa usuários
- um hotfix apressado onde você precisa da menor alteração segura
- um bug que acontece só em um navegador ou dispositivo
- um problema que aparece só após um deploy (descompasso de release)
- um relato de cliente com poucos detalhes
Se você herdou um frontend gerado por IA, pode ser pior. Bundles frequentemente escondem lógica emaranhada, e um apontamento limpo para o arquivo e linha exatos é a diferença entre um patch rápido e horas de tentativa e erro.
Source maps em linguagem simples (o que fazem e o que contêm)
Um source map é um pequeno arquivo “decodificador” que diz ao navegador (e a um rastreador de erros) como um bundle minificado de produção mapeia de volta para a fonte original.
É por isso que um erro pode apontar para app.8f3a1c2.js:1:53241 em vez de src/components/CheckoutButton.tsx:47. Source maps fazem essa ponte, traduzindo linha:coluna do bundle para arquivo, linha e coluna originais.
O que há dentro de um source map (e por que importa)
Source maps podem incluir mais do que números de linha:
- caminhos de arquivos para seus módulos originais (como
src/pages/login.tsx) - nomes de símbolos (nomes de funções e variáveis)
- o código-fonte original em si via
sourcesContent(o maior risco de segurança)
Incluir sourcesContent é conveniente porque a depuração funciona mesmo se o repositório não estiver disponível para a ferramenta que faz o mapeamento. Mas se o map vazar, seu código real pode vazar junto.
Trate source maps como artefatos internos, não como ativos públicos.
O que source maps podem e não podem fazer
Source maps ajudam você a localizar o problema rapidamente. Eles não consertam o problema.
Se um usuário clica em “Pagar” e você vê “Cannot read properties of undefined”, um source map não evita o bug. Ele vai dizer em qual arquivo e linha a leitura do valor faltante aconteceu, para que você possa adicionar a validação correta, tratar um estado vazio ou consertar o fluxo de dados.
Faça um plano seguro antes de gerar qualquer coisa
Source maps funcionam melhor quando você decide antecipadamente quem deve acessá‑los. Muitos times geram maps “por precaução” e acabam publicando o código legível para todo visitante por acidente.
Mantenha a produção rápida, mantenha a depuração legível
Você pode manter os bundles de produção totalmente minificados para os usuários e ainda assim obter stack traces legíveis para sua equipe. Source maps são para depuração, não para performance.
Se você já está correndo atrás de crashes em produção, foque primeiro no caminho de depuração: como coletará as stack traces e como as resolverá de volta para o código original.
Decida onde os maps ficam e quem pode acessá‑los
Antes de gerar qualquer coisa, escolha um modelo de hospedagem que combine com seu nível de risco:
- Servidor web público: fácil de configurar, mais suscetível a exposição acidental.
- Armazenamento privado: maps não são alcançáveis por usuários comuns; só sua ferramenta pode buscá‑los.
- Controle de acesso: limitado à sua equipe, CI e monitoramento de erros.
- Retenção: mantenha maps apenas pelo tempo necessário.
Depois decida o que incluir. Se você embutir sourcesContent, o map pode conter seu código completo. Muitos times removem sourcesContent e dependem de repositórios privados ou armazenamento privado ao resolver erros.
Passo a passo: gerar e verificar source maps
Pense em source maps como artefatos de build que você pode criar a qualquer momento, mas só compartilhar quando quiser.
1) Ative a geração de source maps na sua ferramenta de build
A maioria das ferramentas de build tem uma configuração para isso. Procure por sourcemap, sourceMap ou devtool. Para depuração em produção, prefira mapas completos (não “cheap”) para que números de linha e coluna batam com o que você vê nos logs reais.
Se sua app produz múltiplos bundles (app principal, vendor, chunks), garanta que mapas sejam gerados para todas as saídas.
2) Faça o build localmente e confirme que os arquivos .map existem
Execute o mesmo comando que usa para um build de produção real. Inspecione a pasta de saída e confirme que vê arquivos terminando em .map.
Cada arquivo JavaScript minificado normalmente referencia seu map com um comentário perto do fim:
//# sourceMappingURL=app.abc123.js.map
Se esse comentário estiver ausente, muitas ferramentas de monitoramento não conseguirão casar stack traces com as fontes.
3) Cheque se o map corresponde ao bundle
Escolha um bundle e seu map e confirme:
- o arquivo
.mapé JSON válido - o map tem um campo
fileque parece o nome do bundle - o map tem
sourcesnão vazios
Uma checagem prática: abra o arquivo minificado no devtools do navegador. Se o map estiver presente, o painel Sources deve mostrar nomes de arquivos originais e permitir pular para locais reais.
4) Registre a versão exata do build que você está enviando
Antes de fazer o deploy, registre o hash do commit, ID do build ou tag de release para essa saída e guarde isso com os artefatos. Mais tarde, esse rótulo é como você encontra o map correto para uma stack trace de produção.
Evite sobrescrever source maps antigos sem um rótulo de versão.
Passo a passo: publicar source maps de forma privada para rastreamento de erros
Publicar source maps não significa colocá‑los no seu site público. A abordagem mais segura é gerá‑los durante o build e enviá‑los apenas à sua ferramenta de monitoramento de erros para que ela possa desminificar stack traces.
1) Escolha um esquema de nome de release que você não vá alterar
Sua ferramenta de monitoramento precisa de um valor de release consistente para casar erros com os source maps corretos. Mantenha simples: um SHA do git, ou algo como [email protected]+build.417.
Use o mesmo valor em três lugares: seu pipeline de build, seu frontend deployado e a etapa de upload para o monitoramento.
2) Envie source maps para a ferramenta de monitoramento, não para o servidor web
Um fluxo comum:
- gere assets com source maps habilitados (guarde os arquivos
.mapcomo artefatos) - faça deploy apenas dos bundles JS minificados para produção (sem os
.map) - envie os arquivos
.mappara a ferramenta de monitoramento sob o mesmo release/versão - configure a ferramenta com o caminho de URL dos bundles que ela deve casar
- dispare um erro de teste em staging para confirmar que resolve para nomes e linhas reais
Algumas ferramentas demoram um minuto para processar maps, então teste após um pequeno atraso.
3) Verifique se a ferramenta consegue casar caminhos exatamente
A maior parte das falhas de “source map ausente” é por incompatibilidade de caminhos. A ferramenta de monitoramento tenta casar o que o navegador reportou com o que você enviou.
Se o mapeamento não funcionar, verifique:
- nomes dos bundles batem exatamente (incluindo hashes)
- o prefixo de URL configurado corresponde ao seu CDN ou base de assets
- você enviou maps do build exato que está em produção
- você não está reaproveitando identificadores de release antigos
Como evitar vazar código ao usar source maps
Source maps são ótimos para depuração em produção, mas podem expor seu app se você publicá‑los de forma descuidada. Um padrão seguro: não deixar arquivos .map publicamente acessíveis a menos que você esteja realmente confortável com qualquer pessoa lendo seu código cliente.
Mantenha arquivos .map fora da internet pública
Duas abordagens cobrem a maioria dos times:
- Não faça deploy dos arquivos
.map; envie‑os apenas para seu rastreador de erros. - Bloqueie requisições para
*.mapno seu CDN ou servidor web.
Verificação: abra seu site numa janela anônima, tente adivinhar uma URL de map provável (como app.js.map) e confirme que retorna 404 ou proibido.
Se precisar hospedar maps, restrinja acesso
Se precisar hospedar maps para ferramentas internas, exija autenticação e limite quem pode acessá‑los. Um endpoint apenas por VPN, allowlists de IP ou URLs assinadas com expiração curta são soluções razoáveis.
Lembre‑se também: mesmo que seus bundles não linkem para maps via sourceMappingURL, um arquivo .map público é ainda um vazamento se for alcançável.
Reduza o conteúdo do map (quando o risco for alto)
Se sua ferramenta permitir, considere remover sourcesContent para que o map contenha apenas os mapeamentos e não o texto completo do código. Assim você ainda tem apontadores por linha sem entregar o código.
Como rastrear uma stack trace minificada até a linha exata
Uma stack trace minificada parece inútil porque aponta para nomes curtos e funções pequenas, além de uma linha e coluna que não batem com sua fonte.
Comece encontrando o primeiro frame da stack que pertence ao seu app (não ao navegador, extensões ou scripts de terceiros). Você procura por um nome de bundle e uma posição, por exemplo:
at t (app.3f2c1.js:1:28491)
Esse :1:28491 é a chave. Com source maps disponíveis para sua ferramenta (ou num passo de mapeamento local), traduza essa posição do bundle para um arquivo, linha e coluna reais.
Uma vez na linha mapeada, não pare na instrução que lançou o erro. Suba algumas linhas para ver que valores foram passados. Muitos erros de “undefined” são causados anteriormente.
Uma forma simples de trabalhar a trace:
- mapeie o frame em‑app mais alto de bundle linha:coluna para source linha:coluna
- abra o arquivo mapeado e encontre a instrução exata
- verifique o frame chamador para ver que argumentos foram passados
- adicione um breadcrumb simples (log, métrica ou guarda) para confirmar o valor ruim
- decida: patch rápido agora, ou refatoração mais profunda se o padrão se repetir
Exemplo: a stack diz app.3f2c1.js:1:28491. Depois de mapear, você chega em src/components/CheckoutButton.tsx:42:17 em user.profile.name.trim(). O bug real não é que trim falhou — é que user.profile às vezes está ausente.
Exemplo: transformar “Cannot read properties of undefined” em um conserto
Uma história comum: tudo parece bem em staging, então após um deploy em produção você vê um pico de “Cannot read properties of undefined (reading 'name')”. Acontece só para alguns usuários, então é difícil reproduzir.
Sem source maps, o relatório costuma parecer assim:
TypeError: Cannot read properties of undefined (reading 'name')
at tI (app.3f2c1a9.js:1:184233)
at nA (app.3f2c1a9.js:1:186901)
Com source maps corretos enviados de forma privada para sua ferramenta de monitoramento, o mesmo crash fica legível:
TypeError: Cannot read properties of undefined (reading 'name')
at renderUserBadge (src/components/UserBadge.tsx:42:17)
at ProfileHeader (src/pages/Profile.tsx:118:9)
Agora você pode abrir UserBadge.tsx e ver a suposição incorreta:
// UserBadge.tsx (before)
export function UserBadge({ user }: { user: any }) {
return <span>{user.profile.name}</span>;
}
Para alguns usuários, profile está ausente (conta nova, resposta parcial da API, dados em cache), então user.profile é undefined e ler .name causa o crash.
O menor conserto seguro é tratar a forma ausente e exibir um fallback:
// UserBadge.tsx (after)
export function UserBadge({ user }: { user: any }) {
const name = user?.profile?.name;
return <span>{name ?? "Anonymous"}</span>;
}
Para reduzir repetições, adicione uma guarda:
- valide a resposta da API e preencha defaults antes de renderizar
- aperfeiçoe os tipos para que campos opcionais precisem ser tratados
- adicione um teste para “novo usuário sem profile”
Erros comuns que quebram source maps (ou os expõem)
Source maps só são úteis quando correspondem exatamente ao JavaScript que os usuários executaram. Eles também são fáceis de vazar se você fizer deploy como qualquer outro arquivo estático.
1) O map não corresponde ao build em produção (hash diferente)
Se você enviar source maps de um build diferente do que está em produção, ferramentas de monitoramento mostrarão números de linha errados, nomes de arquivo sem sentido ou falharão ao mapear. Isso acontece quando o CI faz dois builds: um para deploy e outro para upload de maps.
Checagem rápida: abra o .js implantado e procure pelo comentário sourceMappingURL. Se ele aponta para um map que você não enviou (ou os hashes não batem), o mapeamento não funcionará.
2) publicPath errado ou URL de assets (lookups falham silenciosamente)
Mesmo maps corretos não resolvem se as URLs não baterem. Causas comuns: usar um CDN em produção mas deixar um caminho local na config, ou servir a app em /app/ enquanto os assets assumem /.
Sintomas: requisições a .map retornam 404/403, ou a ferramenta de monitoramento reporta artefatos ausentes. Corrija garantindo que o app reporte a base de assets real em produção e que o caminho usado pela ferramenta corresponda às URLs dos bundles.
3) Publicar maps por acidente
Se seu deploy envia a pasta inteira dist/, você pode acabar publicando source maps para qualquer um que saiba onde procurar.
Padrões seguros: não fazer deploy dos .map ou restringir acesso aos maps na borda.
4) Tagging de release ausente (erros mapeiam para o código errado)
Sem um identificador de release claro, seu sistema de monitoramento pode anexar erros de hoje a source maps de ontem, especialmente se nomes de arquivos foram reaproveitados (como app.js).
Torne o tagging de release obrigatório no CI: um release por deploy e envie os artefatos correspondentes sob esse mesmo release.
Checklist rápido e próximos passos
Antes de enviar, faça uma verificação curta cobrindo precisão do build, segurança e um teste real de depuração:
- registre um ID de release único e use‑o consistentemente (build, deploy, upload de monitoramento)
- confirme que maps são gerados para o build de produção
- envie maps de forma privada para seu provedor de monitoramento
- confirme que arquivos
.mapnão são acessíveis publicamente - dispare um erro controlado e verifique que resolve para um arquivo e linha reais
Se você está lidando com um app gerado por IA que envia builds quebrados, releases inconsistentes ou erros de produção ilegíveis, FixMyMess (fixmymess.ai) pode ajudar diagnosticando a base de código, corrigindo lógica e problemas de segurança, e fazendo o monitoramento de erros e o manejo de source maps funcionarem sem expor seu código. Eles oferecem uma auditoria de código gratuita antes de qualquer compromisso.
Perguntas Frequentes
What is a source map, in plain terms?
Um source map é um pequeno arquivo que traduz uma posição no seu bundle minificado (linha e coluna) de volta para o arquivo e linha originais no seu código. Ele permite que relatórios de erro apontem para algo como src/components/UserBadge.tsx:42 em vez de app.3f2c1a2b.js:1:28417.
Why do production stack traces look useless compared to local errors?
A minificação e o empacotamento alteram seu código antes de os usuários baixarem, então a stack trace aponta para o bundle final e não para seus arquivos originais. Nomes ficam encurtados, muitas instruções aparecem numa única linha e vários arquivos podem ser mesclados, por isso a trace parece “específica” mas não é acionável sem um mapeamento.
What’s the safest way to use source maps in production?
O padrão mais seguro é gerar source maps durante o build, mas não publicar os arquivos .map no site público. Em vez disso, envie‑os apenas para sua ferramenta de monitoramento de erros para que ela possa desminificar as stack traces de forma privada.
Can source maps leak my code?
Podem, especialmente se o mapa incluir sourcesContent, que pode embutir seu código-fonte completo. Trate os source maps como artefatos internos e considere que, se um arquivo .map for publicamente acessível, alguém poderá inspecionar seu conteúdo.
How do I quickly verify my source maps actually work?
Primeiro, gere seu bundle de produção e confirme que existem arquivos .map ao lado dos .js minificados. Depois abra o bundle minificado no devtools do navegador; se o mapeamento funcionar, o painel Sources mostrará os nomes dos arquivos originais e permitirá ir para as linhas reais.
Why does my error tracker say “missing source map” even though I generated them?
O problema mais comum é uma incompatibilidade entre o que os usuários executaram e os mapas que você enviou — frequentemente causado por builds duplicados ou artefatos sobrescritos. Também são comuns incompatibilidades de caminho, onde a ferramenta de monitoramento não consegue casar a URL reportada com os arquivos enviados.
What is “release” or “version tagging,” and why does it matter for source maps?
Use um identificador de release único e consistente em build, deploy e upload de source maps — por exemplo, um SHA do git ou [email protected]+build.417. Se os releases forem reaproveitados ou ausentes, os erros de hoje podem ser mapeados para código de ontem e gerar informações enganosas.
How do I trace a minified stack trace back to the exact file and line?
Comece pelo primeiro frame da stack que pertence ao bundle do seu app e use source maps para traduzir a posição do bundle (linha:coluna) para arquivo e linha reais. Ao chegar na linha mapeada, verifique também o chamador e os parâmetros — a causa raiz geralmente aparece antes da linha que lança o erro.
What’s the smallest safe fix for “Cannot read properties of undefined (reading 'name')"?
Uma proteção simples como encadeamento opcional (optional chaining) ou um fallback evita o crash imediatamente, mas você também deve corrigir a forma dos dados a montante para que o erro não se repita. Na prática, isso significa validar respostas da API, preencher defaults antes de renderizar e endurecer os tipos para que campos opcionais sejam tratados conscientemente.
Can FixMyMess help if my AI-generated frontend keeps breaking in production?
Se você herdou código gerado por IA e os erros em produção são difíceis de interpretar, obtenha ajuda para configurar tratamento privado de source maps e versionamento de release confiável. FixMyMess pode rodar uma auditoria gratuita do código e então corrigir lógica, problemas de segurança e a configuração de deploy para que crashes em produção mapeiem para arquivos reais sem expor seu código.