Profile Software Services

Introducción a Astro.js: guía para crear tu primera página

En esta guía práctica se explicará qué es Astro.js, por qué es tan rápido, sus características principales y cómo crear tu primera página paso a paso. Veremos sus puntos clave y varios ejemplos de código listos para usar. 

Astro.js se ha convertido en uno de los frameworks más interesantes del ecosistema frontend moderno. Su propuesta suena sencilla: generar HTML estático por defecto, enviar la mínima cantidad de JavaScript posible al navegador y permitirte usar los frameworks que ya conoces (React, Vue, Svelte, etc.) solo donde realmente aportan valor. 

Este post se centrará en tres puntos claves

¿Qué es Astro.js? 

Astro.js es un framework orientado a contenido que genera HTML estático por defecto. En vez de montar una SPA pesada para todo, Astro.js apuesta por: 

Puedes verlo como una evolución moderna de los generadores de sitios estáticos, pero compatible con el ecosistema actual: componentes, layouts, integración con React/Vue/Svelte, soporte para Markdown, etc. 

Para entender Astro.js, debemos conocer estos puntos muy importantes

Qué hace a Astro.js tan potente y relevante hoy en día 

Hay varios motivos por los que Astro.js ha ganado tanta relevancia: 

1. Rendimiento por defecto 

2. SEO más sencillo 

3. Flexibilidad de componentes 

4. Experiencia de desarrollo moderna 

5. Preparado para integraciones y despliegue 

Características clave de Astro.js y cómo usarlas 

A continuación van algunas de las características de Astro.js más utilizadas en el día a día: 

Sistema de rutas basado en archivos 

En Astro, cada archivo en src/pages se convierte en una ruta. No necesitas configurar un router manualmente.

Sistema de rutas basado en archivos Astro.js

Con solo crear estos archivos, ya tienes definidas las rutas principales de tu sitio. 
Sintaxis .astro: frontmatter + markup 

Los archivos .astro tienen dos partes

--- 
// Frontmatter: se ejecuta en servidor/build 
const title = "Mi primera página con Astro.js"; 
const description = "Ejemplo básico para entender la sintaxis de Astro."; 
--- 
<!-- Esto es el contenido (HTML, se renderiza en el cliente) --> 
<html lang="es"> 
<head> 
<meta charset="UTF-8" /> 
<title>{title}</title> 
</head> 
<body> 
<main> 
<h1>{title}</h1> 
<p>{description}</p> 
</main> 
</body> 
</html> 

Componentes reutilizables 

Puedes crear componentes .astro que reciban props y reutilizarlos en distintas páginas. Esto es clave para mantener el código ordenado. 

--- 
// src/components/PostCard.astro 
const { title, date, description } = Astro.props; 
--- 
<article class="post-card"> 
<h3>{title}</h3> 
<p><small>{date}</small></p> 
<p>{description}</p> 
</article> 

Y luego lo usas en una página:

--- 
// src/pages/index.astro 
import PostCard from "../components/PostCard.astro"; 

const posts = [ 
{ 
title: "Introducción a
 Astro.js", date: "2025-02-01", 
description: "Qué es Astro.js, casos de uso y por qué es tan rápido.", 
}, 
{ 
title: "Componentes y layouts en Astro.js", 
date: "2025-02-10", 
description: "Cómo organizar tu proyecto con layouts reutilizables.", 
}, 
]; 
--- 
<html lang="es"> 
<head> 
<meta charset="UTF-8" /> 
<title>Blog técnico con Astro.js</title> 
</head> 
<body> 
<main> 
<header> 
<h1>Blog técnico con Astro.js</h1> 
<p> 
Ejemplo práctico de listado de artículos usando componentes .astro. 
</p> 
</header> 

<section> 
<h2>Artículos recientes</h2> 
<ul> 
{posts.map((post) => ( 
<li> 
<PostCard title={post.title} date={post.date} 
description={post.description} 
/>
</li>
))} 
</ul> 
</section> 
</main> 
</body> 
</html> 

Layouts: estructura común para varias páginas 

Los layouts te permiten definir una estructura común (cabecera, pie, estilos, etc.) y reutilizarla en todas las páginas. 

--- 
// src/layouts/BaseLayout.astro 
const { title } = Astro.props; 
--- 
<html lang="es"> 
<head> 
<meta charset="UTF-8" /> 
<title>{title}</title> 
<link rel="stylesheet" href="/styles/global.css" /> 
</head> 
<body> 
<header class="site-header"> 
<h1>Mi sitio con Astro.js</h1> 
</header> 

<main class="site-main"> 
<slot /> 
</main> 

<footer class="site-footer"> 
<p>© {new Date().getFullYear()} – Ejemplo con Astro.js</p> 
</footer> 
</body> 
</html> 

Y luego en tus páginas usas el layout

--- 
// src/pages/index.astro 
import BaseLayout from "../layouts/BaseLayout.astro"; 

const title = "Inicio – Blog técnico con Astro.js"; 
--- 
<BaseLayout title={title}> 
<section> 
<h2>Bienvenido al blog</h2> 
<p> 
Este es un ejemplo de página que utiliza un layout compartido en Astro.js. 
</p> 
</section> 
</BaseLayout> 

Estilos globales y por componente 

Puedes usar un CSS global o estilos scoped dentro de cada componente .astro

/* public/styles/global.css */ 
body { 
margin: 0; 
font-family: system-ui, -apple-system, BlinkMacSystemFont, sans-serif; 
background: #020617; 
color: #e5e7eb; 
} 

.site-main { 
max-width: 
960px; margin: 0 
auto; 
padding: 2rem 1.5rem 3rem; 
} 

.post-card { 
border-radius: 12px; 
padding: 1rem 1.25rem; 
margin-bottom: 1rem; 
background: #020617; 
border: 1px solid 
#1e293b; 
} 

También puedes definir estilos dentro de un componente: 

--- 
// src/components/PostCard.astro 
const { title, date, description } = Astro.props; 
--- 
<article class="post-card"> 
<h3>{title}</h3> 
<p><small>{date}</small></p> 
<p>{description}</p> 
</article> 

<style> 
.post-card h3 { 
margin: 0 0 
0.25rem; font-size: 
1.1rem; 
} 

.post-card small 
{ opacity: 0.7; 
} 
</style> 

Islas de interactividad (partial hydration) 

Una de las características más potentes de Astro.js es que puedes crear “islas” interactivas usando componentes de React, Vue, etc., y decirle explícitamente cuándo deben hidratarse en el cliente. 

Ejemplo sencillo con un componente de React: 

// src/components/Counter.jsx 
import { useState } from "react"; 
export default function Counter() { 
const [value, setValue] = 
useState(0); return ( 
<div> 
<p>Valor actual: {value}</p> 
<button onClick={() => setValue(value + 1)}> 
Incrementar 
</button> 
</div> 
); 
} 

Uso del componente React en una página Astro 

--- 
// src/pages/interactivo.astro 
import BaseLayout from "../layouts/BaseLayout.astro"; 
import Counter from "../components/Counter.jsx"; 
--- 
<BaseLayout title="Página interactiva con Astro.js"> 
<section> 
<h2>Ejemplo de isla interactiva</h2> 
<p>Este contador es un componente React hidratado en el cliente.</p> 

<Counter client:load /> 
</section> 
</BaseLayout> 

El atributo client:load indica a Astro que debe enviar el JavaScript necesario para ese componente y montarlo al cargar la página. Hay otras variantes como client:idleclient:visible, etc., que controlan cuándo se hidrata para optimizar aún más el rendimiento. 

Crear el proyecto desde cero: pasos rápidos 

Para que todo esto sea más concreto, estos son los comandos básicos que usarías en un proyecto real con Astro.js: 

# Crear proyecto 
npm create astro@latest astro-ejemplo 

# Instalar dependencias 
npm install 

# Ejecutar en desarrollo 
npm run dev 

# Generar build estático 
npm run build 

# Previsualizar build 
npm run preview 

Conclusión 

Astro.js se ha ganado un hueco importante en el ecosistema frontend porque se centra en algo que muchas veces se da por hecho: servir HTML rápido, ligero y optimizado para SEO, sin obligarte a montar una SPA enorme para cualquier cosa. 

Sus puntos clave son: 

En este post hemos visto qué es Astro.js, por qué es interesante y cómo montar un pequeño ejemplo con rutas, componentes, layouts, estilos y una isla interactiva. A partir de aquí, se puede seguir ampliando el proyecto con contenido dinámico, colecciones de contenido, integraciones con APIs externas y despliegues en diferentes plataformas, manteniendo siempre como base la filosofía de Astro.js: menos JavaScript, más rendimiento.

 Si te interesa estar al día en desarrollo web, arquitectura y buenas prácticas en programación, síguenos en nuestras redes sociales y Canal de YouTube.

Salir de la versión móvil