Erros de JavaScript em produção são difíceis de depurar: o código é minificado e cada usuário possui dispositivo, navegador e condições de rede exclusivos. A maioria das abordagens de monitoramento de navegador depende do objeto *PerformanceTiming*, que captura apenas o tempo total de carregamento da página e exclui os tempos de carregamento de recursos estáticos, o que dificulta a identificação de gargalos de desempenho. O Browser Monitoring no Application Real-Time Monitoring Service (ARMS) combina suporte a source maps com rastreamento de comportamento do usuário para mapear stack traces minificados de volta ao código-fonte e reproduzir as ações exatas que causaram o erro.
Pré-requisitos
Antes de começar, verifique se você tem:
O agente do Browser Monitoring do ARMS instalado na sua aplicação. Para instruções de configuração, consulte Visão geral do Browser Monitoring
Um arquivo de source map gerado pela sua ferramenta de build (consulte Gerar source maps)
Como funcionam os source maps
Um source map é um arquivo JSON que mapeia posições no código minificado para as posições correspondentes no código-fonte original. Ele usa codificação VLQ para armazenar dados de localização de forma compacta. Com um source map, o Browser Monitoring traduz um erro em "Linha 1, Coluna 79585" para um arquivo, linha e coluna precisos no seu código-fonte.
Fluxo de trabalho de diagnóstico
O fluxo de trabalho a seguir percorre o processo completo: identificar tendências de erros, mapear stack traces minificados para o código-fonte e reproduzir as ações do usuário que acionaram o erro.
Etapa 1: Visualizar a visão geral de erros
Faça logon no console do ARMS.
No painel de navegação à esquerda, escolha .
Na página Browser Monitoring, selecione uma região na barra de navegação superior e clique em no nome da aplicação que deseja gerenciar.
No painel de navegação à esquerda, clique em JS Error Diagnosis.

Nesta página:
A seção Error Overview exibe o número total de erros, a taxa de erros de JS, além da quantidade e porcentagem de usuários afetados.
O gráfico de curva apresenta as tendências de erros ao longo do tempo.
A aba Frequent Errors lista os erros de alta frequência.
As abas Page Ranked by Error Rate e Error View mostram a distribuição de erros entre as páginas.
Etapa 2: Analisar um erro específico
Há dois pontos de entrada disponíveis:
Na aba Frequent Errors, clique em Diagnose ao lado do erro alvo.
No gráfico de curva, clique em um ponto de dados em um horário específico para abrir a caixa de diálogo Exception Insight.
O exemplo a seguir utiliza a abordagem do gráfico de curva:
-
No gráfico de curva, identifique um ponto onde a taxa de erros tenha um pico. Passe o mouse sobre o ponto de inflexão até que o cursor mude para um ícone de mão e clique em nele. A caixa de diálogo Exception Insight será exibida. Para mais informações, consulte Visualizar exception insight.

Clique em na aba Frequent Errors Top 5, selecione um erro e clique em Diagnose na coluna Operation. A aba Error Detail será exibida.
Etapa 3: Revisar detalhes do erro
A página de detalhes do erro fornece o seguinte contexto:
|
Campo |
Descrição |
|
Hora da primeira ocorrência |
Momento em que o erro foi registrado pela primeira vez |
|
Versão da primeira ocorrência |
Versão da aplicação quando o erro apareceu inicialmente (opcional) |
|
Nome e tipo do erro |
Nome e classificação do erro JavaScript |
|
Hora da ocorrência |
Momento em que esta instância do erro ocorreu |
|
Dispositivo, SO, navegador |
Ambiente do cliente onde o erro aconteceu |
|
Endereço IP, região |
Localização de rede do usuário |
|
Tipo de conexão |
Conexão de rede utilizada (Wi-Fi, 4G, etc.) |
|
URL do erro |
URL da página onde o erro foi acionado |
|
Versão da aplicação |
Versão da aplicação implantada |
|
Arquivo, linha, coluna |
Posição no arquivo minificado |
Exemplo: A captura de tela a seguir mostra um erro proveniente de um módulo de mapa em um painel em tempo real. O módulo relatou dados inválidos durante uma atualização, e o stack trace aponta para a Linha 1, Coluna 79585 no bundle minificado.

"Linha 1, Coluna 79585" não é uma informação acionável porque o código de produção está minificado. A próxima etapa mapeia essa posição de volta para o seu código-fonte.
Etapa 4: Mapear o erro para o código-fonte
Os números de linha e coluna no stack trace referem-se ao código minificado, não aos seus arquivos de origem. Aplique um source map para resolver a localização original do erro.
Na seção Stack Info, clique em no ícone
à esquerda de um frame da pilha para expandi-lo e clique em Choose Sourcemap.-
Na caixa de diálogo Sourcemap File, selecione um arquivo de source map existente ou faça upload de um novo e clique em OK.
NotaÉ possível fazer upload de até cinco arquivos por vez.

-
Após aplicar o source map, o Browser Monitoring destaca a localização original do erro em vermelho na seção Source Code, mostrando o arquivo e a linha exatos onde o erro ocorreu. Aplique source maps em cada frame da pilha de erros para rastrear toda a cadeia de chamadas.
Figura 1. Mapeamento de Source Map

Etapa 5: Reproduzir o erro com rastreamento de comportamento do usuário
O mapeamento via source map revela onde o erro ocorreu, mas nem sempre por quê. No exemplo do módulo de mapa, o mapeamento do código-fonte mostra que dados inválidos causaram o erro durante a criação do componente. No entanto, o código-fonte já inclui verificações de nulo e tolerância a falhas para esses dados. Para entender por que os dados inválidos apareceram, revise o que aconteceu imediatamente antes do erro.
O Browser Monitoring registra o comportamento do usuário como um rastro cronológico de nós de eventos:
Carregamento de página
Alterações de rota
Cliques na página
Requisições de API
Saída do console
Revise esse rastro para reproduzir a sequência de ações que levou ao erro.
Exemplo: O rastro de comportamento do usuário a seguir mostra que uma requisição de API ocorreu pouco antes do erro. A chamada de API solicitou uma atualização em tempo real para o módulo de mapa, mas a resposta retornou ConsoleNeedLogin em vez de dados válidos do mapa. Isso indica que o usuário havia feito logoff da página — a causa raiz dos dados inválidos.

Gerar source maps
Os source maps são necessários para a Etapa 4 do fluxo de trabalho de diagnóstico. Gere um source map com sua ferramenta de build e faça o upload dele no console do ARMS.
Para fazer upload de um arquivo de source map, localize sua aplicação na página Browser Monitoring e escolha More > Settings na coluna Actions. Na página de configurações, clique em na aba Advance.
Webpack
Em webpack.config.js, defina a propriedade devtool como "source-map". O Webpack suporta 13 valores de devtool para diferentes tipos de source maps. "source-map" gera um arquivo .map completo e separado, recomendado para diagnóstico de erros em produção.
const path = require('path');
module.exports = {
entry: './src/index.js',
output: {
filename: 'bundle.js',
path: path.resolve(__dirname, 'dist')
},
devtool: "source-map"
};
Gulp
Utilize o pacote gulp-sourcemaps:
var gulp = require('gulp');
var sourcemaps = require('gulp-sourcemaps');
gulp.task('javascript', function() {
gulp.src('src/**/*.js')
.pipe(sourcemaps.init())
.pipe(sourcemaps.write('../sourcemaps'))
.pipe(gulp.dest('dist'));
});
Grunt
Apenas com grunt-contrib-uglify:
grunt.initConfig({
uglify: {
options: {
sourceMap: true
}
}
});
Com grunt-usemin (que chama grunt-contrib-concat e grunt-contrib-uglify):
grunt.initConfig({
concat: {
options: {
sourceMap: true
}
},
uglify: {
options: {
sourceMap: true,
sourceMapIn: function(uglifySource) {
return uglifySource + '.map';
},
}
}
});
Com grunt-jsmin-sourcemap:
module.exports = function(grunt) {
grunt.loadNpmTasks('grunt-jsmin-sourcemap');
grunt.initConfig({
'jsmin-sourcemap': {
all: {
src: ['scripts/script.js'],
dest: 'scripts/script.jsmin-grunt.js',
destMap: 'scripts/script.jsmin-grunt.js.map'
}
}
});
grunt.registerTask('default', 'jsmin-sourcemap');
};
Angular CLI
ng build --prod --source-map --vendor-source-map
UglifyJS2
O UglifyJS2 é uma ferramenta CLI. Para mais opções, consulte Opções de source map da CLI.
uglifyjs app.js -o app.min.js --source-map app.min.js.map
SystemJS
Use o SystemJS Builder:
builder.bundle('app.js', 'app-outfile.js', {
minify: true,
sourceMaps: true
});