Content Framework

Astro

Astro é o framework focado em conteúdo que entrega zero JavaScript por padrão. Construa páginas como HTML e adicione interatividade apenas onde for necessário, com qualquer biblioteca de UI.

intermediate14 min readUpdated 15 de set. de 2026
[slug].astro
astro
---
// src/pages/blog/[slug].astro
import { getCollection, render } from "astro:content";

export async function getStaticPaths() {
  const posts = await getCollection("blog");
  return posts.map((post) => ({
    params: { slug: post.id },
    props: { post },
  }));
}

const { post } = Astro.props;
const { Content } = await render(post);
---

<article>
  <h1>{post.data.title}</h1>
  <Content />
</article>
Saída padrão
HTML estático, zero JS
Componentes
arquivos .astro
Interatividade
Islands, opt-in por componente
Bibliotecas de UI
React, Vue, Svelte, Solid, Preact
Conteúdo
Content collections
Servidor
SSR e renderização on-demand

Por que importa

Por que o Astro é diferente

Zero JavaScript por padrão

As páginas são entregues como HTML e CSS. O JavaScript é adicionado apenas para os componentes que o solicitam explicitamente.

Traga sua própria biblioteca de UI

Use React, Vue, Svelte, Solid ou Preact no mesmo projeto, e misture-os página por página ou até mesmo componente por componente.

Rápido por construção

Páginas focadas em conteúdo carregam rapidamente porque não há nada para hidratar, e apenas as islands interativas geram custo de performance.

O panorama completo

As três ideias por trás do Astro

HTML primeiro, islands para interatividade e um formato de componente que roda no servidor e não entrega nada extra por padrão.

Server components

Renderização

Componentes .astro rodam no momento do build ou no servidor e geram HTML puro.

Islands

Interatividade

Client directives hidratam componentes individuais sob demanda em vez de toda a página.

Content collections

Conteúdo

Conteúdo tipado e validado que alimenta blogs, documentações e sites de marketing.

Astro em resumo

O que o Astro oferece

Componentes .astro

Um script de frontmatter, um template HTML e estilos escopados em um único arquivo.

Roteamento baseado em arquivos

Arquivos em src/pages tornam-se rotas, com segmentos dinâmicos e layouts.

Framework islands

Insira componentes React, Vue ou Svelte em uma página Astro.

Client directives

client:load, client:visible, client:idle e client:only controlam a hidratação.

Content collections

Markdown e dados validados por schema com queries type-safe.

SSR e adapters

Renderize sob demanda e faça deploy no Node, serverless ou na edge.

Uma breve historia

De gerador de sites estáticos a plataforma de conteúdo

  1. 2021

    Astro beta

    O framework zero-JavaScript-por-padrão atrai atenção por sua islands architecture.

    21
  2. 2022

    Astro 1.0

    Lançamento estável com integrações para React, Vue, Svelte e mais.

    22
  3. 2023

    Astro 2 e 3

    Chegam as content collections e view transitions, fortalecendo a proposta de conteúdo.

    23
  4. 2024

    Astro 5

    Uma nova camada de conteúdo, server islands e ferramentas aprimoradas.

    24
  5. Hoje

    O favorito para conteúdo

    Uma escolha líder para blogs, documentações, sites de marketing e apps híbridos.

    Hoje

O guia completo

Astro: Tudo que voce precisa saber

O que é Astro?

Astro é um framework web focado em conteúdo construído com base em uma aposta simples: a maioria das páginas não precisa de muito JavaScript. Ele renderiza páginas para HTML por padrão, não envia JavaScript para o cliente a menos que você solicite e permite adicionar componentes interativos apenas onde eles são realmente necessários.

Esse design torna o Astro excepcionalmente bom para os tipos de sites que compõem grande parte da web: blogs, documentações, páginas de marketing, portfólios e produtos com foco em conteúdo. Ele não é contra o JavaScript — ele é a favor da moderação. Você obtém a interatividade de que precisa e nada além disso.

componentes .astro

Um componente Astro é um arquivo com um script de frontmatter, um template e estilos escopados opcionais.

---
// src/components/Card.astro
interface Props {
  title: string;
  href: string;
}

const { title, href } = Astro.props;
---

<a class="card" href={href}>
  <h3>{title}</h3>
  <slot />
</a>

<style>
  .card {
    display: block;
    border-radius: 1rem;
    padding: 1.5rem;
  }
</style>

O frontmatter é executado no servidor no momento do build ou por requisição. O template é HTML com expressões semelhantes a JSX, e o <slot /> permite que um componente pai passe filhos. Por padrão, os estilos são escopados ao componente. Como o componente é executado no servidor, você pode consultar bancos de dados, ler arquivos e chamar APIs diretamente no frontmatter.

Roteamento baseado em arquivos

Arquivos em src/pages tornam-se rotas, e segmentos dinâmicos utilizam colchetes.

src/pages/
├── index.astro            # /
├── about.astro            # /about
├── blog/
│   ├── index.astro        # /blog
│   └── [slug].astro       # /blog/:slug
└── rss.xml.js             # /rss.xml

Para rotas dinâmicas, você exporta getStaticPaths para declarar quais páginas devem ser geradas, ou utiliza SSR para renderizar sob demanda.

Content collections

Content collections são a resposta do Astro para conteúdo estruturado. Você define um schema e cada entrada em markdown ou JSON é validada no momento do build.

// src/content.config.ts
import { defineCollection, z } from "astro:content";

const blog = defineCollection({
  schema: z.object({
    title: z.string(),
    publishedAt: z.coerce.date(),
    tags: z.array(z.string()).default([]),
  }),
});

export const collections = { blog };
---
// src/pages/blog/index.astro
import { getCollection } from "astro:content";

const posts = (await getCollection("blog"))
  .sort((a, b) => b.data.publishedAt.valueOf() - a.data.publishedAt.valueOf());
---

<ul>
  {posts.map((post) => (
    <li>
      <a href={`/blog/${post.id}`}>{post.data.title}</a>
    </li>
  ))}
</ul>

Você ganha type safety, validação e uma maneira limpa de consultar conteúdo sem a necessidade de um banco de dados. Para um site com centenas de posts ou páginas de documentação, isso representa uma melhoria significativa na qualidade de vida do desenvolvimento.

A arquitetura de ilhas

Este é o recurso definidor do Astro. Uma página é HTML estático, e qualquer componente interativo são ilhas que hidratam de forma independente. Você controla quando cada ilha é carregada através de uma diretiva de cliente.

---
import Counter from "../components/Counter.jsx";
import Comments from "../components/Comments.jsx";
---

<Counter client:load />
<Comments client:visible />

As diretivas são:

  • client:load hidrata imediatamente — para interatividades críticas acima da dobra (above-the-fold).
  • client:idle hidrata assim que o navegador estiver livre.
  • client:visible hidrata quando o componente entra na área de visualização (scroll).
  • client:only pula a renderização no servidor e renderiza apenas no navegador.
  • client:media hidrata quando uma media query for correspondida.

Escolher a diretiva menos “ansiosa” que ainda funcione mantém a página rápida. A maioria das páginas de conteúdo não precisa de nenhuma.

Traga sua própria biblioteca de UI

O Astro consegue renderizar componentes de React, Vue, Svelte, Solid e Preact — no mesmo projeto.

---
import ReactChart from "../components/Chart.jsx";
import VueForm from "../components/Form.vue";
---

<ReactChart client:load data={data} />
<VueForm client:visible />

Cada framework é uma integração opcional. Você pode usar React para uma island e Svelte para outra, ou dispensar frameworks completamente. Essa flexibilidade significa que você nunca fica preso a uma tecnologia e pode adotar uma biblioteca apenas onde ela for realmente necessária.

SSR e adapters

O Astro é estático por padrão, mas pode renderizar sob demanda. Adicione um adapter para a sua plataforma e configure as rotas para renderização no servidor.

// astro.config.mjs
import { defineConfig } from "astro/config";
import node from "@astrojs/node";

export default defineConfig({
  output: "server",
  adapter: node({ mode: "standalone" }),
});

Endpoints de API ficam em src/pages/api e exportam métodos HTTP, e server islands permitem que você renderize fragmentos dinâmicos dentro de páginas que, de outra forma, seriam estáticas. Isso torna o Astro ideal para sites híbridos: um blog estático com um dashboard dinâmico, ou um site de marketing com seções personalizadas.

Melhores práticas

  • Priorize componentes .astro; adicione componentes de framework apenas para interatividade.
  • Use a diretiva de cliente menos “eager” que funcione.
  • Mantenha o conteúdo em coleções com um schema em vez de markdown de formato livre.
  • Isole os estilos com blocos <style> de componentes ou com a ferramenta de CSS de sua escolha.
  • Renderize páginas estáticas no momento do build e reserve o SSR para rotas dinâmicas.
  • Use layouts para shells compartilhados e metadados.
  • Otimize imagens com os componentes de imagem integrados.

Erros comuns

  • Adicionar client:load em todo lugar e perder o benefício do zero-JavaScript.
  • Recorrer a um framework de UI quando um componente .astro seria suficiente.
  • Esquecer de definir um schema e perder a tipagem (type safety) nas coleções.
  • Presumir que o Astro não consegue criar apps dinâmicos e ignorar o SSR.
  • Misturar frameworks de UI demais e inflar o projeto sem necessidade.
  • Usar client-side fetching para conteúdos que poderiam ser renderizados no build time.

Próximos passos

O Astro é a escolha pragmática para sites com foco em conteúdo que ainda precisam de pontos de interatividade. Reforce seus conhecimentos de HTML e CSS e, em seguida, compare esse modelo com Next.js, Nuxt e SvelteKit. Depois, crie um pequeno blog com uma content collection e uma island interativa para analisar as vantagens e desvantagens por conta própria.

Hidratando componentes

Hidrate apenas quando o componente for realmente necessário. client:visible aguarda até que o componente entre na viewport, mantendo o carregamento inicial leve.

Preferir
<Comments client:visible />
Evitar
<Comments client:load />

Conteúdo estático

Um componente .astro renderiza para HTML sem JavaScript no cliente. Use um componente de framework apenas quando precisar de interatividade.

Preferir
---
const posts = await getCollection("blog");
---
<ul>
  {posts.map((p) => (
    <li><a href={p.id}>{p.data.title}</a></li>
  ))}
</ul>
Evitar
// a React component that fetches
// and renders static content,
// hydrating the whole list

Perguntas frequentes

Perguntas frequentes

Keep learning

Related topics from the roadmap.

$ comecar a aprender

Pronto para aprender Astro?

Nosso tutorial interativo te guia por Astro passo a passo — com quizzes e codigo real que voce pode executar no navegador.