Curso de Astro

Creación del proyecto

npm create astro .

Extensión de astro para Visual Studio Code.

Layouts

En la ruta src/layouts/ podemos definir nuestras plantillas.

./src/layouts/Layout.astro

---
interface Props {
	title: string;
}

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

<!doctype html>
<html lang="en">
	<head>
		<meta charset="UTF-8" />
		<meta name="description" content="Astro description" />
		<meta name="viewport" content="width=device-width" />
		<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
		<meta name="generator" content={Astro.generator} />
		<title>{title}</title>
	</head>
	<body>
		<slot />
	</body>
</html>

Las páginas ubicadas dentro de la carpeta pages se irán cargando dentro del layout, comenzando por index.astro.

---
import Layout from "../layouts/Layout.astro";
---

<Layout title="Welcome to Astro.">
	<main>
		<p>
			Lorem, ipsum dolor sit amet consectetur adipisicing elit. Inventore
			doloribus voluptas aliquid saepe facere eveniet eum, aut culpa nemo
			tempore amet porro tempora! Expedita repellendus, beatae odio ad
			inventore eveniet?
		</p>
	</main>
</Layout>

<style>
	main {
		margin: auto;
		width: 800px;
		max-width: calc(100% - 2rem);
	}
</style>

Routing

En el siguiente código, /page2 es el nombre de la página que vamos a cargar.

<a href="/page2">Ir a página 2</a>

También podemos crear una carpeta llamada page2 que tendrá un fichero llamado index.astro que se cargará cuando lancemos esa ruta.

Componentes

Podemos definir componentes reutilizables dentro de la carpeta components.

./src/components/Box.astro

---
interface Props {
	title: string;
	body: string;
	href: string;
}

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

<div class="box">
	<h2>
		{title}
	</h2>
	<p>
		{body}
	</p>
</div>
<style>
	.box {
		background-color: red;
		width: 300px;
		height: 300px;
	}
</style>

Y así usaríamos el componente:

---
import Box from "../components/Box.astro";
---

<div>
	<Box title="titulo" body="contenido" />
</div>

Cargar imágenes

En Astro, para acceder a la url de una imagen habrá que acceder a la propiedad src del objeto.

---
import foto from "./prueba.png";
---
<div>
	<img src={foto.src} alt="" />
</div>

Compilar

Para que todo funcione correctamente debemos ejecutar los ficheros transpilados en un servidor (localhost, etc), no funcionará sólo haciendo doble click sobre el HTML.

Variables de entorno

Deben declararse con el prefijo PUBLIC_.

PUBLIC_PROJECT_ID=nutri-67afb
PUBLIC_API_KEY=AIzaSyDLQvos1tV9uQNmtP-x8lz_wFd_HQtmxqw

Módulos útiles

Iconify

Colección de iconos fácilmente integrables en Astro.

Para instalarlos:

npm i -D astro-icon

Luego, debemos instalar el juego de iconos que querramos usar:

npm i @iconify-json/mdi

Finalmente, podemosi importar el icono concreto utilizando el siguiente código:

---
import { Icon } from 'astro-icon/components'
---

<Icon name="mdi:home" />

Importar un componente de React

Para añadir el soporte de React, utilizaremos el siguiente comando.

npm run astro add react

Hacer una PWA con Astro

Ejecutamos el siguiente comando:

npm i @vite-pwa/astro

src/layouts/Layout.astro

import { pwaInfo } from "virtual:pwa-info";
---
...
{pwaInfo && <Fragment set:html={pwaInfo.webManifest.linkTag} />}
<script src="/src/pwa.js"></script>

src/pwa.js

import { registerSW } from 'virtual:pwa-register'

registerSW({
  immediate: true,
  onRegisteredSW(swScriptUrl) {
    // eslint-disable-next-line no-console
    console.log('SW registered: ', swScriptUrl)
  },
  onOfflineReady() {
    // eslint-disable-next-line no-console
    console.log('PWA application ready to work offline')
  },
})

astro.config.mjs

En el siguiente fichero, dentro de la función AstroPWA(), metemos el objeto que en este enlace estaba dentro de la función VitePWA().

integrations: [react(),
  AstroPWA({})