Pular para o conteúdo
Beta

Novo layout em fase de testes.

Versão beta

Nova versão do layout do Doug Design

Estamos validando uma nova versão visual do site, com navegação reformulada, leitura mais confortável e foco em desempenho, principalmente em celulares.

O que não muda
Conteúdo editorial, endereços (URLs) das publicações, a Política de Privacidade e as suas preferências de cookies.
O que pode mudar
Por ser uma versão beta, ajustes de visual, acessibilidade e desempenho serão aplicados de forma contínua, com base em medições e no retorno dos leitores.

Encontrou erro de exibição, texto difícil de ler ou lentidão? Conte pela página de contato, informando o endereço da página, o aparelho e o navegador usados.

Programação•5 min de leitura

Astro 5 Content Layer e Server Actions: Guia Prático de Migração e Performance

Guia passo a passo de migração para a nova Content Layer do Astro 5 e implementação de Server Actions seguras com TypeScript.

Lila Dev

Código de migração para a Content Layer e Server Actions no Astro 5
Neste artigo
  1. O que muda no arquivo src/content.config.ts com a nova Content Layer?
  2. Como era no Astro 4 (Sintaxe antiga)
  3. Como fica no Astro 5 (Sintaxe atual recomendada)
  4. Como implementar Server Actions nativas para processamento de formulários seguros?

O Astro 5 reformulou a maneira como projetos gerenciam dados estáticos e dinâmicos com a introdução da Content Layer e a estabilização das Server Actions. Nas versões anteriores, a pasta src/content/ era restrita a arquivos locais Markdown e MDX. Com a nova arquitetura, qualquer fonte de dados — de APIs Headless CMS como Sanity e Strapi até bancos de dados SQL — pode ser consumida com validação de esquema estrita via Zod.

Se você está planejando preparar sua base de código para os próximos lançamentos ou quer entender os fundamentos que antecedem inovações futuras demonstradas na evolução do Astro 7 e sua arquitetura de rotas, este guia cobre a reestruturação das coleções e formulários.

O que muda no arquivo src/content.config.ts com a nova Content Layer?

A principal mudança estrutural é a substituição do utilitário defineCollection baseado no sistema de arquivos implícito pelo carregador explícito glob ou carregadores de API personalizados.

Como era no Astro 4 (Sintaxe antiga)

// src/content/config.ts (Legado)
import { defineCollection, z } from 'astro:content';

const blog = defineCollection({
  type: 'content',
  schema: z.object({
    title: z.string(),
    pubDate: z.date(),
  }),
});

export const collections = { blog };

Como fica no Astro 5 (Sintaxe atual recomendada)

// src/content.config.ts (Astro 5+)
import { defineCollection, z } from 'astro:content';
import { glob } from 'astro/loaders';

const blog = defineCollection({
  loader: glob({ base: './src/content/blog', pattern: '**/*.{md,mdx}' }),
  schema: z.object({
    title: z.string(),
    pubDate: z.coerce.date(),
  }),
});

export const collections = { blog };

Note que o arquivo de configuração foi movido da subpasta para a raiz do código fonte em src/content.config.ts. Essa alteração reduz o tempo de build em projetos com milhares de arquivos, pois o Astro deixa de varrer diretórios não especificados.

Como implementar Server Actions nativas para processamento de formulários seguros?

Antes das Server Actions, enviar formulários para interatividade (como um cadastro de newsletter ou comentários) exigia a criação manual de rotas de API em src/pages/api/newsletter.ts com manipulação de objetos Request e Response.

No Astro 5, você define a ação diretamente no servidor com validação tipada:

// src/actions/index.ts
import { defineAction } from 'astro:actions';
import { z } from 'astro:schema';

export const server = {
  subscribeNewsletter: defineAction({
    accept: 'form',
    input: z.object({
      email: z.string().email('Digite um e-mail válido.'),
    }),
    handler: async (input) => {
      // Integração direta com serviço de e-mail ou banco de dados
      return { success: true, message: `Inscrição confirmada para ${input.email}` };
    },
  }),
};

E no seu componente .astro, o envio é tratado de forma totalmente integrada:

---
import { actions } from 'astro:actions';
const result = Astro.getActionResult(actions.subscribeNewsletter);
---

<form method="POST" action={actions.subscribeNewsletter}>
  <input type="email" name="email" required />
  <button type="submit">Inscrever-se</button>
</form>

{result?.data?.success && <p class="sucesso">{result.data.message}</p>}

A combinação dessa manipulação de ações no servidor com a entrega estática de páginas garante o menor envio de JavaScript possível para o cliente. Se o seu foco é otimizar o ranqueamento e o tempo de carregamento no Google, vale aprofundar na estratégia de rotas dinâmicas, desempenho e SEO no Astro para manter pontuações máximas no Core Web Vitals.

CompartilheWhatsAppXFacebook
Publicidade

Newsletter

Acompanhe sem perder nada

A newsletter está em preparação. Enquanto a integração de inscrição não fica pronta, assine o feed RSS e receba cada nova publicação no seu leitor favorito.

Assinar o RSS

Comentários

Os comentários usam o Giscus e são carregados só quando você pedir.

Continue lendo

Mais em Programação