Añadir tiempo de lectura
Crea un remark plugin que añada una propiedad de tiempo de lectura al frontmatter de tus archivos Markdown o MDX. Usa esta propiedad para mostrar el tiempo de lectura de cada página.
-
Instala los siguientes paquetes:
reading-timepara calcular los minutos de lecturamdast-util-to-stringpara extraer todo el texto de tu markdown@astrojs/markdown-remarkpara usar el procesadorunified():
Ventana de la terminal npm install reading-time mdast-util-to-string @astrojs/markdown-remarkVentana de la terminal pnpm add reading-time mdast-util-to-string @astrojs/markdown-remarkVentana de la terminal yarn add reading-time mdast-util-to-string @astrojs/markdown-remark -
Crea un remark plugin.
Este plugin usa el paquete
mdast-util-to-stringpara obtener el texto del archivo Markdown. Este texto se pasa luego al paquetereading-timepara calcular el tiempo de lectura en minutos.remark-reading-time.mjs import getReadingTime from 'reading-time';import { toString } from 'mdast-util-to-string';export function remarkReadingTime() {return function (tree, { data }) {const textOnPage = toString(tree);const readingTime = getReadingTime(textOnPage);// readingTime.text will give us minutes read as a friendly string,// i.e. "3 min read"data.astro.frontmatter.minutesRead = readingTime.text;};} -
Añade el plugin a tu configuración:
astro.config.mjs import { unified } from '@astrojs/markdown-remark';import { defineConfig } from 'astro/config';import { remarkReadingTime } from './remark-reading-time.mjs';export default defineConfig({markdown: {processor: unified({remarkPlugins: [remarkReadingTime],}),},});Ahora todos los documentos Markdown tendrán una propiedad
minutesReadcalculada en su frontmatter. -
Mostrar el tiempo de lectura
Si tus blog posts están almacenados en una content collection, accede al
remarkPluginFrontmatterdesde la funciónrender(entry). Luego, renderizaminutesReaden tu plantilla donde quieras que aparezca.src/pages/posts/[slug].astro ---import { getCollection, render } from 'astro:content';export async function getStaticPaths() {const blog = await getCollection('blog');return blog.map(entry => ({params: { slug: entry.id },props: { entry },}));}const { entry } = Astro.props;const { Content, remarkPluginFrontmatter } = await render(entry);---<html><head>...</head><body>...<p>{remarkPluginFrontmatter.minutesRead}</p>...</body></html>Si estás usando un Markdown layout, usa la propiedad de frontmatter
minutesReaddeAstro.propsen tu plantilla de layout.src/layouts/BlogLayout.astro ---const { minutesRead } = Astro.props.frontmatter;---<html><head>...</head><body><p>{minutesRead}</p><slot /></body></html>