# Carga de Datos en Tiempo de Compilacion {#build-time-data-loading} VitePress proporciona un recurso llamado **cargadores de dato** que permite cargar datos arbitrarios e importarlos desde páginas o componentes. La carga de datos es ejecutada **apenas en el tiempo del build** los datos resultantes serán serializados como JSON en el paquete de JavaScript final. Los cargadores de datos pueden ser usados para buscar datos remotos o generar metadatos con base en archivos locales. Por ejemplo, puede usar cargadores de datos para procesar todas sus pagínas API locales y generar automáticamente un indice de todas las entradas del API. ## Uso Básico {#basic-usage} Un archivo de cargados de datos debe terminar con `.data.js` o `.data.ts`. El archivo debe proporcionar una exportación por defecto de un objeto con el método `load()`: ```js // example.data.js export default { load() { return { hello: 'world' } } } ``` El módulo del cargador es validado apenas en Node.js, entonces puede importar APIs Node y dependencias npm caso necesario. Puede importar entonces datos de este archivo en páginas `.md` y componentes `.vue` usando la exportación llamada `data`: ```vue
{{ data }}``` Salida: ```json { "hello": "world" } ``` Notará que el propio cargados de datos no exporta `data`. Es VitePress llamando el método `load()` entre bastidores y exponiendo implicitamente el resultado por medio de la exportación llamada `data`. Esto funciona incluso si el cargador fuera asíncrono: ```js export default { async load() { // buscar datos remotos return (await fetch('...')).json() } } ``` ## Datos de Archivos Locales {#data-from-local-files} Cuando necesita generar datos con base en archivos locales, debe usar la opción `watch` en el cargador de datos para que los cambios hechos en esos archivos puedan accionar actualizaciones rápidas. La opción `watch` tabién es conveniente porque puede usar [patrones glob](https://github.com/mrmlnc/fast-glob#pattern-syntax) para corresponder a vários archivos. Los patrones pueden ser relativos al propio archivo del cargador, y la función `load()` recibirá los archivos correspondientes como paths absolutos. El siguiente ejemplo muestra el cargamento de archivos CSV y la transformación de estos en JSON usando [csv-parse](https://github.com/adaltas/node-csv/tree/master/packages/csv-parse/). Como este archivo solo es ejecutado en el tiempo del build, usted no enviará el procesador de CSV para el cliente! ```js import fs from 'node:fs' import { parse } from 'csv-parse/sync' export default { watch: ['./data/*.csv'], load(watchedFiles) { // watchedFiles será un array de paths absolutos de los archivos um array de caminhos absolutos dos arquivos correspondientes. // generar un array de metadatos de post que puede ser usado para mostrar // una lista en el layout del tema return watchedFiles.map((file) => { return parse(fs.readFileSync(file, 'utf-8'), { columns: true, skip_empty_lines: true }) }) } } ``` ## `createContentLoader` Al construir un sitio enfocado en contenido, frecuentemente necesitamos crear una página de "archivo" o "índice": una página donde listamos todas las entradas disponibles en nuestra colección de contenido, por ejemplo, articulos de blog o páginas de API. Nosotros **podemos** implementar esto directamente con el API de cargador de datos, pero como este es un caso de uso tan común, VitePress también proporciona un auxiliar `createContentLoader` para simplificar esto: ```js // posts.data.js import { createContentLoader } from 'vitepress' export default createContentLoader('posts/*.md', /* opciones */) ``` El auxiliar acepta un patrón glob relativo al [diretório fuente](./routing#source-directory) y retorna un objeto de cargador de datos `{ watch, load }` que puede ser usado como exportación por defecto en un archivo de cargador de datos. El también implementa cache con base en los sellos se datos del archivo para mejorar el desempeño en el desarrollo. Note que el cargador solo funciona con archivos Markdown - archivos no Markdown encontrados serán ignorados. Los datos cargados serán un _array_ con el tipo `ContentData[]`: ```ts interface ContentData { // URL mapeada para la página. Ex: /posts/hello.html (no incluye la base) // itere manualmente o use `transform` personalizado para normalizar los paths url: string // datos frontmatter de la página frontmatter: Record