Perf/otimizacao - #8
Draft
glauberx86 wants to merge 9 commits into
Draft
glauberx86 wants to merge 9 commits into
glauberx86 wants to merge 9 commits into
Conversation
- LOG_QUERIES=1 acrescenta "query" ao log do PrismaClient
- LOG_HTTP=1 loga "método caminho status duração_ms" por request via
middleware em server/index.ts
- compression() registrado antes das rotas: gzip/brotli nas respostas
(bundle JS/CSS e JSON grandes) — cada KB ajuda na viagem até o navegador
- index.html passa a ir com Cache-Control: no-cache (revalida a cada
load para pegar deploy novo); assets com hash continuam immutable
- correção incidental: sendFile(path.join(...)) falhava com 404 quando
o diretório do projeto tem algum segmento começando com "." (o
módulo `send` aplica o check de dotfile no path absoluto inteiro);
trocado para sendFile("index.html", { root: clientDist }), que checa
só o path relativo ao root
- connection_limit do Prisma configurável via DB_CONNECTION_LIMIT, com
padrão 10 em produção e 2 fora dela: o pooler do Supabase em modo
sessão limita a 15 clientes no total, e um `npm run dev` local com 10
conexões disputava slots com o container em produção (EMAXCONNSESSION)
- adiciona compression e @types/compression
… no hover - login e recarregar a página passam a usar só a request de boot (/init) para saber quem é o usuário, eliminando uma chamada extra só para isso - abrir uma pasta ou trocar de pasta dispara a busca na hora; o atraso de digitação só entra quando o usuário está de fato digitando num filtro, e uma busca em andamento é cancelada se a tela mudar antes dela terminar - corrigido o cache do "pré-carregamento" ao passar o mouse pelas pastas na barra lateral: a chave usada para guardar o resultado agora é a mesma usada ao abrir a pasta, então o hover realmente evita a busca repetida; o pré-carregamento só dispara depois de um instante parado sobre a pasta e é cancelado se o mouse sair antes disso - pastas passam a ser identificadas pelo nome (já único) tanto ao carregar a grade quanto ao mover/excluir em lote, permitindo abrir a grade de uma pasta em paralelo com o carregamento da barra lateral em vez de esperar por ela; a API continua aceitando o identificador antigo e devolve erro claro para um nome de pasta inexistente
… editar status - Grid de operações: query principal, placas duplicadas e regras de prazo agora disparam juntas (antes a principal esperava terminar para só então buscar as outras duas). - Editar o status de uma operação grava tudo em uma única instrução no banco (antes eram duas idas: uma para conferir o status atual, outra para salvar), sem mudar quando a data de status é atualizada. - Novo cache em memória (server/lib/cache.ts) para dados que mudam pouco: lista de usuários do Supabase e ordem das colunas da grid. Fica quente por ~10 minutos e é invalidado nas telas de gestão de usuários assim que algo muda (criar, editar, bloquear, ativar, excluir). - O servidor já aquece esses caches e outros dados de boot logo ao subir, para que o primeiro acesso de cada usuário não pague essa espera. - A lista de faturistas só é buscada quando o formulário de criar/editar pasta está aberto, em vez de em toda navegação pela sidebar. - Sessão própria de 30 dias guardada em cookie assinado, sem depender mais de chamadas ao Supabase a cada requisição para saber quem é o usuário logado (só login, logout e a tela de usuários continuam falando com o Supabase). Rebaixar ou bloquear alguém pelo painel passa a valer em poucos minutos. - Tela de perfil: os dados da página carregam em paralelo, e renomear o próprio usuário usa o mesmo caminho administrativo já usado na tela de usuários, refletindo o novo nome sem precisar relogar. - Removido código que não era mais usado depois dessas mudanças de sessão.
- A planilha de exportação (xlsx, ~1 MB) só é baixada quando o usuário realmente clica em "Exportar Excel", em vez de entrar no pacote inicial. - Dashboard, Automações, Usuários, Perfil e Login viram pedaços separados do bundle, carregados só na primeira vez que a tela é aberta; a tela de operações (a mais usada) continua no pacote principal. - Se um novo deploy apagar os pedaços antigos do site enquanto alguém ainda está com a aba aberta, o app recarrega a página sozinho para buscar a versão nova (no máximo uma vez por minuto, pra não entrar em loop). - A folha de estilo das fontes do Google deixou de travar a primeira pintura da página: ela carrega em paralelo e só é aplicada quando termina.
…a toda - Cache do resumo da dashboard no servidor passa de 30s para 60s, maior que o intervalo de atualização automática do cliente, para o segundo poll aproveitar o cache em vez de recalcular tudo de novo - useDashboard e useDashboardFaturista mantêm os números anteriores na tela ao trocar de filtro, com uma leve redução de opacidade até a resposta nova chegar, em vez de sumir o conteúdo; o polling em segundo plano atualiza os números sem mexer na tela - formatarMoeda reaproveita uma única instância de Intl.NumberFormat em vez de criar uma nova a cada valor formatado (grid e dashboard formatam muitos valores por render) - Editar uma célula da grid de operações deixou de re-varrer todas as linhas carregadas a cada edição; a atualização local já era aplicada por outro caminho, então o passo redundante foi removido
- Contador global de requests em voo (app/lib/loading.ts) ligado ao fetch wrapper (app/lib/api.ts), acendendo uma faixa fina no topo (TopProgress) sempre que algo está carregando — grid, dashboard, troca de página, polls em segundo plano — sem depender só do React Query, já que a grid busca dados manualmente. - Splash inicial e troca de rota lazy usam a mesma faixa/barrinha em vez de texto piscando, e a sidebar não troca mais o ícone por um spinner a cada request (evita re-render desnecessário). - Novo componente Skeleton (bloco cinza pulsando) e util cn (clsx + tailwind-merge) reaproveitados para desenhar a forma do conteúdo enquanto carrega: grid de operações, dashboard (geral e por faturista), perfil e lista de prazos. O conteúdo não some mais para dar lugar a um texto — só aparece a faixa do topo quando já há dados em tela e o carregamento é uma atualização em segundo plano.
- Backup do estado anterior, remoção das linhas que saíram da planilha (modo Substituir) e inserção das novas linhas passam a ser feitos direto no Postgres (json_agg / json_populate_recordset), sem trazer a tabela inteira de operações para o Node nem fatiar a inserção em vários lotes. - O parse da planilha roda antes de qualquer consulta ao banco, e o backup da versão anterior sai em paralelo com a busca das regras de automação, caindo de mais de dez idas sequenciais ao banco por importação para poucas. - O parser evita reprocessar a planilha inteira só para achar a linha do cabeçalho e reaproveita as normalizações de nome de coluna já calculadas, deixando o parse mais leve em arquivos com milhares de linhas. - A restauração de um snapshot ganha mais tempo de transação, para não estourar em planilhas maiores.
- Reabre e refaz automaticamente a primeira consulta que falhar por queda de conexão com o banco (comum após um tempo sem uso), sem o usuário precisar recarregar a página - Mantém a conexão com o banco e o cache de usuários sempre "quentes" em produção, para a primeira requisição depois de um tempo parado não pagar o preço de reconectar - Remove o cache condicional (ETag/304) das respostas da API, que fazia o navegador travar requisições repetidas sem ganho nenhum de velocidade - Corrige o health check por HEAD na raiz do site, hoje respondendo 404 - Adiciona um header de diagnóstico (Server-Timing) nas rotas mais usadas, detalhando quanto tempo cada etapa (autenticação, banco, total) levou no servidor - Evita que abrir/trocar de pasta na grid dispare requisições repetidas ou abortadas: limpar os filtros ao trocar de pasta não recria mais objetos desnecessários, e a busca reaproveita o resultado do prefetch feito no hover da sidebar em vez de refazer a mesma chamada - Skeleton com cor própria (`--skeleton`) nos dois temas, em vez de reusar o tom de superfície, e bordas mais suaves na grade de carregamento da lista - Limpa as linhas da pasta anterior ao trocar de pasta, para o skeleton aparecer no lugar delas em vez de piscar dados da pasta antiga
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
No description provided.