Depuração e ferramentas de desenvolvimento🌐 Esta página em: English · Português O eQuantic.UI oferece ferramentas de depuração profissionais parecidas com as do Next.js, com recursos exclusivos de desenvolvimento que ajudam a identificar e corrigir problemas rapidamente.
🔍 Detecção do modo de desenvolvimento
O framework detecta o ambiente automaticamente usando o IWebHostEnvironment.IsDevelopment() e o expõe ao browser por:
window.__EQ_DEV__; // true em desenvolvimento, false em produção
Todas as ferramentas de desenvolvimento são carregadas condicionalmente com base nessa flag.
O logger fornece logs consistentes e com prefixo, que só saem em modo de desenvolvimento.
import { logger } from "@equantic/ui-runtime";
// Só em desenvolvimento (silenciado em produção)
logger.debug("Component state:", state);
logger.info("API call completed");
// Sempre loga (mesmo em produção)
logger.warn("Deprecated API used");
logger.error("Failed to load data:", error);
Método
Saída
Produção
Prefixo
debug()
Console debug
❌ Silenciado
[eQuantic.UI]
info()
Console info
❌ Silenciado
[eQuantic.UI]
warn()
Console warn
✅ Sempre
[eQuantic.UI]
error()
Console error
✅ Sempre
[eQuantic.UI]
No DevTools do browser, você pode filtrar pelo prefixo:
O logger está implementado em src/eQuantic.UI.Runtime/src/utils/logger.ts:
const isDev = typeof window !== "undefined" && window.__EQ_DEV__;
if (isDev) console.debug("[eQuantic.UI]", ...args);
if (isDev) console.info("[eQuantic.UI]", ...args);
console.warn("[eQuantic.UI]", ...args);
console.error("[eQuantic.UI]", ...args);
O overlay de erro fornece uma interface de erro em tela cheia, no estilo do Next.js, que aparece automaticamente quando ocorrem erros em tempo de execução.
•
Captura automática: pega erros não tratados e rejeições de promise
•
Stack traces em C# ✨: o overlay é ciente de source map: ele busca o .js.map de cada bundle, decodifica (src/dev/source-map.ts + src/dev/stack-remapper.ts), e reescreve a pilha de chamadas como os frames C# originais, mais um trecho da linha do código C# que falhou. Cai para a visão em JS se não houver mapa disponível. (É isso que torna real a promessa de "0 conhecimento de JS" na hora de depurar: quem desenvolve em C# vê C#, não JavaScript transpilado.)
•
Suporte a teclado: aperte Esc para fechar
•
Só em desenvolvimento: nunca aparece em produção (carregado por um import() dinâmico em dev)
•
UX limpa: cabeçalho vermelho, fonte monoespaçada, conteúdo rolável
O overlay de erro aparece automaticamente para:
1.
Erros não tratados: qualquer exceção não capturada no JavaScript
2.
Rejeições de promise: erros assíncronos não tratados
// Isto dispara o overlay de erro em modo de desenvolvimento
throw new Error("Something went wrong");
Promise.reject("Async error");
await fetch("/api/data"); // Se o fetch falhar e não for capturado
A interface do overlay de erro
┌─────────────────────────────────────────────┐
│ ⚠️ Build Error Close (Esc)│
├─────────────────────────────────────────────┤
│ Mensagem de erro aqui │
│ ┌─────────────────────────────────────────┐ │
│ │ at MyComponent.render (page.js:42) │ │
│ │ at Reconciler.patch (reconciler.js:12)│ │
│ └─────────────────────────────────────────┘ │
├─────────────────────────────────────────────┤
│ Este overlay de erro só aparece em │
│ desenvolvimento. Corrija o erro para seguir.│
└─────────────────────────────────────────────┘
Mostrando erros manualmente
Você pode mostrar erros no overlay manualmente:
import { errorOverlay } from "@equantic/ui-runtime/dev";
message: "Custom error message",
componentStack: "Component hierarchy...",
// - Clicar no botão "Close"
O overlay de erro está implementado em src/eQuantic.UI.Runtime/src/dev/error-overlay.ts:
private overlay: HTMLDivElement | null = null;
private errors: ErrorInfo[] = [];
if (!window.__EQ_DEV__) return; // Só em dev
// Cria o overlay de tela cheia com os detalhes do erro
export const errorOverlay = new ErrorOverlay();
// Captura automática de erros
window.addEventListener("error", (event) => {
stack: event.error?.stack,
window.addEventListener("unhandledrejection", (event) => {
message: `Unhandled Promise Rejection: ${event.reason}`,
stack: event.reason?.stack,
O eQuantic.UI gera source maps para depurar código C# no browser.
Chrome DevTools:
3.
Encontre webpack:// ou os caminhos de arquivo na árvore
4.
Ponha breakpoints direto no código TypeScript/C#
5.
Inspecione estado, props e variáveis locais
O compilador gera source maps V3 que mapeiam o JavaScript de volta ao código C# original:
"mappings": "AAAA;AACA;...",
"names": ["MyComponent", "Render", "state"]
Isso permite:
•
Pôr breakpoints em código C#
•
Percorrer a lógica C# passo a passo
•
Inspecionar os nomes de variáveis do C#
•
Ver os números de linha originais nos stack traces
Para inspecionar o estado e as props de um componente:
window.__EQ_DEBUG = true; // Liga o modo de depuração
// Os componentes expõem o estado deles
const component = document.querySelector(
'[data-component-id="abc"]',
console.log(component.state);
console.log(component.props);
Testes de integração com o Playwright
Para depurar problemas de renderização entre SSR e CSR:
test("SSR matches CSR", async ({ page }) => {
const ssrResponse = await page.goto("http://localhost:5000");
const ssrHtml = await ssrResponse.text();
// Espera a hidratação do CSR
await page.waitForLoadState("networkidle");
const csrHtml = await page.content();
expect(normalizeHtml(ssrHtml)).toBe(normalizeHtml(csrHtml));
Depure o código C# normalmente com o Visual Studio ou o VS Code:
1.
Ponha breakpoints nos arquivos .cs
2.
Rode com o depurador anexado: dotnet run
3.
Os breakpoints são atingidos durante:
•
A renderização no servidor (SSR)
•
As invocações de Server Action
•
A compilação dos componentes
Monitore os Server Actions no DevTools do browser:
2.
Filtre por _equantic/actions
•
A carga da requisição (nome do método, argumentos)
•
Os erros (com stack traces)
Depuração de provedores de asset
Ao usar IRequireAssets, verifique se as dependências estão sendo injetadas corretamente:
1.
Inspecione a fonte: abra o "Ver código-fonte da página" no browser e procure pelas tags de script/estilo.
2.
Aba Network: confira se as URLs externas (por exemplo, CDNs) estão carregando com sucesso (Status 200).
3.
Deduplicação: verifique se vários componentes não injetaram o mesmo script duas vezes.
4.
Ordem: as folhas de estilo devem aparecer antes dos scripts para a renderização correta.
Assets na renderização no servidor (SSR)
Se os assets estiverem faltando no HTML inicial:
1.
Verifique se o componente implementa IRequireAssets.
2.
Garanta que o AddUI() é chamado no Program.cs.
3.
Confira se a AssetCollection está reunindo os assets corretamente durante a passada de render.
📊 Depuração de performance
Performance em tempo de execução
O reconciliador rastreia métricas de performance em modo de desenvolvimento:
// Liga o rastreamento de performance
console.table(window.__EQ_PERF_DATA);
As métricas incluem:
•
Tempo de render: quanto cada componente levou para renderizar
•
Tempo de diff: tempo gasto no reconciliador
•
Operações de DOM: número de mudanças reais no DOM
•
Listeners de evento: contagem de listeners ativos
Monitore os tempos de compilação:
Procure por:
•
A duração do target CompileEQuanticUI
•
O número de componentes compilados
•
O tempo de geração do TypeScript
•
O tempo de empacotamento do Bun
Sintoma: o boot() nunca executa, GET /_equantic/runtime.js devolve 404
Solução: garanta que o pacote do SDK inclui o runtime.js e que o target CopyEQuanticRuntime executa
# Confira se o runtime existe no pacote do SDK
unzip -l ~/.nuget/packages/equantic.ui.sdk/0.1.1/equantic.ui.sdk.0.1.1.nupkg | grep runtime
dotnet build -v:n # Procure pela mensagem "Copying runtime.js"
Tokens de tema faltando no CSR
Sintoma: o HTML renderizado no servidor está tematizado, mas a renderização no cliente não
Causa raiz: o blob da ponte de tema não foi adotado no boot
Solução:
1.
Verifique se o runtime.js carrega antes dos scripts dos componentes
2.
Procure no console do browser por [eQuantic.UI] Boot process started
3.
Inspecione window.__EQ_THEME__ no console - deve conter o tema serializado
Source maps não funcionam
Sintoma: não dá para depurar o código C# original no DevTools do browser
Solução:
1.
Garanta sourcemap: true no vite.config.ts
2.
Confira se os arquivos .map existem em wwwroot/_equantic/
3.
Ligue os source maps nas configurações do DevTools do browser
4.
Limpe o cache do browser e reconstrua
O overlay de erro não aparece
Sintoma: erros logados no console mas nenhum overlay
Verificações:
1.
O window.__EQ_DEV__ é verdadeiro? (confira no console)
2.
O overlay de erro foi importado? (confira se o runtime.js o inclui)
3.
O CSS do overlay de erro carregou? (procure pelos estilos de #equantic-error-overlay)
Forçar a exibição:
// Dispare o overlay manualmente
import { errorOverlay } from "@equantic/ui-runtime/dev";
errorOverlay.show({ message: "Test error" });
1.
Use o logger à vontade: adicione logs de depuração durante o desenvolvimento, eles são de graça em produção
2.
Teste os dois modos: sempre teste com o ambiente Development e Production
3.
Monitore a rede: deixe a aba Network do DevTools aberta para pegar Server Actions que falharam
4.
Ligue os source maps: sempre construa com source maps em desenvolvimento
5.
Use o overlay de erro: não suprima os erros, deixe o overlay mostrá-los
Para problemas em produção:
1.
Logs do servidor: confira os logs do ASP.NET Core para erros de Server Action
2.
Console do browser: só os logs de warn e error aparecem
3.
Sentry/AppInsights: integre serviços de rastreamento de erros
4.
Source maps: opcionalmente, publique os arquivos .map num servidor separado para depurar em produção
Antes de reportar problemas:
•
[ ] Conferir o console do browser por erros
•
[ ] Verificar se window.__EQ_DEV__ é verdadeiro (dev) ou falso (prod)
•
[ ] Confirmar que o runtime.js carrega (aba Network)
•
[ ] Conferir o blob da ponte de tema (window.__EQ_THEME__)
•
[ ] Testar com o cache do browser desligado
•
[ ] Tentar em modo anônimo/privado
•
[ ] Comparar o HTML do SSR com o do CSR
•
[ ] Conferir a saída do MSBuild por avisos
•
[ ] Verificar se os pacotes NuGet estão nas versões corretas
📚 Documentação relacionada