Content Collections
Las colecciones son una característica de Astro que ayudan a administrar, en documentos de Markdown o MDX, el contenido de algún proyecto. Las colecciones ayudan a organizar su contenido, validan su material de presentación y brindan seguridad automática de tipos de TypeScript para todo el contenido.
.
✨ Concepto clave
Las colecciones de contenido son la mejor forma de trabajar con Markdown y MDX en cualquier proyecto de Astro.
.
Las colecciones son recursos encontrados en el subdirectorio ./src/content.
.
Desarrollo de Collections
ⴵ Repositorio - Coffeeroasters
⬢ Commit - feat: ✨added content collection documents
⬢ Commit - feat: ✨added product components
.
Como se mencionó, las colecciones son parte fundamental de un contenido en sitios web. Su identificación se hace evidente por la dependencia e iteración visual que será servido durante la narrativa de nuestra vista o página.
.
✨ Concepto clave
Las colecciones será de gran utilidad cuando disponemos y consumimos recursos específicos agrupados (posts-post, authors-author, products-product, etc.).
.
.
Podemos analizar 2 componentes claro que distribuye nuestra colección de productos:
Products Gallery - Componente para distribuir en grid nuestros productos existentes
Product Item - Componente que representa a un producto
.
De aquí, se menciona la primera estructura visual de alguna colección, lo cual ganamos administración para aislar (similar a un modelo en la arquitectura MVC).
.
Siguiendo la 📚 documentación, se organiza nuestras colecciones en el subdirectorio ./src/content. El cual, al lanzar nuestro proyecto en dev o build, creará y sincronizará un directorio llamado .astro.
.
ℹ️ Definición
. astro es un directorio donde gestiona los tipos de las colecciones generadas por Astro, si fuera el caso sincronizarlas manualmente, por algún tipo de error, corremos el comando astro sync.
Se recomienda omitirlo en el archivo .gitignore
.
Al componentizar nuestra aplicación, podemos dividir en piezas nuestros diferentes componentes (diseño basado en composición), del cual tendríamos los siguientes componentes.
.
./src/componentes/Products/Item.astro
---
interface Props {
title: string
image: string
content: string
}
const { title, image, content } = Astro.props
---
<div class='product-item'>
<img src={image} alt={title} />
<div class='product-item__body'>
<h4>{title}</h4>
<p>{content}</p>
</div>
</div>
El cual será consultado y gestionado por un componente de tipo wrapper, el cual para su uso dependenerá de las colecciones, como modelos, y el producto como plantilla de representación.
.
./src/componentes/Products/Gallery.astro
---
import { getCollection } from 'astro:content'
import Product from './Item.astro'
const products = await getCollection('products')
---
<div class='products-gallery'>
{products.map(product => (
<Product title={product.data.title}
image={product.data.image}
content={product.body} />
))}
</div>
.
✨ Concepto clave
Las variantes visuales o de organización de nuestros componentes, pueden estar contenida en su generalización, como Products. Permitiendo utilizar sus diferentes presentaciones de manera selectiva, ProductsGallery y/o ProductsItem.
.
Como se observa, se consumirá de nuestro contenido la siguiente definición de colecciones:
.
./src/content/products/danche.md
---
title: Danche
image: /images/products/danche.png
---
Ethiopian hand-harvested blend densely packed with vibrant fruit notes.
.
✨ Concepto clave
Donde Astro nos recomienda delimiar y configurar nuestras colecciones para así, extender los diferentes arquetipos de nuestro producto web.
.
`./src/content/config.ts
import { z, defineCollection } from 'astro:content'
export const collections = {
products: defineCollection({
schema: z.object({
title: z.string(),
image: z.string(),
}),
}),
}
Finalmente, lo disponemos como contenido de nuestra página en una sección.
.
./src/pages/index.astro
---
import ProductsGallery from '@components/Products/Gallery.astro'
---
<Default>
<section class='products'>
<h3>Our premium collection</h3>
<ProductsGallery />
</section>
</main>
</Default>
.
ⴵ Repositorio - Coffeeroasters
⬢ Commit - feat: ✨added content collection documents
⬢ Commit - feat: ✨added product components