Falha no build do Astro? Diagnostique estas 7 causas comuns em 5 minutos

O terminal está tomado por mensagens de erro em vermelho. No desenvolvimento local, tudo funcionava: npm run dev era rápido, os componentes renderizavam perfeitamente e as rotas não apresentavam problemas. Mas basta executar astro build para tudo quebrar.
Uma falha no build do Astro pode ser um dos problemas mais frustrantes para quem trabalha com frontend. As diferenças entre o ambiente local e o build de produção deixam a causa difícil de entender. As mensagens de erro costumam ter dezenas de linhas cheias de termos técnicos, e nem sempre fica claro por onde começar.
Este guia reúne o que aprendi resolvendo problemas no Astro: como localizar a causa em 5 minutos sem tentar soluções às cegas, os 7 cenários mais comuns de falha no build e suas soluções, as armadilhas específicas de plataformas como Vercel, Cloudflare e GitHub Pages e algumas práticas preventivas. Na minha experiência, 90% das falhas de build se encaixam nestas 7 causas comuns.
Referência rápida: tabela de mensagens de erro
Comecemos com uma tabela para você consultar assim que encontrar um erro:
| Mensagem de erro | Possível causa | Solução rápida |
|---|---|---|
SyntaxError: Unexpected token 'with' | Versão muito antiga do Node.js | Atualize para Node 18.17.1+ ou 20.3.0+ |
Cannot find module / ERR_MODULE_NOT_FOUND | Problema na instalação de dependências | Exclua node_modules e reinstale |
frontmatter does not match schema | Falha na validação de Content Collections | Revise o frontmatter do arquivo Markdown |
document is not defined / window is not defined | Pacote de terceiros incompatível com SSR | Use client:only ou importação dinâmica |
The build was canceled | Conflito entre integrações ou dependências | Comente as integrações uma por vez para diagnosticar |
| Funciona localmente, mas falha em produção | Diferenças nas variáveis de ambiente ou na versão do Node | Revise a configuração da plataforma de implantação |
| Página 404 no GitHub Pages | Caminho base não configurado | Defina o campo base em astro.config.mjs |
1. Estrutura de diagnóstico rápido: localize o problema em 5 minutos
Três pontos essenciais para entender a mensagem de erro
Muita gente entra em pânico ao ver uma mensagem de erro, mas a resposta geralmente já está nela. Observe estes três pontos para interpretá-la rapidamente:
1. Identifique o tipo de erro
Leia a primeira linha ou procure palavras-chave:
SyntaxError: problema de sintaxe no códigoModuleNotFoundErrorouCannot find module: dependência não encontradaValidationError: falha na validação de dados, geralmente no frontmatter de Content CollectionsENOENT: arquivo ou diretório inexistenteis not defined(document/window): acesso a uma API do navegador durante a renderização no servidor
Por exemplo, ao ver SyntaxError: Unexpected token 'with', você quase sempre pode concluir que a versão do Node.js é antiga demais.
2. Localize o erro
Procure mais abaixo por informações como:
at /path/to/your/file.astro:23:5
Isso indica que o problema está na linha 23 de um arquivo específico. Não se distraia com os vários caminhos de node_modules no meio do stack trace: o mais importante é encontrar o caminho do seu próprio código.
Às vezes, o erro não está no seu código, mas é lançado por uma dependência. Nesse caso, examine o início do stack trace, onde normalmente aparece uma pista como Error: xxx caused by.
3. Entenda o contexto do erro
Observe em que etapa ele apareceu:
Building for production...→ erro na etapa de buildRendering...→ erro na etapa de renderização da páginavite v5.0.0 building for production...→ erro na camada de build do Vite
Erros durante o build normalmente estão ligados à configuração ou às dependências. Erros de renderização tendem a estar relacionados à lógica do código.
Processo rápido de diagnóstico em 5 etapas
Agora que você já sabe ler a mensagem de erro, siga estas cinco etapas. Elas localizam a maior parte dos problemas:
Etapa 1: confira a versão do Node.js
node -v
O Astro exige Node.js 18.17.1+ ou 20.3.0+. Se a sua versão for anterior, atualize. Já vi muita gente travar justamente aqui porque várias plataformas de implantação usam uma versão antiga do Node por padrão.
Se você usa nvm no ambiente local, pode trocar assim:
nvm use 20
Etapa 2: confirme se as dependências foram instaladas corretamente
npm list # ou pnpm list
Confira se aparecem avisos como UNMET DEPENDENCY ou missing. Eles indicam uma instalação incompleta.
Compare também as datas de modificação de package.json e package-lock.json. Se o arquivo de lock for antigo, as dependências podem estar fora de sincronia.
Etapa 3: limpe o cache e faça o build novamente
Esta solução é simples e direta, mas muito eficaz. Quando encontro um erro estranho, minha primeira reação é limpar o cache:
# Exclua todas as dependências e os artefatos de build
rm -rf node_modules .astro dist
# Instale novamente
npm install
# Tente fazer o build outra vez
npm run build
Pode parecer básico, mas pelo menos 30% dos problemas desaparecem assim. Cache corrompido e versões de dependências inconsistentes são muito comuns.
Etapa 4: revise os arquivos alterados recentemente
Pense no que mudou desde o último build bem-sucedido. Você adicionou um componente? Alterou a configuração? Instalou uma nova dependência?
Use Git para ver as mudanças recentes:
git diff HEAD
Muitas vezes, o problema está em um ou dois commits recentes. Você pode comentar temporariamente o código novo e tentar fazer o build novamente; assim, fica mais fácil localizar a causa.
Etapa 5: compare o ambiente local com o ambiente de CI
Se o build funciona localmente, mas falha no CI/CD ou na plataforma de implantação, o problema está nas diferenças de ambiente. Verifique principalmente:
- Versão do Node: é a mesma localmente e em produção?
- Gerenciador de pacotes: você usa npm, pnpm ou yarn? As versões coincidem?
- Variáveis de ambiente: todas as variáveis necessárias foram configuradas em produção?
- Versões das dependências: o arquivo de lock foi enviado ao repositório? A plataforma instala as mesmas versões do ambiente local?
Certa vez, eu usava Node 20 localmente, enquanto a Vercel usava Node 18 por padrão. Meu código chamava uma API disponível apenas no Node 20 e, por isso, falhava em produção. O problema só foi resolvido quando defini a versão do Node nas configurações do projeto na Vercel.
2. As 7 causas mais comuns de falha no build
Causa 1: versão incompatível do Node.js
Mensagem de erro típica:
SyntaxError: Unexpected token 'with'
ou
error: Cannot use import statement outside a module
Causa raiz:
O Astro exige Node.js 18.17.1 ou superior, ou então 20.3.0+. Muitas falhas de build acontecem simplesmente porque a versão instalada é antiga demais.
Isso costuma ocorrer em duas situações:
- Você atualizou o Node localmente, mas a plataforma de implantação ainda usa uma versão antiga
- Cada pessoa da equipe usa uma versão diferente do Node
Solução:
Ambiente local:
Se você gerencia as versões do Node com nvm, a troca é simples:
nvm install 20
nvm use 20
Configuração da plataforma de implantação:
Cada plataforma tem um procedimento diferente:
Vercel:
Em Project Settings → General → Node.js Version, selecione 20.x.
Cloudflare Pages:
Crie um arquivo .nvmrc na raiz do projeto:
20
Netlify:
Crie netlify.toml na raiz:
[build.environment]
NODE_VERSION = "20"
Prevenção:
Adicione esta configuração a package.json para declarar explicitamente a versão exigida do Node:
{
"engines": {
"node": ">=18.17.1"
}
}
Assim, quem executar npm install com uma versão antiga do Node receberá um aviso.
Causa 2: conflito entre dependências ou problema no arquivo de lock
Mensagens de erro típicas:
Error: Cannot find module 'astro'
ERR_MODULE_NOT_FOUND
ou, em casos mais estranhos:
X [ERROR] The build was canceled
Cenários comuns:
Já encontrei esse tipo de problema várias vezes. Ele costuma acontecer em uma destas situações:
- Problemas de compatibilidade com o gerenciador de pacotes
Depois do Astro 4.11.2, houve ajustes no suporte a Bun e pnpm que impediram alguns projetos de instalar dependências. Aconteceu comigo: ao atualizar do 4.11.1 para o 4.11.2, o pnpm começou a falhar. Mais tarde, a equipe do Astro corrigiu o problema.
- Arquivo de lock e node_modules fora de sincronia
Você pode ter alterado package.json sem atualizar o arquivo de lock. Ou pode ter baixado o arquivo de lock de outra pessoa com Git e deixado de reinstalar as dependências locais.
- Pacotes de terceiros que causam problemas por natureza
Alguns pacotes costumam falhar no ambiente do Astro, por exemplo:
astro-compress: muitos usuários relatam falhas de build causadas pelo pacote@supercharge/strings: já apresentou errosis not a functionnodejs-mysql: é melhor substituí-lo pormysql2, que oferece compatibilidade melhor
Solução:
As três medidas padrão:
# 1. Exclua todas as dependências e caches
rm -rf node_modules .astro dist package-lock.json
# Ou, se você usa pnpm:
rm -rf node_modules .astro dist pnpm-lock.yaml
# 2. Limpe o cache do gerenciador de pacotes
npm cache clean --force
# ou pnpm store prune
# 3. Instale novamente
npm install
# No CI, use isto para manter as dependências alinhadas ao arquivo de lock:
npm ci
Se ainda não funcionar, revise os arquivos de configuração:
Quem usa pnpm talvez precise ajustar .npmrc:
shamefully-hoist=true
public-hoist-pattern[]=*astro*
Diagnóstico por redução mínima:
Se você suspeita que uma dependência esteja causando o problema, faça o seguinte:
- Crie um novo projeto Astro mínimo:
npm create astro@latest minimal-test -- --template minimal
-
Adicione a dependência problemática e veja se o erro se repete
-
Se conseguir reproduzi-lo, pesquise no GitHub Issues para saber se outras pessoas relataram o mesmo problema
Foi assim que descobri um problema no astro-compress e decidi adotar outra solução de otimização de imagens.
Causa 3: falha na validação de formato de Content Collections
Mensagens de erro típicas:
Error: blog → post.md frontmatter does not match collection schema.
"date" must be a valid date
ou:
MarkdownContentSchemaValidationError: Content entry frontmatter does not match schema
"title" is required
Causa raiz:
O Astro 2.0 introduziu Content Collections, que usa Zod para validar o frontmatter dos arquivos Markdown. É um recurso poderoso que garante segurança de tipos, mas também cria uma nova fonte de erros: se o frontmatter não estiver no formato definido, o build falhará.
Também tropecei nisso quando comecei a usar o recurso. Meus posts mais antigos tinham frontmatter inconsistente: algumas datas estavam como 2024-01-01, outras como 2024/01/01, e certos campos simplesmente não existiam. Ao ativar Content Collections, todos passaram a apresentar erro.
Erros frequentes:
- Campo obrigatório ausente
O schema define title como obrigatório, mas alguns arquivos Markdown não têm esse campo:
---
# O campo title foi esquecido
date: 2024-01-01
---
- Tipo de campo incorreto
O formato da data é o problema mais comum:
---
title: "My Post"
date: 2024/01/01 # O correto é 2024-01-01
---
Outro erro é escrever um array como string:
---
tags: javascript # O correto é [javascript] ou ["javascript"]
---
- Nome do campo digitado incorretamente
Se o schema define description, mas você escreve desc, o Astro não reconhecerá o campo.
Solução:
Etapa 1: revise a definição do schema
Abra src/content/config.ts e confira como seu schema foi definido:
import { z, defineCollection } from 'astro:content';
const blog = defineCollection({
schema: z.object({
title: z.string(),
date: z.date(),
tags: z.array(z.string()).optional(),
}),
});
export const collections = { blog };
Etapa 2: corrija o frontmatter seguindo a mensagem de erro
A mensagem indica qual arquivo e qual campo apresentam problema. Por exemplo:
blog → my-post.md frontmatter does not match collection schema.
"date" must be a valid date
Nesse caso, corrija o formato da data em src/content/blog/my-post.md:
---
title: "我的文章"
date: 2024-01-01 # Use o formato YYYY-MM-DD
tags: ["astro", "blog"]
---
Etapa 3: use .passthrough() para posts antigos fora do padrão
Se houver muitos posts históricos e corrigi-los um por um der trabalho demais, use .passthrough() para flexibilizar a validação:
const blog = defineCollection({
schema: z.object({
title: z.string(),
date: z.coerce.date(), // Use coerce para fazer a conversão automática
tags: z.array(z.string()).optional().default([]),
}).passthrough(), // Permita campos adicionais que não estão no schema
});
.passthrough() significa que os campos não definidos no schema passam sem erro.
Etapa 4: reinicie o servidor de desenvolvimento
Depois de alterar o schema, reinicie o servidor de desenvolvimento para aplicar a mudança:
# Primeiro, interrompa o processo (Ctrl+C)
# Depois, inicie novamente
npm run dev
Outra opção é pressionar s + enter enquanto o servidor de desenvolvimento estiver em execução para sincronizar a camada de conteúdo.
Causa 4: configuração incorreta das variáveis de ambiente
Cenário típico:
npm run dev e npm run build funcionam localmente, mas depois da implantação na Vercel ou Cloudflare:
- algumas partes da página não aparecem
- determinados recursos deixam de funcionar, como comentários ou chamadas de API
- o build termina com sucesso, mas ocorre um erro em tempo de execução
Problemas comuns:
- As variáveis de ambiente não foram configuradas na plataforma de implantação
Você tem um arquivo .env local, mas ele está excluído por .gitignore — como deve ser, pois segredos não podem ser enviados ao repositório. O problema é que a plataforma de implantação não conhece os valores dessas variáveis, o que causa falhas no build ou em tempo de execução.
- Uso incorreto do prefixo PUBLIC_
O Astro aplica uma regra especial às variáveis de ambiente:
- variáveis acessíveis pelo cliente devem começar com
PUBLIC_ - variáveis do servidor não precisam desse prefixo
Se você usar no código do cliente uma variável sem o prefixo PUBLIC_, o valor será undefined durante o build.
Por exemplo:
// .env
API_KEY=abc123
PUBLIC_SITE_URL=https://example.com
// Código do cliente
const apiKey = import.meta.env.API_KEY; // ❌ undefined
const siteUrl = import.meta.env.PUBLIC_SITE_URL; // ✅ funciona
Solução:
Como configurar em cada plataforma:
Vercel:
- Acesse Project → Settings → Environment Variables
- Adicione a variável e escolha os ambientes aplicáveis: Production, Preview ou Development
- Faça uma nova implantação
Cloudflare Pages:
- Acesse Project → Settings → Environment variables
- Configure separadamente os ambientes Production e Preview
- Inicie um novo build
Netlify:
- Acesse Site settings → Environment variables
- Adicione a variável
- Inicie uma nova implantação
Uso correto de variáveis de ambiente:
// astro.config.mjs
export default defineConfig({
// Aqui você pode usar qualquer variável de ambiente
site: import.meta.env.PUBLIC_SITE_URL,
});
// src/pages/index.astro
---
// O código do servidor pode usar qualquer variável
const apiKey = import.meta.env.API_KEY;
const response = await fetch(`https://api.example.com?key=${apiKey}`);
---
<script>
// O código do cliente só pode usar variáveis com o prefixo PUBLIC_
const siteUrl = import.meta.env.PUBLIC_SITE_URL;
console.log(siteUrl); // O valor é exibido normalmente
const apiKey = import.meta.env.API_KEY;
console.log(apiKey); // undefined
</script>
Aviso de segurança:
Não coloque informações confidenciais, como chaves de API ou senhas de banco de dados, em variáveis que começam com PUBLIC_. Esses valores são incorporados aos arquivos JavaScript do bundle e ficam visíveis para qualquer pessoa.
Se você realmente precisa chamar uma API pelo cliente, prefira encaminhar a solicitação por uma interface própria no backend, sem expor diretamente a chave da API.
Causa 5: erro no arquivo de configuração
Mensagens de erro típicas:
Às vezes, não há uma mensagem clara: o build trava, entra em loop infinito ou apresenta um erro incompreensível do Vite.
Problemas frequentes:
- Caminho base incorreto na implantação no GitHub Pages
A URL do GitHub Pages segue o formato https://username.github.io/repo-name/. Se base não estiver definido em astro.config.mjs, todos os recursos retornarão 404.
Configuração incorreta:
export default defineConfig({
site: 'https://username.github.io/my-blog/',
// O campo base foi esquecido
});
Configuração correta:
export default defineConfig({
site: 'https://username.github.io',
base: '/my-blog', // Use o nome do repositório como caminho base
});
- Conflito entre integrações
Há relatos de conflitos entre a integração do Svelte e content/config.ts, causando o erro The build was canceled.
Em um caso que encontrei, o projeto usava vários plugins de otimização de imagens ao mesmo tempo. Eles entraram em conflito, e remover um deles resolveu o problema.
Solução:
Confira o caminho base:
Se a implantação usa um subcaminho, como no GitHub Pages, configure base:
// astro.config.mjs
export default defineConfig({
site: 'https://yourdomain.com',
base: process.env.BASE_PATH || '/', // Use / localmente e o caminho real na implantação
});
Depois, defina a variável de ambiente na configuração de CI:
# .github/workflows/deploy.yml
env:
BASE_PATH: /my-blog
Diagnostique conflitos entre integrações:
Se você suspeita de uma integração, comente cada uma delas e teste:
// astro.config.mjs
export default defineConfig({
integrations: [
// react(),
// tailwind(),
// sitemap(),
],
});
Comece com a configuração mínima e reative as integrações uma por vez para descobrir qual delas causa o problema.
Causa 6: pacote de terceiros incompatível com SSG ou SSR
Mensagens de erro típicas:
ReferenceError: document is not defined
ReferenceError: window is not defined
Causa raiz:
Por padrão, o Astro gera as páginas no servidor, em um ambiente Node.js. Alguns pacotes npm, porém, foram projetados para o navegador e acessam diretamente APIs como document e window. Essas APIs não existem durante o build no servidor, e o processo falha.
Encontrei esse problema pela primeira vez ao usar uma biblioteca de gráficos. No modo de desenvolvimento local, tudo aparecia normalmente porque a renderização acontecia no navegador. Assim que executei o build, recebi o erro document is not defined.
Tipos de pacote que costumam causar o problema:
- bibliotecas de componentes de interface que dependem de operações no DOM
- bibliotecas que detectam dispositivo ou versão do navegador
- alguns plugins antigos de jQuery
- pacotes que executam
window.xxxdiretamente no nível superior do módulo
Soluções:
Solução 1: use a diretiva client:only
Informe ao Astro que o componente deve ser renderizado apenas no cliente e nunca executado no servidor:
---
import ProblematicComponent from './ProblematicComponent';
---
<ProblematicComponent client:only="react" />
Depois de client:only, você precisa indicar o framework usado, como react, vue ou svelte.
Solução 2: use importação dinâmica
Carregue o pacote somente no cliente:
---
// Não importe no servidor
---
<script>
// Importe dinamicamente no cliente
const { default: MyLibrary } = await import('problematic-package');
const instance = new MyLibrary();
</script>
Solução 3: faça uma importação condicional
Verifique o ambiente antes de usar o pacote:
let myLib;
if (typeof window !== 'undefined') {
myLib = await import('problematic-package');
}
Solução 4: substitua o pacote por outro compatível
Às vezes, trocar o pacote é a solução mais simples. Por exemplo:
nodejs-mysql→mysql2- algumas bibliotecas antigas de gráficos →
chart.js, que funciona melhor com SSR - plugins de jQuery → JavaScript puro ou componentes de frameworks modernos
Minha recomendação:
Antes de escolher um pacote de terceiros, verifique se a documentação menciona suporte a SSR ou SSG. Muitas bibliotecas populares deixam claro se funcionam com renderização no servidor. Se a documentação disser “works with Next.js” ou “SSR compatible”, é provável que o pacote também funcione com Astro.
Causa 7: breaking changes ao atualizar a versão do Astro
Cenário típico:
Depois de atualizar o projeto para Astro 5 ou outra versão principal, um projeto que antes compilava passa a:
- travar durante o build sem terminar
- apresentar erros estranhos de resolução de módulos
- deixar de reconhecer determinadas APIs
Problemas comuns:
- Mudanças na resolução de módulos CommonJS
O Astro 5 alterou parte da lógica de resolução de módulos. Alguns pacotes CommonJS que funcionavam antes podem deixar de funcionar.
- APIs descontinuadas ou alteradas
Cada versão principal descontinua APIs antigas. Por exemplo, alguns métodos de Astro.xxx podem ter sido renomeados ou removidos.
- Versão incompatível de uma integração
Depois de atualizar o Astro, também pode ser necessário atualizar integrações oficiais e de terceiros. Caso contrário, elas podem ficar incompatíveis.
Estratégia de solução:
Atualize gradualmente, sem pular versões:
Se você quer passar do Astro 3 para o 5, não faça isso de uma vez. Atualize primeiro para o 4, teste e só então passe para o 5. Assim, fica muito mais fácil localizar problemas.
# Abordagem incorreta
npm install astro@latest
# Abordagem recomendada
npm install astro@^4.0.0
# Depois que os testes passarem
npm install astro@^5.0.0
Use a ferramenta de atualização do Astro CLI:
O Astro oferece uma ferramenta automática capaz de tratar alguns breaking changes comuns:
npx @astrojs/upgrade
Essa ferramenta:
- analisa seu projeto
- indica as dependências que precisam ser atualizadas
- modifica automaticamente alguns trechos, como chamadas a APIs descontinuadas
Atualize também as integrações:
Depois de atualizar o Astro, não se esqueça das integrações oficiais:
npm install @astrojs/react@latest @astrojs/tailwind@latest @astrojs/sitemap@latest
Às vezes, a falha ocorre porque Astro 5 está sendo usado com versões de integração feitas para Astro 4.
3. Problemas específicos de cada plataforma de implantação
Depois das sete causas gerais, vale examinar as armadilhas de cada plataforma. Cada uma tem características próprias, e conhecê-las evita trabalho desnecessário.
Problemas de implantação na Vercel
Problema típico 1: tempo limite durante o build
O plano gratuito da Vercel limita a duração do build. Se o projeto for grande ou a instalação de dependências demorar, o processo pode exceder o limite e falhar.
Soluções:
- revise
package.jsone remova dependências desnecessárias - use
pnpmno lugar denpmpara acelerar a instalação - faça upgrade para o plano Pro, se houver orçamento
Problema típico 2: diretório de saída incorreto
A Vercel precisa saber onde estão os artefatos do build. Por padrão, o Astro usa o diretório dist, mas, se você alterou a configuração, a plataforma talvez não o encontre.
Configuração correta:
- Build Command:
npm run buildouastro build - Output Directory:
dist, o padrão do Astro - Install Command:
npm install
Se você usa pnpm:
- Install Command:
pnpm install
Problemas de implantação no Cloudflare Pages
Problema típico 1: versão antiga demais do Node.js
A versão padrão do Node no Cloudflare Pages pode ser antiga. Crie um arquivo .nvmrc na raiz para fixar a versão:
20
Outra opção é defini-la nas configurações do projeto:
Settings → Environment variables → NODE_VERSION = 20
Problema típico 2: falha causada por astro-compress
Muitos usuários relatam que astro-compress provoca falhas no Cloudflare, principalmente durante a otimização de imagens.
Se isso acontecer:
- Desinstale astro-compress:
npm uninstall astro-compress - Remova a integração de
astro.config.mjs - Use outra solução para otimizar imagens, como o componente
<Image />do Astro
Problema típico 3: configuração do comando de build
Use esta configuração no Cloudflare Pages:
- Build command:
npm run build - Build output directory:
/dist - Root directory:
/, salvo em monorepos, que exigem ajuste
Observe que Build output directory precisa começar com /.
Problemas de implantação no GitHub Pages
Problema típico 1: página 404 ou em branco
Este é o erro mais comum e ocorre quando o caminho base está incorreto.
A URL de um repositório no GitHub Pages segue o formato https://username.github.io/repo-name/. O trecho /repo-name/ é justamente o caminho base.
Configure-o em astro.config.mjs:
export default defineConfig({
site: 'https://username.github.io',
base: '/your-repo-name', // Nome do repositório
});
Problema típico 2: estilos ausentes ou recursos com erro 404
Se a página abre sem estilos ou as imagens não carregam, o caminho base também pode ser a causa.
Abra o console do navegador e confira as URLs solicitadas. Se o navegador pedir https://username.github.io/style.css, mas o endereço correto for https://username.github.io/repo-name/style.css, a configuração de base está ausente.
4. Boas práticas preventivas
Agora você já sabe como resolver esses problemas. Mais importante ainda é evitar que eles voltem a acontecer.
Crie um fluxo local de diagnóstico
Reprodução mínima
Quando encontrar um problema, não comece mudando tudo no projeto original. Primeiro, crie um projeto mínimo de teste:
npm create astro@latest test-project -- --template minimal
cd test-project
# Adicione somente o código ou a dependência que apresenta problema
Se o erro também ocorrer no projeto mínimo, você saberá que uma funcionalidade ou dependência específica é a causa, e não o projeto inteiro. Isso acelera bastante o diagnóstico.
Use bem o console do navegador e os logs de build
Durante o desenvolvimento, mantenha o console do navegador aberto:
- guia Console: mostra erros de JavaScript
- guia Network: mostra se os recursos foram carregados corretamente
- guia Sources: permite depurar o código
Salve o log do build:
npm run build > build.log 2>&1
Assim, mesmo que o terminal seja preenchido por outras mensagens, você poderá consultar o log completo depois.
Mantenha suas próprias anotações de solução de erros
Eu mantenho um arquivo Markdown com todos os erros que já encontrei e suas soluções. O formato é simples:
## Erro: SyntaxError: Unexpected token 'with'
**Cenário**: falha na implantação na Vercel
**Causa**: versão muito antiga do Node
**Solução**: definir a versão 20.x do Node na Vercel
**Data**: 2024-11-15
Na próxima vez que encontrar um erro parecido, consulte primeiro suas anotações. Talvez consiga resolver tudo em 5 minutos.
Preserve a saúde do projeto
Atualize as dependências periodicamente
Confira as atualizações todo mês ou a cada trimestre:
# Veja as dependências desatualizadas
npm outdated
# Atualize todas as dependências para a versão mais recente, com cautela
npm update
# Ou atualize uma por vez
npm install astro@latest
Não atualize sem avaliar os riscos, principalmente em mudanças de versão principal. Antes, leia o CHANGELOG e verifique se existem breaking changes.
Automatize atualizações de dependências com Dependabot
Crie .github/dependabot.yml na raiz do repositório GitHub:
version: 2
updates:
- package-ecosystem: "npm"
directory: "/"
schedule:
interval: "weekly"
open-pull-requests-limit: 5
O Dependabot verifica atualizações automaticamente e abre PRs. Você só precisa revisar e fazer o merge.
Escreva um script de teste do build
Adicione um script de teste a package.json:
{
"scripts": {
"build": "astro build",
"test:build": "npm run build && echo 'Build successful!'"
}
}
Configure um hook pre-commit
Use husky para fazer o build automaticamente antes do commit e garantir que o código compile:
npm install --save-dev husky
# Inicialize o husky
npx husky init
# Adicione o hook pre-commit
echo "npm run build" > .husky/pre-commit
Assim, cada commit executará o build primeiro. Se o build falhar, o commit será bloqueado. O processo leva um pouco mais de tempo, mas evita enviar código com problemas.
Ferramentas e recursos úteis para depuração
Recursos oficiais do Astro:
- Guia oficial de solução de problemas: o primeiro lugar a consultar
- Referência de erros: explicações detalhadas de todos os erros do Astro
- Comunidade no Discord: peça ajuda com problemas difíceis
Comandos úteis:
# Confira se a configuração do Astro está correta
npx astro check
# Veja informações detalhadas do build
npx astro build --verbose
# Execute em modo de depuração
DEBUG=astro:* npm run dev
Recursos da comunidade:
- Astro GitHub Issues: pesquise problemas conhecidos
- Stack Overflow: pesquise a tag
[astro] - fóruns e blogs da comunidade: muitos desenvolvedores compartilham o que aprenderam
Conclusão
Vamos recapitular os pontos principais.
Em 90% dos casos, uma falha no build do Astro está relacionada a uma destas causas:
- Versão incompatível do Node.js: confira se é 18.17.1+ ou 20.3.0+
- Problema de dependência: limpe o cache, reinstale e confira o arquivo de lock
- Falha na validação de Content Collections: corrija o formato do frontmatter
- Configuração incorreta das variáveis de ambiente: configure-as na plataforma de implantação e observe o prefixo PUBLIC_
- Erro no arquivo de configuração: confira o caminho base e diagnostique conflitos entre integrações
- Pacote de terceiros incompatível com SSR: use client:only ou importação dinâmica
- Breaking changes após uma atualização: leia o guia de migração e atualize gradualmente
Lembre-se do processo rápido em cinco etapas:
- confira a versão do Node
- confira a instalação das dependências
- limpe o cache e faça o build novamente
- revise as mudanças recentes
- compare o ambiente local com o ambiente de produção
O mais importante é desenvolver uma abordagem sistemática de diagnóstico. Não entre em pânico: leia primeiro a mensagem de erro, identifique o tipo e o local do problema e só então aplique uma solução específica.
Quando comecei a usar Astro, eu costumava perder horas com erros de build. Com este método, hoje consigo localizar e resolver o problema em 5 a 10 minutos na maioria dos casos. Espero que este artigo também ajude você a evitar esse caminho mais longo.
Um último aviso: as versões evoluem rapidamente. Este artigo foi escrito no fim de 2024, quando a versão estável mais recente do Astro era a 4.x. Se, quando você estiver lendo, o Astro já tiver chegado à versão 6.0 ou até 7.0, consulte também a documentação oficial mais recente, pois APIs e mensagens de erro específicas podem ter mudado. A lógica de diagnóstico, porém, continua válida.
Se encontrar um problema novo, compartilhe sua experiência nos comentários para melhorarmos este guia juntos. Salve o artigo e, na próxima falha de build, consulte a lista para economizar tempo e trabalho.
Processo completo para diagnosticar uma falha no build do Astro em 5 minutos
Um processo sistemático de diagnóstico em 5 etapas e soluções específicas para os 7 cenários de erro de build mais comuns, capazes de resolver 90% dos problemas em 5 a 10 minutos.
⏱️ Estimated time: 10 min
- 1
Step 1: Diagnóstico rápido em 5 etapas: entenda a mensagem de erro
Três pontos essenciais para entender uma mensagem de erro:
1. Identifique o tipo de erro
• Observe a primeira linha ou as palavras-chave
• SyntaxError: problema de sintaxe no código
• TypeError: erro de tipo
• ReferenceError: erro de referência
• ModuleNotFoundError: módulo não encontrado
2. Localize o erro
• Encontre o arquivo e o número da linha indicados
• Em geral, aparecem no formato Error at xxx:xx
3. Analise o contexto do erro
• Examine o código antes e depois do ponto indicado
• Entenda por que o erro ocorreu
Processo de diagnóstico em 5 etapas:
1. Confira a versão do Node.js
• Use Node 18.17.1+ ou 20.3.0+
• Execute node -v para verificar
2. Limpe e reinstale as dependências
• Exclua node_modules e package-lock.json
• Execute npm install novamente
3. Revise a configuração de Content Collections
• Confira se o frontmatter dos arquivos Markdown está correto
4. Verifique a compatibilidade dos pacotes de terceiros
• Use client:only ou importação dinâmica
5. Revise a configuração da plataforma de implantação
• Variáveis de ambiente, versão do Node e comando de build - 2
Step 2: Os 7 cenários de erro de build mais comuns e suas soluções
Erro 1: SyntaxError: Unexpected token 'with'
• Causa: versão muito antiga do Node.js
• Solução: atualize para Node 18.17.1+ ou 20.3.0+ e use nvm para gerenciar versões do Node
Erro 2: Cannot find module/ERR_MODULE_NOT_FOUND
• Causa: problema na instalação de dependências
• Solução:
- Exclua node_modules e package-lock.json
- Execute npm install novamente
- Confira se as dependências em package.json estão corretas
Erro 3: frontmatter does not match schema
• Causa: falha na validação de Content Collections
• Solução: revise o frontmatter do arquivo Markdown e confira se todos os campos obrigatórios existem e estão no formato correto
Erro 4: document is not defined/window is not defined
• Causa: pacote de terceiros incompatível com SSR
• Solução: use client:only ou importação dinâmica e adicione ao componente uma diretiva como client:load
Erro 5: The build was canceled
• Causa: conflito entre integrações ou problema de dependência
• Solução: comente cada integração, uma por vez, e verifique se há conflitos entre dependências
Erro 6: funciona localmente, mas falha em produção
• Causa: diferenças nas variáveis de ambiente ou na versão do Node
• Solução: revise a configuração da plataforma de implantação, confirme as variáveis de ambiente e use a mesma versão do Node
Erro 7: página 404 no GitHub Pages
• Causa: caminho base não configurado
• Solução: defina o campo base em astro.config.mjs e confirme se o caminho está correto - 3
Step 3: Armadilhas específicas de cada plataforma de implantação
Implantação na Vercel:
• Confira a configuração da versão do Node, definindo o campo engines em package.json ou ajustando as configurações do projeto na Vercel
• Confira as variáveis de ambiente e confirme que todas as variáveis obrigatórias foram definidas
• Confira o comando de build, que normalmente é npm run build
Implantação no Cloudflare Pages:
• Confira se o comando de build está correto
• Confira se o diretório de saída está correto, normalmente dist
• Confira a versão do Node; o Cloudflare Pages usa Node 18 por padrão e exige configuração para outras versões
Implantação no GitHub Pages:
• Configure o caminho base em astro.config.mjs no formato /repo-name/
• Use o modo de saída estática, output: 'static'
• Confira o comando de build e o diretório de saída - 4
Step 4: Boas práticas preventivas
Use .nvm para gerenciar a versão do Node
• Garanta que todos da equipe usem a mesma versão do Node
• Evite problemas de build causados por versões diferentes
Atualize as dependências periodicamente
• Use npm outdated para conferir dependências desatualizadas
• Atualize regularmente para versões estáveis recentes
Use a verificação de tipos do TypeScript
• Execute a verificação de tipos antes do build
• Encontre erros de tipo com antecedência
Configure builds de teste automatizados no CI/CD
• Configure testes automáticos de build no GitHub Actions ou em outra plataforma de CI/CD
• Execute a verificação de build automaticamente a cada commit
Use Git hooks para verificar o build antes do commit
• Configure um hook pre-commit
• Execute a verificação de build automaticamente antes de enviar o commit
• Evite commits com código problemático
FAQ
Quais são as 7 causas mais comuns de falha no build do Astro?
1) SyntaxError: Unexpected token 'with':
• A versão do Node.js é muito antiga; atualize para Node 18.17.1+ ou 20.3.0+
2) Cannot find module/ERR_MODULE_NOT_FOUND:
• Há um problema na instalação de dependências; exclua node_modules e reinstale
3) frontmatter does not match schema:
• A validação de Content Collections falhou; revise o frontmatter do arquivo Markdown
4) document is not defined/window is not defined:
• Um pacote de terceiros é incompatível com SSR; use client:only ou importação dinâmica
5) The build was canceled:
• Há conflito entre integrações ou dependências; comente cada integração, uma por vez, para diagnosticar
6) Funciona localmente, mas falha em produção:
• Existem diferenças nas variáveis de ambiente ou na versão do Node; revise a configuração da plataforma de implantação
7) Página 404 no GitHub Pages:
• O caminho base não foi configurado; defina o campo base em astro.config.mjs
É possível resolver 90% dos problemas em 5 a 10 minutos usando o processo sistemático de diagnóstico em 5 etapas e consultando a tabela de mensagens de erro.
Como diagnosticar rapidamente uma falha no build do Astro? Quais são as 5 etapas?
1) Entenda três pontos essenciais da mensagem de erro:
• Identificação do tipo de erro
• Localização do erro
• Análise do contexto do erro
2) Confira a versão do Node.js:
• Use Node 18.17.1+ ou 20.3.0+
• Execute node -v para verificar
3) Limpe e reinstale as dependências:
• Exclua node_modules e package-lock.json
• Execute npm install novamente
4) Revise a configuração de Content Collections:
• Confira se o frontmatter dos arquivos Markdown está correto
5) Verifique a compatibilidade dos pacotes de terceiros:
• Use client:only ou importação dinâmica
O mais importante é desenvolver uma abordagem sistemática de diagnóstico. Não entre em pânico: leia primeiro a mensagem de erro, identifique o tipo e o local do problema e só então aplique uma solução específica. Quando comecei a usar Astro, eu costumava perder horas com erros de build. Com este método, agora consigo localizar e resolver o problema em 5 a 10 minutos na maioria dos casos.
Quais são as armadilhas específicas das diferentes plataformas de implantação, como Vercel, Cloudflare e GitHub Pages?
• Confira a versão do Node, definindo engines em package.json ou ajustando as configurações do projeto na Vercel
• Confira se todas as variáveis de ambiente obrigatórias foram definidas
• Confira o comando de build, normalmente npm run build
Implantação no Cloudflare Pages:
• Confira se o comando de build está correto
• Confira se o diretório de saída está correto, normalmente dist
• Confira a versão do Node; o Cloudflare Pages usa Node 18 por padrão e exige configuração para outras versões
Implantação no GitHub Pages:
• Configure o caminho base em astro.config.mjs no formato /repo-name/
• Use o modo de saída estática, output: 'static'
• Confira o comando de build e o diretório de saída
Como prevenir falhas no build do Astro? Quais são as melhores práticas?
• Use .nvm para gerenciar a versão do Node e garantir que todos da equipe usem a mesma versão
• Atualize as dependências periodicamente com npm outdated e adote versões estáveis recentes
• Use a verificação de tipos do TypeScript antes do build para encontrar erros com antecedência
• Configure builds de teste automáticos no GitHub Actions ou em outra plataforma de CI/CD e verifique cada commit
• Use Git hooks para executar o build antes do commit, configurando um hook pre-commit que impeça o envio de código problemático
Onde buscar ajuda quando o build do Astro falhar?
• Documentação oficial do Astro, com as informações mais recentes sobre versões e APIs
• Astro GitHub Issues, para pesquisar problemas conhecidos e casos semelhantes
• Comunidade do Astro no Discord, para fazer perguntas em tempo real
Ferramentas de depuração:
• Use npx astro build --verbose para ver informações detalhadas do build
• Execute DEBUG=astro:* npm run dev para ativar o modo de depuração
Recursos da comunidade:
• Pesquise a tag [astro] no Stack Overflow
• Consulte fóruns e blogs da comunidade, onde muitos desenvolvedores compartilham o que aprenderam
Se encontrar um problema novo, compartilhe sua experiência nos comentários para melhorarmos este guia juntos. Salve o artigo e, na próxima falha de build, consulte a lista para economizar tempo e trabalho.
22 min de leitura · Publicado em: 3 dez 2025 · Atualizado em: 4 set 2026
Guia Astro
Se você chegou pela busca, o caminho mais rápido é ir para o post anterior ou próximo desta série.
Anterior
Guia completo para criar um blog com Astro: do zero ao seu ativo digital de longo prazo
Um guia completo para criar um blog de alto desempenho com Astro, da escolha da tecnologia e estrutura do projeto ao SEO e à operação de conteúdo, evitando o abandono e construindo um ativo digital sustentável.
Parte 10 de 15
Próximo
Guia completo de otimização de imagens no Astro: 5 técnicas práticas para acelerar seu site em 50%
Um guia prático de todo o processo de otimização de imagens no Astro: configuração do componente Image, escolha entre WebP e AVIF, estratégia de carregamento adiado e integração com a CDN da Cloudflare. Inclui exemplos completos de código para reduzir o carregamento inicial de 6 segundos para 1,8 segundo e elevar a nota do Lighthouse a 95.
Parte 12 de 15



Comentários
Entre com GitHub para comentar