Astro o framework web para sites estáticos

Astro o framework web para sites estáticos

Astro é um framework moderno, simples e poderoso, que provém uma excelente experiencia de desenvolvimento.


Introdução

Astro é um framework de código aberto criado por Fred Schott e Nate Moore. Cujo foco é facilitar a criação de sites estáticos, sem comprometer a experiência de desenvolvimento e reaproveitando conhecimentos de outras frameworks.

Astro renderiza seu site inteiro para HTML estático durante a construção. O resultado é um website completamente estático com todo o JavaScript removido da página final. Sem a necessidade de uma aplicação JavaScript monolítica, só HTML estático que carrega o mais rápido possível no navegador não importando quantos componentes UI foram usados para gerá-lo. (Fred Schott e Nate Moore, 2021)

Ilhas de Componente

É uma arquitetura Frontend que consiste em renderizar html no servidor (SSR) e pré definir escopos (Ilhas), para injetar JavaScript. Isso é interessante porque hoje a hidratação, que é esse processo de tornar interativo o HTML gerado no servidor, é extremamente custoso e acontece para a página inteira.

Ilhas Astro (ou Ilhas de Componente) é um padrão de arquitetura web em que Astro é pioneiro. A ideia de “arquitetura em ilhas” foi criada em 2019 pela arquiteta frontend da Etsy, Katie Sylor-Miller e expandido nesta postagem pelo criador do Preact, Jason Miller.

As ilhas vem como uma solução para a execução da hidratação parcial. E ela corre basicamente definindo diretivas nos componentes para declará-los como interativos.

Abaixo um exemplo modesto em que eu estou usando um componente React para trocar a cor do botão, todos são o mesmo componente, mas apenas um deles está sendo hidratado:

Sintaxe

Para atingir esse resultado, como dito acima, o Astro usa diretivas, mas isso não é a única inovação proposta. Seguindo a proposta de frameworks estáticas como o Gatsby, ele prove uma maneira de viabilizar a geração estática de sites (SSG) e faz isso introduzindo uma nova sintaxe.

Basicamente ela é um amalgama de html/mdx/vue/svelte com pitadas de PHP a gosto. Tudo que acontece entre a barra tripla ”---” só acontece em tempo de compilação. Isso permite a clara distinção entre cliente e servidor delegando, o que em um SPA seria executado no cliente, para o servidor.

Executando expressões

---
import x from 'x';
const y = x();
---
<div>
{y}
</div>

Acessando o sistema de arquivos

---
import { Post } from '../components/Post.astro';
const posts = await Astro.glob('../pages/**/posts/**/*.mdx');
---
<div>
{posts.map((post) => <Post {...post} />)}
</div>

Consumindo de uma API

---
const resposta = await fetch('https://cms/api/posts');
const posts = await resposta.json();
---
<div>
{posts.map((post) => <Post {...post} />)}
</div>

Componentização

Layouts

Além da barra tripla os componentes do Astro permitem a criação de layouts com html, que no React por exemplo exige o uso de libs como o react-helmet:

<html lang="pt-BR">
<head>
<meta charset="utf-8" />
<meta
content="width=device-width,initial-scale=1,shrink-to-fit=no,viewport-fit=cover"
name="viewport"
/>
</head>
<body>
<slot />
</body>
</html>

Os layouts podem ser reaproveitados tanto dentro de outros componentes quanto dentro dos arquivos Markdown:

---
layout: "./Layout.astro"
---

Estilização

Assim como Svelte e Vue o Astro permite a estilização, seja em escopo ou global, direto dentro dos componentes.

<button class="button">Button</button>
<style>
.button {
cursor: pointer;
}
</style>
<style is:global>
* {
box-sizing: border-box;
}
</style>

Props

Não seria um componente se não houvesse como receber e exigir props. Os componentes do Astro usam o atributo props da variável Astro para acessar os valores das props.

---
export interface Props {
name: string;
msg?: string;
}
const { msg = 'Olá', name } = Astro.props;
---
<h2>{msg}, {name}!</h2>

UI agnóstica

Mas você do pode dizer “eu não quero refazer todos os meus componentes” e é ai que o Astro brilha. Ele te permite adicionar integrações com múltiplas frameworks como:

  • React
  • Vue
  • Svelte
  • Solid
  • Preact

E graças a arquitetura de ilhas de componente você pode escolher se é um componente interativo ou não através das diretivas de template.

---
import { DemoButton } from './DemoButton';
---
<section class="islands-scheme">
<header><DemoButton /></header>
<aside><DemoButton /></aside>
<main><DemoButton client:only="react" /></main>
<footer><DemoButton /></footer>
</section>

Experiência de desenvolvimento

Esse site foi feito usando o Astro, e é incrível como foi simples começar. Ele tem uma config familiar, construída e cima da do vitejs, foi para a maior parte, só procurar as integrações que eu queria e componentizar.

Eu só tive dificuldade com o setup do mermaidjs, mas como a sintaxe dos componentes Astro é html válido eu consegui fazer uma solução funcional, mas ia ser interessante ter esse suporte junto do markdown igual no github/gitlab, talvez com uma geração estática do svg.

Update eu consegui fazer isso com um componente Astro usando mermaid-parse.
(20/10/2022)

Mas a experiência como um todo foi excelente e as soluções propostas para gerenciamento do sistema de arquivos e velocidade de execução fizeram o Gatsby parecer bem defasado e complicado.