Para instalar automáticamente Astro Sitemap
npx astro add sitemap
Configurar SEO en Astro antes de enviar tu proyecto a producción marca la diferencia entre un sitio invisible y uno que Google, redes sociales y lectores RSS puedan descubrir. Aquí aprendes a estructurar el head, integrar Open Graph, generar tu feed RSS y crear un sitemap. Es una guía práctica para desarrolladores que quieren cumplir con los estándares mínimos de optimización.
¿Cómo crear un componente BaseHead con metadatos SEO en Astro?
El primer paso es centralizar toda la configuración SEO en un único componente reutilizable. Así, cada página hereda los metadatos sin que tengas que repetir código.
En src/components creas un archivo llamado BaseHead.astro y pegas el bloque de código que se entrega como recurso. En la parte superior defines tres props clave que llegan desde Astro.props: title, description y la URL canónica.
js const { title, description } = Astro.props; const canonicalURL = new URL(Astro.url.pathname, Astro.site);
La URL canónica le dice a los buscadores cuál es la dirección original de tu contenido, algo crítico si alguien copia tus tips.
¿Qué es una URL canónica y para qué sirve? Es la dirección oficial de una página. Si Google detecta contenido duplicado en otro sitio, la URL canónica le indica cuál es la fuente principal y evita que tu SEO se vea afectado.
¿Qué metadatos básicos debe tener tu head?
Dentro de BaseHead se incluyen elementos que cumplen funciones específicas:
UTF-8 para soportar acentos y emojis del español latinoamericano.viewport para que Tailwind aplique reglas responsive en mobile, tablet y desktop.title y description dinámicos desde props.No necesitas diseñar cada icono a mano. Con un solo PNG de 512x512 píxeles puedes generar todos los formatos en herramientas online recomendadas en la sección de recursos.
¿Cómo añadir Open Graph y Twitter Cards para previews en redes sociales?
Open Graph es el estándar que permite previsualizar tu URL al compartirla en WhatsApp, Facebook o LinkedIn. Cuando pegas un enlace y aparece una imagen con título y descripción, eso es Open Graph trabajando.
La estructura incluye etiquetas como og:type, og:url, og:title, og:description y la famosa og:image. Esta última es la imagen que aparece en el preview, conocida también como OG image.
Twitter usa su propio estándar con metas twitter:card, twitter:title, twitter:image y dos campos importantes: twitter:creator y twitter:site. El primero es tu usuario personal, el segundo puede ser la cuenta de la empresa o marca. Recuerda reemplazar el usuario de ejemplo por el tuyo.
¿Qué diferencia hay entre Open Graph y Twitter Cards? Open Graph es el estándar genérico que usan Facebook, WhatsApp y la mayoría de plataformas. Twitter Cards es la versión específica de Twitter, con campos adicionales como creator y site para atribución.
¿Cómo integrar BaseHead en tu layout principal?
En tu layout base haces el import del componente y le pasas las props:
astro <BaseHead title="Astro Tips" description="My First Pitch" />
También debes cambiar el atributo lang del HTML a es porque tu sitio está en español.
Si al ejecutar npm run dev aparece un error de invalid URL en una línea extraña, no te confíes del número que marca el log. El problema está en new URL porque falta declarar el site en astro.config:
js export default defineConfig({ site: 'https://astrobuild.tips' });
¿Cómo generar un feed RSS y un sitemap en Astro?
Un feed RSS permite que lectores y agregadores se enteren cuando publicas contenido nuevo. El sitemap, en cambio, es el mapa que Google y otros buscadores usan para indexar tu sitio.
Primero instalas la integración oficial:
bash npm install @astrojs/rss@2.1.0
Dentro de src/pages creas un archivo rss.xml.js con esta estructura:
js import rss from '@astrojs/rss'; import { getCollection } from 'astro:content';
export async function get(context) {
const post = await getCollection('tips');
return rss({
title: 'Astro Build.Tips',
description: 'My First Page',
site: context.site,
items: post.map((post) => ({
...post.data,
link: /post/${post.slug}/
}))
});
}
La función getCollection trae cada tip de tu carpeta content/tips y los mapea con su slug correspondiente.
¿Cómo añadir el sitemap automático?
La integración del sitemap es aún más sencilla:
bash npm install @astrojs/sitemap@1.0.1
En astro.config importas y registras la integración:
js import sitemap from '@astrojs/sitemap';
export default defineConfig({ site: 'https://astrobuild.tips', integrations: [sitemap()] });
Al ejecutar npm run build se generan automáticamente rss.xml y los archivos del sitemap dentro de la carpeta dist. Todo el proceso tarda alrededor de 3.14 segundos.
Un detalle importante: revisa que no queden console.log olvidados en tu proyecto, porque aparecen en cada build y no es buena práctica dejarlos.
Habilidades y conceptos clave de la clase
new URL(Astro.url.pathname, Astro.site) [02:15].creator y site para atribución [05:40].astro.config para evitar el error invalid URL [08:10].¿Ya tienes tu sitio listo con estos metadatos? Cuéntame en los comentarios qué integraciones SEO sumarías además del RSS y el sitemap.
Configurar SEO en Astro antes de enviar tu proyecto a producción marca la diferencia entre un sitio invisible y uno que Google, redes sociales y lectores RSS puedan descubrir. Aquí aprendes a estructurar el head, integrar Open Graph, generar tu feed RSS y crear un sitemap. Es una guía práctica para desarrolladores que quieren cumplir con los estándares mínimos de optimización.
El primer paso es centralizar toda la configuración SEO en un único componente reutilizable. Así, cada página hereda los metadatos sin que tengas que repetir código.
En src/components creas un archivo llamado BaseHead.astro y pegas el bloque de código que se entrega como recurso. En la parte superior defines tres props clave que llegan desde Astro.props: title, description y la URL canónica.
js const { title, description } = Astro.props; const canonicalURL = new URL(Astro.url.pathname, Astro.site);
La URL canónica le dice a los buscadores cuál es la dirección original de tu contenido, algo crítico si alguien copia tus tips.
¿Qué es una URL canónica y para qué sirve? Es la dirección oficial de una página. Si Google detecta contenido duplicado en otro sitio, la URL canónica le indica cuál es la fuente principal y evita que tu SEO se vea afectado.
Dentro de BaseHead se incluyen elementos que cumplen funciones específicas:
UTF-8 para soportar acentos y emojis del español latinoamericano.viewport para que Tailwind aplique reglas responsive en mobile, tablet y desktop.title y description dinámicos desde props.No necesitas diseñar cada icono a mano. Con un solo PNG de 512x512 píxeles puedes generar todos los formatos en herramientas online recomendadas en la sección de recursos.
Open Graph es el estándar que permite previsualizar tu URL al compartirla en WhatsApp, Facebook o LinkedIn. Cuando pegas un enlace y aparece una imagen con título y descripción, eso es Open Graph trabajando.
La estructura incluye etiquetas como og:type, og:url, og:title, og:description y la famosa og:image. Esta última es la imagen que aparece en el preview, conocida también como OG image.
Twitter usa su propio estándar con metas twitter:card, twitter:title, twitter:image y dos campos importantes: twitter:creator y twitter:site. El primero es tu usuario personal, el segundo puede ser la cuenta de la empresa o marca. Recuerda reemplazar el usuario de ejemplo por el tuyo.
¿Qué diferencia hay entre Open Graph y Twitter Cards? Open Graph es el estándar genérico que usan Facebook, WhatsApp y la mayoría de plataformas. Twitter Cards es la versión específica de Twitter, con campos adicionales como creator y site para atribución.
En tu layout base haces el import del componente y le pasas las props:
astro <BaseHead title="Astro Tips" description="My First Pitch" />
También debes cambiar el atributo lang del HTML a es porque tu sitio está en español.
Si al ejecutar npm run dev aparece un error de invalid URL en una línea extraña, no te confíes del número que marca el log. El problema está en new URL porque falta declarar el site en astro.config:
js export default defineConfig({ site: 'https://astrobuild.tips' });
Un feed RSS permite que lectores y agregadores se enteren cuando publicas contenido nuevo. El sitemap, en cambio, es el mapa que Google y otros buscadores usan para indexar tu sitio.
Primero instalas la integración oficial:
bash npm install @astrojs/rss@2.1.0
Dentro de src/pages creas un archivo rss.xml.js con esta estructura:
js import rss from '@astrojs/rss'; import { getCollection } from 'astro:content';
export async function get(context) {
const post = await getCollection('tips');
return rss({
title: 'Astro Build.Tips',
description: 'My First Page',
site: context.site,
items: post.map((post) => ({
...post.data,
link: /post/${post.slug}/
}))
});
}
La función getCollection trae cada tip de tu carpeta content/tips y los mapea con su slug correspondiente.
La integración del sitemap es aún más sencilla:
bash npm install @astrojs/sitemap@1.0.1
En astro.config importas y registras la integración:
js import sitemap from '@astrojs/sitemap';
export default defineConfig({ site: 'https://astrobuild.tips', integrations: [sitemap()] });
Al ejecutar npm run build se generan automáticamente rss.xml y los archivos del sitemap dentro de la carpeta dist. Todo el proceso tarda alrededor de 3.14 segundos.
Un detalle importante: revisa que no queden console.log olvidados en tu proyecto, porque aparecen en cada build y no es buena práctica dejarlos.
new URL(Astro.url.pathname, Astro.site) [02:15].creator y site para atribución [05:40].astro.config para evitar el error invalid URL [08:10].¿Ya tienes tu sitio listo con estos metadatos? Cuéntame en los comentarios qué integraciones SEO sumarías además del RSS y el sitemap.
Para instalar automáticamente Astro Sitemap
npx astro add sitemap
Si no tienen un dominio para su sitio, pueden colocar el del localhost:
export default defineConfig({
site: 'https://localhost:3000',
integrations: [tailwind(), mdx(), react(), vue(), svelte()],
})
Les dejo el código
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<!-- Primary Meta Tags -->
<title>{title}</title>
<meta name="title" content={title} />
<meta name="description" content={description} />
<link rel="canonical" href={canonicalURL} />
<!-- Global Metadata -->
<link rel="icon" href="/favicon.png" />
<link rel="apple-touch-icon" href="/images/icon/192x192.png" />
<link rel="manifest" href="/manifest.webmanifest" />
<meta name="google" content="notranslate" />
<link rel="apple-touch-icon" sizes="57x57" href="/apple-icon-57x57.png" />
<link rel="apple-touch-icon" sizes="60x60" href="/apple-icon-60x60.png" />
<link rel="apple-touch-icon" sizes="72x72" href="/apple-icon-72x72.png" />
<link rel="apple-touch-icon" sizes="76x76" href="/apple-icon-76x76.png" />
<link rel="apple-touch-icon" sizes="114x114" href="/apple-icon-114x114.png" />
<link rel="apple-touch-icon" sizes="120x120" href="/apple-icon-120x120.png" />
<link rel="apple-touch-icon" sizes="144x144" href="/apple-icon-144x144.png" />
<link rel="apple-touch-icon" sizes="152x152" href="/apple-icon-152x152.png" />
<link rel="apple-touch-icon" sizes="180x180" href="/apple-icon-180x180.png" />
<link
rel="icon"
type="image/png"
sizes="192x192"
href="/android-icon-192x192.png"
/>
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png" />
<link rel="icon" type="image/png" sizes="96x96" href="/favicon-96x96.png" />
<link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png" />
<meta name="msapplication-TileColor" content="#2b5797" />
<meta name="theme-color" content="#ffffff" />
<!-- Open Graph / Facebook -->
<meta property="og:locale" content="es_ES" />
<meta property="og:type" content="website" />
<meta property="og:url" content={canonicalURL} />
<meta property="og:title" content={title} />
<meta property="og:description" content={description} />
<meta property="og:image" content="" />
<!-- Twitter -->
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:title" content={title} />
<meta name="twitter:description" content={description} />
<meta name="twitter:image" content="" />
<meta name="twitter:image:alt" content={title} />
<meta name="twitter:site" content="@gndx" />
<meta name="twitter:creator" content="@gndx" />
</head>
Buscando una herramienta como la que indica el instructor del curso para generar los favicon encontré la siguiente:
https://en.rakko.tools/tools/69/
espero les sirva!
Durante la planeación de un sitio web, generalmente en un ciclo de vida de software, se habla de posicionamiento de un sitio o producto web. .
ℹ️ Definición SEO es la abreviación de Search Engine Optimization (optimización en motores de búsqueda), describiendo al conjunto de técnicas y estrategias centradas en optimizar el posicionamiento orgánico en búsquedas de internet.
. Contar con una producto web para tu marca o empresa es la base de cualquier presencia digital, pero el esfuerzo de crearla no sirve de nada si no te aseguras de que tu audiencia la encuentre, es decir, que orgánicamente en su intención de búsqueda sea encontrada. .
Si bien, el uso de navegadores modernos como Google nos parece de uso común, su significado e implementación se ha establecido desde las primeras épocas del Internet. . La mayoría de los productos web tienen en común un mismo objetivo: atraer tráfico de calidad. . La Ingeniería moderna explica que hay métodos y herramientas que aportan al desarrollo web, pero empleo de la herramienta, correctamente, significará en un diferenciador moderno donde la brecha entre productos similares son su marketing o formas de ventas. .
Entender qué es el SEO, es el primer paso en una estrategia de posicionamiento web, implicando en números de usuarios como audiencia. Algunos beneficios del SEO son: .
.
ℹ️ Definición Open Graph es una herramienta que permite mostrar cualquier producto web con un formato para previsualización como enlace a tu aplicación.
. Siendo etiquetas de HTML, son metadatos de un producto que solamente son entendibles entre los robots de procesamiento que procesan contenidos en la web. . Gracias a este recurso, los expertos en marketing pueden brindarle a los buscadores y a los usuarios detalles específicos y simples como el título de la página o la duración de un video en particular. . El propósito de Open Graph es ayudar en la mejora de experiencia de usuario y la visualización de los contenidos sin importar de qué producto web se trate. . Uno de las influencias más importantes que tiene las Open Graph es precisamente generar un impacto sustancial en las conversiones y las tasas de clics gracias a la optimización de las estrategias SEO.
Alguien revisa estos quiz?
En el archivo rss.xml.js con astro v4 el método get debe escribirse en mayusculas: GET
Las etiquetas core o de Facebook son:
og:title
Etiqueta encargada de señalar el propósito del producto web, la cual debe ser claro y conciso, con un máximo de 67 caracteres.
,og:description
Etiqueta encargada de informar con mayor extensión sobre el contenido del producto web, con un máximo de 155 caracteres.
,og:url
Etiqueta encargada de entregar la URL del producto web.
,og:image
Etiqueta encargada de complementar la visualización de un producto web, sirviendo como referencia para la atracción por representación.
,**og:type**
Etiqueta encargada de explicar el tipo de contenido como clasificación.
,📌 Referencia
- Tags Open Graph: qué son y cómo impactan el SEO
- Open Graph | ¿Qué es y cómo influye en SEO? | SEO Alive
.
Para su implementación en Astro, se puede disponer como componente y cuyo nombre le antecedería un _ , debido a su denotación como meta-documento.
.
Se recomienda agrupar cada meta-documento según su propósito para su facilidad de modificación.
.
./src/components/sections/meta/_OGFacebook.astro
---
const { title, description } = Astro.props
const canonicalURL = new URL(Astro.url.pathname, Astro.site)
const socialImageURL = new URL('/coffeeroasters.png', Astro.url)
---
<meta property="og:locale" content="es_ES" />
<meta property="og:type" content="website" />
<meta property="og:url" content={canonicalURL} />
<meta property="og:title" content={title} />
<meta property="og:description" content={description} />
<meta property="og:image" content={socialImageURL} />
.
./src/components/sections/meta/_OGTwitter.astro
---
const { title, description } = Astro.props
const socialImageURL = new URL('/coffeeroasters.png', Astro.url)
---
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:title" content={title} />
<meta name="twitter:description" content={description} />
<meta name="twitter:image" content={socialImageURL} />
<meta name="twitter:image:alt" content={title} />
<meta name="twitter:site" content="" />
<meta name="twitter:creator" content="" />
.
./src/components/sections/meta/_site.astro
---
const { title, description } = Astro.props
const canonicalURL = new URL(Astro.url.pathname, Astro.site)
---
<meta name='title' content={title} />
<meta name='description' content={description} />
<link rel="canonical" href={canonicalURL} />
,
📌 Referencia Se emplea la clase URL de JavaScript para la personalización conical a partir de objetos globales URL de Astro. API Reference
. Un requerimiento del SEO de nuestro producto web, es la manipulación por dispositivo cliente que consumiera nuestro contenido. Por ello, se recomienda la generación de iconografía de nuestro favicon (por pestaña o por descarga del mismo). ,
📌 Referencia Favicon Generator for perfect icons on all browsers
.
Una vez generados, los disponemos dentro de nuestro directorio public .
.
./src/components/sections/meta/_global.astro
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png">
<link rel="manifest" href="/site.webmanifest">
<link rel="mask-icon" href="/safari-pinned-tab.svg" color="#5bbad5">
<meta name="msapplication-TileColor" content="#da532c">
<meta name="theme-color" content="#ffffff">
Finalmente, los incorporamos en nuestro layout por default del sitio (o de aquello que emplearan los meta-documentos).
---
import GlobalMeta from '@components/sections/meta/_global.astro'
import SiteMeta from '@components/sections/meta/_site.astro'
import OGFacebook from '@components/sections/meta/_OGFacebook.astro'
import OGTwitter from '@components/sections/meta/_OGTwitter.astro'
const title = 'Coffeeroasters'
const description = 'Website for coffee lovers'
---
<!DOCTYPE html>
<html lang='en'>
<head>
<meta charset='UTF-8' />
<meta name='viewport' content='width=device-width' />
<link rel='icon' type='image/svg+xml' href='/favicon.svg' />
<link rel='preconnect' href='https://fonts.googleapis.com' />
<link rel='preconnect' href='https://fonts.gstatic.com' crossorigin />
<link
href='https://fonts.googleapis.com/css2?family=Barlow:wght@400;500&family=Fraunces:wght@700&display=swap'
rel='stylesheet'
/>
<title>{title}</title>
<GlobalMeta />
<SiteMeta title={title} description={description} />
<OGFacebook title={title} description={description} />
<OGTwitter title={title} description={description} />
</head>
<body>
<slot />
</body>
</html>
Asegurense de usar pubDate y title en sus archivos markdown caso contrario podrian tener problemas al integrar @astrojs/rss
Disculpa ¿cuál es el enlace a la pagina web que genera todos los iconos para diferentes tamaños?
Alfredo Jose Mendez
Buscando una herramienta como la que indica el instructor del curso para generar los favicon encontré la siguiente:
https://en.rakko.tools/tools/69/
espero les sirva!
Juan Diaz
Yo uso Real Favicon Generator
Carlos Silva
Alguien revisa estos quiz?
Sergio Andrés Majé Franco
En el archivo rss.xml.js con astro v4 el método get debe escribirse en mayusculas: GET
Daniel Alejandro Maurel Castillo
Gracias, con esto ya me genera el rss.xml !
Alfredo Jose Mendez
Asegurense de usar pubDate y title en sus archivos markdown caso contrario podrian tener problemas al integrar @astrojs/rss
analitica gc
me has salvado la vida, no encontraba el error y cuando vi habia puesto titulo en muchas partes de mis archivos en vez de title; mucha pero muchas gracias por este tremendo dato. Un abrazo.
Martín Gutiérrez Hernández
Disculpa ¿cuál es el enlace a la pagina web que genera todos los iconos para diferentes tamaños?
Jorge Marroquin
Hola Martín. También estoy teniendo dificultades para ubicarlo, pero una buena alternativa podrían ser los íconos disponibles en Google Fonts. ✌️
angelo almeida marrugo
como se agregan las og:image?
Platzi
Se añaden en el head del proyecto con la etiqueta meta usando la propiedad 'content' para especificar la URL de la imagen. Ejemplo: <meta property='og:image' content='URL_de_tu_imagen'>. Es importante asegurar que la imagen represente adecuadamente el contenido del sitio cuando se comparta en redes sociales.
Alonso Americo Molero Colina
Porqué no se hizo integración de rss en el archivo "astro.config.mjs"?
Julio Bastidas
cuando intento hacer build me da el siguiente error [WARN] [router] No API Route handler exists for the method "GET" for the route "/rss.xml".
Found handlers: "get"
y el archivo del rss no se genera dentro de public
Juan Diaz
Les comparto el blog que hice el otro dia cuando estaba aprendiendo a trabajar con Favicon:
Customize the Favicon
Tambien describo el error en el proyecto y como lo solucione. Espero les sirva.
Jose Luis Bedoya
muy buena clase, seguiré explorando mas de astro para optimizar las webs para buscadores!
Miguel Guzmi
Hay un problema con algo, getCollection necesita que los posts estén en la carpeta 'content' como él mismo dice en el video, sin embargo durante todo el curso el los crea en la carpeta 'pages'
Miguel Guzmi
Ahora entiendo porqué esto no tiene lógica, el rss no vale para páginas dinámicas generadas desde un fetching API, es una clase que le falta al curso el consumo de una API, no tiene nada de especial es puro javascript pero estaría bien.
Ameth Ordoñez Erazo
Para instalar automáticamente Astro Sitemap
npx astro add sitemap
Ameth Ordoñez Erazo
Si no tienen un dominio para su sitio, pueden colocar el del localhost:
export default defineConfig({ site: 'https://localhost:3000', integrations: [tailwind(), mdx(), react(), vue(), svelte()], })
Caleb Nuñez Muro
Ese era mi error de porque no se generaban los archivos rss.xml, yo no tengo dominio, lo cambie mi localhost y funciono!
Ameth Ordoñez Erazo
Emmanuel Rodríguez
Integraciones SEO y Open Graph
Durante la planeación de un sitio web, generalmente en un ciclo de vida de software, se habla de posicionamiento de un sitio o producto web. .
ℹ️ Definición SEO es la abreviación de Search Engine Optimization (optimización en motores de búsqueda), describiendo al conjunto de técnicas y estrategias centradas en optimizar el posicionamiento orgánico en búsquedas de internet.
. Contar con una producto web para tu marca o empresa es la base de cualquier presencia digital, pero el esfuerzo de crearla no sirve de nada si no te aseguras de que tu audiencia la encuentre, es decir, que orgánicamente en su intención de búsqueda sea encontrada. .
Orígenes del SEO y la relación con las etiquetas Open Graph
Si bien, el uso de navegadores modernos como Google nos parece de uso común, su significado e implementación se ha establecido desde las primeras épocas del Internet. . La mayoría de los productos web tienen en común un mismo objetivo: atraer tráfico de calidad. . La Ingeniería moderna explica que hay métodos y herramientas que aportan al desarrollo web, pero empleo de la herramienta, correctamente, significará en un diferenciador moderno donde la brecha entre productos similares son su marketing o formas de ventas. .
¿Por qué es importante el SEO?
Entender qué es el SEO, es el primer paso en una estrategia de posicionamiento web, implicando en números de usuarios como audiencia. Algunos beneficios del SEO son: .
.
Etiquetas Open Graph
ℹ️ Definición Open Graph es una herramienta que permite mostrar cualquier producto web con un formato para previsualización como enlace a tu aplicación.
. Siendo etiquetas de HTML, son metadatos de un producto que solamente son entendibles entre los robots de procesamiento que procesan contenidos en la web. . Gracias a este recurso, los expertos en marketing pueden brindarle a los buscadores y a los usuarios detalles específicos y simples como el título de la página o la duración de un video en particular. . El propósito de Open Graph es ayudar en la mejora de experiencia de usuario y la visualización de los contenidos sin importar de qué producto web se trate. . Uno de las influencias más importantes que tiene las Open Graph es precisamente generar un impacto sustancial en las conversiones y las tasas de clics gracias a la optimización de las estrategias SEO.
Emmanuel Rodríguez
angelo almeida marrugo
alguien puede explicar como cologar la og:image de forma dinamica
Cristian David Casas Diaz
Miguel Guzmi
La documentación oficial no lo dice así
Sebastian Carballo
Katherine Langarano
Hola, alguien que tenga el mismo error o que me pueda ayudar por favor, yo tengo 2 errores en los 2 archivos de pages/posts -Property 'data' does not exist on type 'never'. -No overload matches this call. Overload 1 of 2, '(collection: never, filter?: ((entry: never) => entry is never) | undefined): Promise<never[]>', gave the following error. Overload 2 of 2, '(collection: never, filter?: ((entry: never) => unknown) | undefined): Promise<never[]>', gave the following error.
Katherine Langarano
El error es de esta parte: const posts: Post[] = (await getCollection("tips")).sort( (a,b) => a.data.pubDate.valueOf() - b.data.pubDate.valueOf() );
en tips y data
Luis Herrera
¿Qué es un Sitemap y cómo se utiliza en Astro?
Sitemap (Mapa del Sitio) es un archivo XML que enumera todas las páginas de un sitio web, proporcionando información sobre la estructura del sitio y las relaciones entre las páginas. Los sitemaps ayudan a los motores de búsqueda como Google a rastrear y indexar tu sitio web de manera más eficiente.
Uso de Sitemaps en Astro:
Astro puede generar automáticamente un sitemap para tu sitio web, lo que facilita a los motores de búsqueda encontrar y comprender la estructura de tu contenido. Un sitemap es especialmente útil para sitios web grandes o complejos con muchas páginas.
Beneficios de usar Sitemaps con Astro:
Ejemplo práctico:
Cuando usas Astro para generar un sitemap, se crea un archivo XML que contiene todas las URLs de tu sitio web. Este archivo puede incluir información adicional como la última fecha de modificación de cada página, la frecuencia de cambios y la prioridad relativa de las páginas. Luego, puedes enviar este archivo a los motores de búsqueda a través de sus respectivas herramientas para webmasters (como Google Search Console).
Resumen:
Sitemaps en Astro son una herramienta esencial para mejorar la indexación y visibilidad de tu sitio web en los motores de búsqueda. Facilitan que los motores de búsqueda descubran y rastreen todas las páginas de tu sitio, lo que puede resultar en un mejor rendimiento de SEO y una mayor visibilidad en los resultados de búsqueda.
Espero que esta definición y explicación te ayuden a entender mejor qué es un sitemap y cómo puede ser beneficioso para tu sitio web utilizando Astro.
Luis Herrera
¿Qué es RSS y cómo se utiliza en Astro?
RSS (Really Simple Syndication) es un formato que se utiliza para distribuir y compartir contenido web actualizado con frecuencia, como blogs, noticias y otros tipos de publicaciones en línea. Los feeds RSS permiten a los usuarios recibir actualizaciones automáticas de los sitios web que les interesan, sin necesidad de visitarlos manualmente.
Uso de RSS en Astro:
Astro facilita la creación y gestión de feeds RSS para tu sitio web. Si tienes un blog o un sitio web con mucho contenido, un feed RSS proporciona una forma sencilla para que los usuarios se suscriban y reciban automáticamente las actualizaciones cada vez que publicas nuevo contenido.
Beneficios de usar RSS con Astro:
Ejemplo práctico:
Cuando usas Astro para generar un feed RSS, el proceso es rápido y automático. Astro se encarga de crear un archivo XML que contiene todas tus publicaciones recientes. Los usuarios pueden suscribirse a este archivo XML utilizando un lector de RSS, y recibirán notificaciones cada vez que publiques algo nuevo.
Resumen:
RSS en Astro es una herramienta poderosa que simplifica la distribución de contenido y mejora la experiencia del usuario al permitirles suscribirse y recibir actualizaciones automáticas de tus publicaciones.
Les dejo el código
<head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width" /> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <!-- Primary Meta Tags --> <title>{title}</title> <meta name="title" content={title} /> <meta name="description" content={description} /> <link rel="canonical" href={canonicalURL} /> <!-- Global Metadata --> <link rel="icon" href="/favicon.png" /> <link rel="apple-touch-icon" href="/images/icon/192x192.png" /> <link rel="manifest" href="/manifest.webmanifest" /> <meta name="google" content="notranslate" /> <link rel="apple-touch-icon" sizes="57x57" href="/apple-icon-57x57.png" /> <link rel="apple-touch-icon" sizes="60x60" href="/apple-icon-60x60.png" /> <link rel="apple-touch-icon" sizes="72x72" href="/apple-icon-72x72.png" /> <link rel="apple-touch-icon" sizes="76x76" href="/apple-icon-76x76.png" /> <link rel="apple-touch-icon" sizes="114x114" href="/apple-icon-114x114.png" /> <link rel="apple-touch-icon" sizes="120x120" href="/apple-icon-120x120.png" /> <link rel="apple-touch-icon" sizes="144x144" href="/apple-icon-144x144.png" /> <link rel="apple-touch-icon" sizes="152x152" href="/apple-icon-152x152.png" /> <link rel="apple-touch-icon" sizes="180x180" href="/apple-icon-180x180.png" /> <link rel="icon" type="image/png" sizes="192x192" href="/android-icon-192x192.png" /> <link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png" /> <link rel="icon" type="image/png" sizes="96x96" href="/favicon-96x96.png" /> <link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png" /> <meta name="msapplication-TileColor" content="#2b5797" /> <meta name="theme-color" content="#ffffff" /> <!-- Open Graph / Facebook --> <meta property="og:locale" content="es_ES" /> <meta property="og:type" content="website" /> <meta property="og:url" content={canonicalURL} /> <meta property="og:title" content={title} /> <meta property="og:description" content={description} /> <meta property="og:image" content="" /> <!-- Twitter --> <meta name="twitter:card" content="summary_large_image" /> <meta name="twitter:title" content={title} /> <meta name="twitter:description" content={description} /> <meta name="twitter:image" content="" /> <meta name="twitter:image:alt" content={title} /> <meta name="twitter:site" content="@gndx" /> <meta name="twitter:creator" content="@gndx" /> </head>
SEO e Implementación de Open Graph en Astro
Las etiquetas core o de Facebook son:
og:title
Etiqueta encargada de señalar el propósito del producto web, la cual debe ser claro y conciso, con un máximo de 67 caracteres.
,og:description
Etiqueta encargada de informar con mayor extensión sobre el contenido del producto web, con un máximo de 155 caracteres.
,og:url
Etiqueta encargada de entregar la URL del producto web.
,og:image
Etiqueta encargada de complementar la visualización de un producto web, sirviendo como referencia para la atracción por representación.
,**og:type**
Etiqueta encargada de explicar el tipo de contenido como clasificación.
,📌 Referencia
- Tags Open Graph: qué son y cómo impactan el SEO
- Open Graph | ¿Qué es y cómo influye en SEO? | SEO Alive
.
Para su implementación en Astro, se puede disponer como componente y cuyo nombre le antecedería un _ , debido a su denotación como meta-documento.
.
Se recomienda agrupar cada meta-documento según su propósito para su facilidad de modificación.
.
./src/components/sections/meta/_OGFacebook.astro
--- const { title, description } = Astro.props const canonicalURL = new URL(Astro.url.pathname, Astro.site) const socialImageURL = new URL('/coffeeroasters.png', Astro.url) --- <meta property="og:locale" content="es_ES" /> <meta property="og:type" content="website" /> <meta property="og:url" content={canonicalURL} /> <meta property="og:title" content={title} /> <meta property="og:description" content={description} /> <meta property="og:image" content={socialImageURL} />
.
./src/components/sections/meta/_OGTwitter.astro
--- const { title, description } = Astro.props const socialImageURL = new URL('/coffeeroasters.png', Astro.url) --- <meta name="twitter:card" content="summary_large_image" /> <meta name="twitter:title" content={title} /> <meta name="twitter:description" content={description} /> <meta name="twitter:image" content={socialImageURL} /> <meta name="twitter:image:alt" content={title} /> <meta name="twitter:site" content="" /> <meta name="twitter:creator" content="" />
.
./src/components/sections/meta/_site.astro
--- const { title, description } = Astro.props const canonicalURL = new URL(Astro.url.pathname, Astro.site) --- <meta name='title' content={title} /> <meta name='description' content={description} /> <link rel="canonical" href={canonicalURL} />
,
📌 Referencia Se emplea la clase URL de JavaScript para la personalización conical a partir de objetos globales URL de Astro. API Reference
. Un requerimiento del SEO de nuestro producto web, es la manipulación por dispositivo cliente que consumiera nuestro contenido. Por ello, se recomienda la generación de iconografía de nuestro favicon (por pestaña o por descarga del mismo). ,
📌 Referencia Favicon Generator for perfect icons on all browsers
.
Una vez generados, los disponemos dentro de nuestro directorio public .
.
./src/components/sections/meta/_global.astro
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png"> <link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png"> <link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png"> <link rel="manifest" href="/site.webmanifest"> <link rel="mask-icon" href="/safari-pinned-tab.svg" color="#5bbad5"> <meta name="msapplication-TileColor" content="#da532c"> <meta name="theme-color" content="#ffffff">
Finalmente, los incorporamos en nuestro layout por default del sitio (o de aquello que emplearan los meta-documentos).
--- import GlobalMeta from '@components/sections/meta/_global.astro' import SiteMeta from '@components/sections/meta/_site.astro' import OGFacebook from '@components/sections/meta/_OGFacebook.astro' import OGTwitter from '@components/sections/meta/_OGTwitter.astro' const title = 'Coffeeroasters' const description = 'Website for coffee lovers' --- <!DOCTYPE html> <html lang='en'> <head> <meta charset='UTF-8' /> <meta name='viewport' content='width=device-width' /> <link rel='icon' type='image/svg+xml' href='/favicon.svg' /> <link rel='preconnect' href='https://fonts.googleapis.com' /> <link rel='preconnect' href='https://fonts.gstatic.com' crossorigin /> <link href='https://fonts.googleapis.com/css2?family=Barlow:wght@400;500&family=Fraunces:wght@700&display=swap' rel='stylesheet' /> <title>{title}</title> <GlobalMeta /> <SiteMeta title={title} description={description} /> <OGFacebook title={title} description={description} /> <OGTwitter title={title} description={description} /> </head> <body> <slot /> </body> </html>
En la última versión de astro 4.8.2, se deb devolver un Response o un Promise con la función:
Response.json, sino de lo contrarió el endpoint parece no funcionar, por tanto el archivo rss.xml.js quedó así:
import rss from "@astrojs/rss";import { getCollection } from "astro:content";
export async function GET(context) { const posts = await getCollection("tips"); return Response.json({ title: "AstroBuild.tips", description: "First Page", site: context.site, items: posts.map((post) => ({ ...post.data, link: /posts/${post.slug}/, })), });}
import rss from "@astrojs/rss"; import { getCollection } from "astro:content"; export async function GET(context) { const posts = await getCollection("tips"); return Response.json({ title: "AstroBuild.tips", description: "First Page", site: context.site, items: posts.map((post) => ({ ...post.data, link: `/posts/${post.slug}/`, })), }); } ```con este cambio me generó el archivo rss.xml
Here's how you can fix the rss.xml.js file:import rss from '@astrojs/rss';import { getCollection } from 'astro:content';export async function GET(context) {const posts = await getCollection('posts');const rssContent = await rss({title: 'uniDiversidad',description: 'Life blossoms when connected, as knowledge does, and so do we.',site: context.site,items: posts.map((post) => ({...post.data,link: /blog/${post.slug}/,})),});return new Response(rssContent, {headers: {'Content-Type': 'application/xml',},});}
import rss from '@astrojs/rss'; import { getCollection } from 'astro:content'; export async function GET(context) { const posts = await getCollection('posts'); const rssContent = await rss( {title: 'yourBlog', description: 'Life blossoms when connected, as knowledge does, and so do we.', site: context.site, items: posts.map((post) => ({ ...post.data, link: `/blog/${post.slug}/`, })), }); return new Response(rssContent, { headers: { 'Content-Type': 'application/xml', }, }); }
The changes made:* Wrap the rss() function call in a new Response().
Set the correct Content-Type header for XML.
>Con esto lo resolví.
Ojo con los typos en el nombre del archivo.
Mi version tenía uno invisible
rss.xlm.js
en lugar de
rss.xml.js
Yo me confundi y estuve deambulando