Tutorial - Ampliar con colecciones de contenido.
Las colecciones de contenido son una forma poderosa de gestionar grupos de contenido similar, como lo son las publicaciones de un blog. Las colecciones ayudan a organizar tus documentos, validar el contenido de los archivos YAML y proveen seguridad de tipos con TypeScript automáticamente para todo tu contenido (incluso si no escribes nada de TypeScript por tu cuenta).
Prepárate para...
- Mover el directorio de publicaciones del blog en el directorio
src/content/
- Crear un esquema que defina el contenido de la publicación en términos de frontmatter.
- Utilizar el método
getCollection()
para obtener el contenido de tus publicaciones y sus metadatos.
Pre-requisitos
Sección titulada Pre-requisitosNecesitarás un proyecto existente de Astro que incluya archivos Markdown o MDX en el directorio src/pages/
.
Este tutorial utiliza el proyecto de Crear un Blog terminado para demostrar cómo convertir un blog en colecciones de contenido. Puedes clonar y usar la base de código localmente, o completar el tutorial en tu navegador editando el código del tutorial del blog en StackBlitz.
Si lo prefieres, puedes seguir los pasos usando tus propios proyectos, pero, necesitarás realizar algunos ajustes en las instrucciones del código.
Nosotros recomendamos usar nuestro proyecto de ejemplo para terminar este tutorial corto. Después, puedes utilizar lo aprendido para crear colecciones de contenido en tu proyecto.
Código de Construir un Blog
Sección titulada Código de Construir un BlogEn el tutorial introductorio de Crear un Blog, aprendiste acerca del sistema de rutas basado en archivos: cualquier archivo .astro
, .md
, o .mdx
dentro del directorio src/pages/
se convertirá automáticamente en una página en tu sitio.
Para crear tu primera publicación https://example.com/posts/post-1/
, creaste el directorio /posts/
y agregaste el archivo post-1.md
. Después, agregaste un archivo Markdown en este directorio cada que querías agregar un nuevo publicación en tu blog.
Páginas vs Colecciones
Sección titulada Páginas vs ColeccionesIncluso usando colecciones de contenido deberás usar el directorio src/pages/
para cada página individual, tal como la página “Acerca De”. Pero, mover el contenido de tus publicaciones al directorio src/content/
te permitirá utilizar APIs con más características y de mejor rendimiento para generar el indexado de tu blog y mostrar las publicaciones de manera individual.
Al mismo tiempo, recibirás guía y dispondrás autocompletado en tu editor de código porque usarás un esquema para definir la estructura común para cada publicación que Astro te ayudará a implementar. En tu esquema, puedes especificar las propiedades de frontmatter que son necesarias, como la descripción, el autor, y que tipo de dato debe tener cada propiedad, por ejemplo, si es una cadena de texto o un arreglo. Esto ayuda a evitar muchos errores de manera temprana, usando errores descriptivos que te dirán cual es el problema exacto.
Lee más sobre las colecciones de contenido de Astro en nuestra guía, o comienza con las instrucciones a continuación para convertir un blog básico de src/pages/posts/
a src/content/posts/
.
Prueba tu conocimiento
Sección titulada Prueba tu conocimiento-
¿Qué tipo de página guardarías en el directorio
src/pages/
? -
¿Cuál no es una ventaja de mover las publicaciones de un blog a una colección de contenido?
-
Las colecciones de contenido usan TypeScript…
Extendiendo el tutorial del blog con colecciones de contenido.
Sección titulada Extendiendo el tutorial del blog con colecciones de contenido.Los siguientes pasos mostrarán cómo extender el resultado del tutorial Crear un Blog creando colecciones de contenido para las publicaciones del blog.
Actualiza las dependencias
Sección titulada Actualiza las dependencias-
Actualiza a la última versión de Astro y actualiza todas las integraciones a sus últimas versiones ejecutando los siguiente comandos en tu terminal:
Si estás utilizando tu propio proyecto, asegúrate de actualizar cualquier dependencia que tengas instalada. El código del tutorial solo utiliza la integración de Preact.
-
El blog utiliza la configuración
base
de TypeScript (la menos estricta). Para utilizar las colecciones de contenido debes configurar TypeScript, también deberás usar la configuración estrictastrict
o la más estrictastrictest
, o agregar dos opciones en el archivotsconfig.json
.Para utilizar colecciones de contenido sin escribir nada de TypeScript, agrega las siguientes dos líneas al archivo de configuración:
Crear una colección para tus publicaciones del blog.
Sección titulada Crear una colección para tus publicaciones del blog.-
Crea una nueva colección (directorio) llamado
src/content/posts/
. -
Mueve todas las publicaciones de tu blog (archivos
.md
) desrc/pages/posts/
en esta nueva colección. -
Crea el archivo
src/content/config.ts
para definir un esquema para la colecciónpostsCollection
. Para el código que existe en este tutorial, agrega el siguiente contenido al archivo para definir todas las propiedades del frontmatter utilizadas en las entradas de blog:
Generando las páginas de una colección
Sección titulada Generando las páginas de una colección-
Crea un archivo de página llamado
src/pages/posts/[...slug].astro
. Los archivos Markdown y MDX no se convertirán en páginas automáticamente usando el sistema de rutas basado en archivos cuando estos viven en una colección, por eso debes crear una página encargada de generar un blog individual para cada publicación. -
Agrega el siguiente código para consultar tu colección, para hacer que el slug y el contenido de cada publicación del blog estén disponibles para cada página que se genere:
-
La etiqueta
<Content />
renderiza tu publicación con ellayout
para archivos Markdown. Esto te permite especificar una plantilla común para todas tus publicaciones. -
Elimina la definición de
layout
del frontmatter de cada publicación. Ahora, tu contenido está envuelto en un layout al renderizarse, y esta propiedad ya no es necesaria.
Reemplaza Astro.glob()
con getCollection()
Sección titulada Reemplaza Astro.glob() con getCollection()-
En cualquier lugar donde tengas una lista de publicaciones de blog, como la página de blog del tutorial (
src/pages/blog.astro/
), deberás reemplazarAstro.glob()
congetCollection()
como la forma de obtener contenido y metadatos de tus archivos Markdown. -
También necesitarás actualizar las referencias de los datos regresados por cada
post
. Ahora encontrarás los valores de frontmatter en la propiedaddata
de cada objeto. Adicional a esto, cuando utilizas colecciones, cada objetopost
tendrá unslug
por página, no una URL completa. -
El tutorial del proyecto de blog también genera dinámicamente una página para cada etiqueta
src/pages/tags/[tag].astro
y muestra una lista de etiquetassrc/pages/tags/index.astro
.Aplica los mismos cambios de arriba a los siguientes dos archivos:
- Obtén los datos de toda tu colección de publicaciones usando
getCollection("posts")
en vez de usarAstro.glob()
- Accede a las propiedades de frontmatter a través del objeto
data
en vez defrontmatter
- Crea una URL de página agregando el
slug
de la publicación a la ruta/posts/
La página encargada de gestionar las páginas individuales para cada etiqueta ahora tendrá los siguientes cambios:
Inténtalo tú mismo - Actualiza la consulta en la página de indexado de etiquetas.
Sección titulada Inténtalo tú mismo - Actualiza la consulta en la página de indexado de etiquetas.Importa y utiliza
getCollection
para obtener las etiquetas en las publicaciones del blog ensrc/pages/tags/index.astro
siguiendo los mismos pasos de arriba.Muéstrame el código.
- Obtén los datos de toda tu colección de publicaciones usando
Actualiza cualquier valor del frontmatter para que coincida con tu esquema
Sección titulada Actualiza cualquier valor del frontmatter para que coincida con tu esquema-
Si es necesario, actualiza los valores del frontmatter que no coincidan con el esquema de tu colección en todo tu proyecto, al igual que en tu plantilla o
layout
.En el ejemplo tutorial de blog,
pubDate
era una cadena de texto. Ahora, con el nuevo esquema definido para frontmatter,pubDate
será un objeto de tipoDate
.Para renderizar la fecha en la plantilla de la publicación, necesitamos convertirla a cadena de texto:
Actualiza la función RSS
Sección titulada Actualiza la función RSS-
Finalmente, el tutorial de blog incluye el feed RSS. Esta función también debe utilizar
getCollection()
para regresar la información de tus publicaciones. También deberás generar los artículos utilizando la propiedaddata
.
Para ver el ejemplo completo del tutorial usando colecciones de contenido, consulta la rama de Colecciones de Contenido del repositorio del tutorial.
Learn