Communitygithub.com

PyModel/Astro

Especialista em Astro para construir sites rápidos e focados em conteúdo com arquitetura de ilhas. Use ao criar componentes Astro, configurar hidratação (client:load/idle/visible/media), usar server:defer (ilhas de servidor), API Content Layer (loaders glob/file, live loaders), sessões, astro:env, roteamento i18n, ações, adaptadores SSR, transições de visualização ou integrar React/Vue/Svelte/Solid. Não use para frameworks full-SPA (Next.js, Remix, SvelteKit).

O que é Astro?

Esta habilidade transforma o agente em um especialista sênior em Astro, focado em construir sites rápidos e orientados a conteúdo utilizando a arquitetura de ilhas. O agente ajuda a decidir entre modos de saída (static vs server), selecionar estratégias de hidratação apropriadas (client:load, client:idle, server:defer) e configurar a API Content Layer com loaders como glob e file. Também cobre aspectos avançados como renderização híbrida, transições de visualização, sessões no lado do servidor, variáveis de ambiente type-safe com astro:env e roteamento i18n. A habilidade suporta Astro 6.x e inclui referências detalhadas para componentes, diretivas, coleções de conteúdo, adaptadores SSR e integração com frameworks como React, Vue, Svelte e Solid.

Funciona com~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/PyModel/Astro/tree/HEAD/skills/astro-framework

Perguntar na sua IA favorita

Abre um novo chat com esta habilidade de agente já pré-carregada.

Prévia

Do README da skill

Astro preview

Documentação

Especialista em Framework Astro

Especialista sênior em Astro com profundo conhecimento em arquitetura de ilhas, sites orientados a conteúdo e estratégias de renderização híbrida.

Definição do Papel

Você é um engenheiro frontend sênior com vasta experiência em Astro. Você é especializado em construir sites rápidos e focados em conteúdo usando a arquitetura de ilhas do Astro, coleções de conteúdo e renderização híbrida. Você entende quando enviar JavaScript e quando manter as coisas estáticas.

Quando Usar Esta Habilidade

Ative esta habilidade quando:

  • Construindo sites orientados a conteúdo (blogs, documentações, sites de marketing)
  • Implementando arquitetura de ilhas com hidratação seletiva
  • Usando ilhas de servidor (server:defer) para renderização adiada no servidor
  • Criando coleções de conteúdo com a API Content Layer (loaders, glob, file)
  • Configurando SSR com adaptadores (Node, Vercel, Netlify, Cloudflare)
  • Construindo endpoints de API e ações do servidor
  • Implementando transições de visualização para navegação semelhante a SPA
  • Gerenciando sessões no lado do servidor para estado do usuário
  • Configurando variáveis de ambiente type-safe com astro:env
  • Configurando roteamento i18n para sites multilíngues
  • Integrando frameworks de UI (React, Vue, Svelte, Solid)
  • Otimizando imagens e desempenho
  • Configurando astro.config.mjs
  • Construindo coleções de dados ao vivo com Live Loaders

Fluxo de Trabalho Principal

  1. Analisar requisitos → Identificar conteúdo estático vs dinâmico, necessidades de hidratação, fontes de dados
  2. Projetar estrutura → Planejar páginas, layouts, componentes, coleções de conteúdo com loaders
  3. Implementar componentes → Criar componentes Astro com diretivas cliente/servidor adequadas
  4. Configurar roteamento → Configurar roteamento baseado em arquivos, rotas dinâmicas, endpoints, i18n
  5. Otimizar entrega → Configurar adaptadores, otimização de imagens, transições de visualização, cache

Estruturas de Decisão do Especialista

Seleção do Modo de Saída

Astro tem apenas dois modos de saída: static (padrão) e server. Não existe modo hybrid. O comportamento antigo "híbrido" agora é o padrão: permaneça em static, adicione um adaptador e opte por rotas individuais para renderização sob demanda com export const prerender = false.

output: 'static'  (padrão — a escolha certa para quase todos os sites)
├── Pré-renderiza cada página para HTML no momento da construção
├── Blog, documentação, landing, portfólios, marketing, catálogos de e-commerce
├── Precisa de algumas rotas no momento da requisição (login, dashboard, API, carrinho/checkout)?
│   └── Adicione um adaptador + `export const prerender = false` apenas nessas rotas
└── Use ilhas de servidor (`server:defer`) para fragmentos personalizados, assim a
    página ao redor permanece estática e armazenável em cache

output: 'server'  (apenas quando a MAIORIA das páginas precisa de dados da requisição)
├── Cada página renderiza sob demanda; opte por saída por rota com
│   `export const prerender = true`
├── SaaS completo/dashboard atrás de autenticação, aplicativos principalmente dinâmicos
└── Aviso: páginas não pré-renderizadas perdem cache de HTML estático / CDN

Sinais de que você escolheu errado:

  • Construções lentas/enormes com getStaticPaths → permaneça em static; mova as rotas pesadas/dinâmicas para prerender = false
  • No modo server mas usando prerender = true em >50% das páginas → volte para static (o padrão)
  • App inteiro em server mas apenas 2 páginas leem cookies → mude para static + prerender = false nessas 2

Estratégia de Hidratação — Erros Comuns

  • client:visible no hero/header → Já está na viewport no momento do carregamento, então hidrata imediatamente de qualquer forma. Use client:load diretamente e pule a sobrecarga do IntersectionObserver.
  • client:idle em dispositivos móveis → requestIdleCallback em dispositivos com pouca RAM pode levar mais de 10 segundos. Para qualquer coisa com que o usuário possa interagir nos primeiros 5 segundos, use client:load.
  • Componente React grande com client:load → Se o bundle >50KB, considere dividir: renderize a estrutura estática em Astro, hidrate apenas a parte interativa. Ou use client:idle se estiver abaixo da dobra.
  • Hidratando navbars/footers → Se a única interatividade é um alternador de menu móvel, escreva em JavaScript vanilla dentro de uma tag <script> em vez de hidratar um componente React inteiro.

Ilhas de Servidor vs Ilhas de Cliente vs Estático

O componente precisa de dados do servidor em CADA requisição?
(cookies, sessão do usuário, consulta DB, personalização)
│
├── Sim → server:defer (Ilha de Servidor)
│   ├── Avatares de usuário, barras de saudação, contagens de carrinho
│   ├── Recomendações personalizadas em páginas de produto
│   └── Variantes de teste A/B resolvidas no servidor
│
└── Não → Precisa de interatividade no navegador?
    │
    ├── Sim → diretiva client:* (Ilha de Cliente)
    │   ├── Caixas de busca, formulários com validação
    │   ├── Carrosséis de imagens, gráficos interativos
    │   └── Qualquer coisa que precise de onClick/onChange/estado
    │
    └── Não → Sem diretiva (HTML estático, zero JS)
        ├── Navegação, rodapés, seções de conteúdo
        ├── Cards, listas, texto formatado
        └── Isso deve ser ~90% da maioria dos sites

O padrão de e-commerce: Página de produto é estática (título, imagens, descrição) + server:defer para preço/estoque (muda com frequência) + client:load para botão de adicionar ao carrinho (precisa de interatividade). Três estratégias de renderização em uma página.

Quando NÃO Usar Astro

Astro se destaca em sites com muito conteúdo e ilhas de interatividade. Considere outros frameworks quando:

  • O app é uma SPA completa com roteamento no lado do cliente e estado pesado (→ Next.js, SvelteKit, Remix)
  • Funcionalidades colaborativas em tempo real são essenciais (→ Next.js + WebSockets)
  • Cada página está atrás de autenticação sem conteúdo público (→ framework SPA)
  • Você precisa de React Server Components (→ Next.js)

Coleções de Conteúdo — Seleção de Loader

Arquivos markdown/MDX locais → loader glob()
Arquivo JSON/YAML único → loader file()
Dados de API/CMS remotos no momento da construção → Função de loader assíncrona personalizada
Dados remotos que devem estar frescos por requisição → Live Loader (Astro 6+)

Dica de desempenho: Para sites com >1000 entradas de conteúdo, use glob() com retainBody: false se você não precisar do corpo markdown bruto — reduz significativamente o tamanho do armazenamento de dados.

Novo no Astro 6 (estável)

Estes foram promovidos de flags experimentais para estáveis no Astro 6 — use-os diretamente:

  • Content Security Policy — security.csp em astro.config.mjs gera automaticamente hashes para seus scripts/estilos → reference/configuration-reference/#securitycsp
  • API de Fontes — otimização de fontes embutida para fontes auto-hospedadas e de provedores, sem mudança de layout → guides/fonts
  • Coleções de Conteúdo Ao Vivo — busca de conteúdo no momento da requisição na camada de conteúdo via defineLiveCollection em src/live.config.ts → guides/content-collections

Astro 6 também requer Node 22+ (Node 18 e 20 foram descartados) e inclui Zod 4 via astro/zod (astro:schema e z de astro:content estão obsoletos).

Documentação de Referência

Carregue orientação detalhada com base na sua tarefa atual:

TópicoReferênciaQuando Carregar
Componentesreferences/components.mdEscrevendo componentes Astro, Props, slots, expressões
Diretivas de Clientereferences/client-directives.mdEstratégias de hidratação, client:load, client:visible, client:idle
Coleções de Conteúdoreferences/content-collections.mdAPI Content Layer, loaders, schemas, getCollection, getEntry, live loaders
Roteamentoreferences/routing.mdPáginas, rotas dinâmicas, endpoints, redirecionamentos
SSR e Adaptadoresreferences/ssr-adapters.mdRenderização sob demanda, adaptadores, ilhas de servidor, sessões
Ilhas de Servidorreferences/server-islands.mdserver:defer, conteúdo de fallback, renderização adiada
Sessõesreferences/sessions.mdAstro.session, estado no lado do servidor, carrinhos de compras
Transições de Visualizaçãoreferences/view-transitions.mdClientRouter, animações, diretivas de transição
Açõesreferences/actions.mdManipulação de formulários, defineAction, validação
Middlewarereferences/middleware.mdonRequest, sequence, context.locals
Estilizaçãoreferences/styling.mdCSS com escopo, estilos globais, class:list
Imagensreferences/images.md<Image />, <Picture />, otimização
Configuraçãoreferences/configuration.mdastro.config.mjs, TypeScript, variáveis de ambiente
Variáveis de Ambientereferences/environment-variables.mdastro:env, envField, schema de env type-safe
Roteamento i18nreferences/i18n-routing.mdSites multilíngues, locales, helpers astro:i18n

Diretrizes por Contexto

Regras específicas de contexto estão disponíveis no diretório rules/:

  • rules/astro-components.rule.md → Padrões de estrutura de componentes
  • rules/client-hydration.rule.md → Decisões de estratégia de hidratação
  • rules/content-collections.rule.md → Melhores práticas de schema de coleções (API Content Layer)
  • rules/astro-routing.rule.md → Padrões de roteamento e rotas dinâmicas
  • rules/astro-ssr.rule.md → Configuração SSR e adaptadores
  • rules/astro-images.rule.md → Padrões de otimização de imagens
  • rules/astro-typescript.rule.md → Configuração TypeScript
  • rules/server-islands.rule.md → Padrões de ilhas de servidor e server:defer
  • rules/sessions.rule.md → Gerenciamento de sessão no lado do servidor

Regras Críticas

DEVE FAZER

  • Use arquitetura de ilhas — hidrate apenas componentes interativos
  • Escolha diretivas de cliente apropriadas com base nas necessidades de interação
  • Use server:defer para conteúdo personalizado/dinâmico em páginas estáticas
  • Defina schemas de coleção de conteúdo com Zod para segurança de tipos
  • Use a API Content Layer com loaders (glob, file) em src/content.config.ts
  • Importe Zod de astro/zod e renderize de astro:content
  • Use <Image /> e <Picture /> para imagens otimizadas
  • Implemente limites de erro adequados para componentes de cliente
  • Use TypeScript com modo estrito para segurança de tipos
  • Configure o adaptador apropriado para o alvo de deploy
  • Use Astro.props para passagem de dados de componentes
  • Use schema astro:env para variáveis de ambiente type-safe
  • Use Astro.session para gerenciamento de estado no lado do servidor

NÃO DEVE FAZER

  • Hidratar componentes que não precisam de interatividade (use client: apenas quando necessário)
  • Usar client:only sem especificar o framework
  • Importar imagens com caminhos de string (use declarações de import)
  • Pular validação de schema em coleções de conteúdo
  • Usar output: 'hybrid' — não é um modo válido; use static (padrão) com prerender = false por rota, ou server com prerender = true
  • Acessar Astro.request em páginas pré-renderizadas
  • Usar APIs do navegador no frontmatter do componente (código do lado do servidor)
  • Esquecer de instalar adaptadores para deploy SSR
  • Passar funções como props para componentes server:defer (não serializável)
  • Acessar Astro.session em páginas pré-renderizadas (requer renderização sob demanda)
  • Usar src/content/config.ts para novos projetos (use src/content.config.ts com loaders)

Referência Rápida

Estrutura de Componente

---
// Script do Componente (executa no servidor)
interface Props {
  title: string;
  count?: number;
}
const { title, count = 0 } = Astro.props;
const data = await fetch('https://api.example.com/data');
---

<!-- Template do Componente -->
<div>
  <h1>{title}</h1>
  <p>Count: {count}</p>
</div>

<style>
  /* Escopado por padrão */
  h1 { color: navy; }
</style>

Prioridade de Diretiva

  1. Sem diretiva → HTML estático, zero JavaScript
  2. server:defer → Renderização adiada no servidor (ilha de servidor)
  3. client:load → Hidratar imediatamente no carregamento da página
  4. client:idle → Hidratar quando o navegador estiver ocioso
  5. client:visible → Hidratar quando o componente entrar na viewport
  6. client:media → Hidratar quando a media query corresponder
  7. client:only → Pular SSR, renderizar apenas no cliente

Schema de Coleção de Conteúdo

// src/content.config.ts
import { defineCollection } from 'astro:content';
import { glob } from 'astro/loaders';
import { z } from 'astro/zod';

const blog = defineCollection({
  loader: glob({ base: './src/content/blog', pattern: '**/*.{md,mdx}' }),
  schema: z.object({
    title: z.string(),
    date: z.coerce.date(),
    draft: z.boolean().default(false),
    tags: z.array(z.string()).optional(),
  }),
});

export const collections = { blog };

Ilha de Servidor

---
import UserAvatar from '../components/UserAvatar.astro';
---

<UserAvatar server:defer>
  <img slot="fallback" src="/generic-avatar.svg" alt="Carregando..." />
</UserAvatar>

Formato de Saída

Ao implementar recursos do Astro, forneça:

  1. Arquivo do componente (.astro com frontmatter e template)
  2. Atualizações de configuração (astro.config.mjs se necessário)
  3. Schema de coleção de conteúdo (se usar coleções)
  4. Tipos TypeScript (para Props e dados)
  5. Breve explicação da estratégia de hidratação escolhida

Tecnologias

Astro 6.x (Node 22+), Arquitetura de Ilhas, API Content Layer (loaders glob/file, coleções de conteúdo ao vivo), Schemas Zod 4 (astro/zod), API View Transitions, Ilhas de Servidor (server:defer), Sessões, Ações, Middleware, astro:env (variáveis de ambiente type-safe), Content Security Policy (security.csp), API de Fontes, Roteamento i18n, Adaptadores (Node, Vercel, Netlify, Cloudflare, Deno), Integrações React/Vue/Svelte/Solid, Otimização de Imagens, MDX, Markdoc, TypeScript, CSS com Escopo, Tailwind CSS

Habilidades Relacionadas