Pular para o conteúdo
This is an unmaintained snapshot of the Astro v4 docs. View the latest docs.

Adicione tempo de leitura

Crie um plugin remark que adiciona uma propriedade de tempo de leitura ao frontmatter dos seus arquivos Markdown ou MDX. Use essa propriedade para exibir o tempo de leitura de cada página.

  1. Instale pacotes utilitários

Instale esses dois pacotes utilitários:

Janela do terminal
npm install reading-time mdast-util-to-string
  1. Crie um plugin remark.

Esse plugin usa o pacote mdast-util-to-string para obter o texto do arquivo Markdown. Esse texto é então passado para o pacote reading-time para calcular o tempo de leitura em 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 textoPagina = toString(tree);
const tempoLeitura = getReadingTime(textoPagina);
// tempoLeitura.text nos dará minutos lidos como uma string amigável
// i.e. "3 min read"
data.astro.frontmatter.minutesRead = tempoLeitura.text;
};
}
  1. Adicione o plugin à sua configuração:
astro.config.mjs
import { defineConfig } from 'astro/config';
import { remarkReadingTime } from './remark-reading-time.mjs';
export default defineConfig({
markdown: {
remarkPlugins: [remarkReadingTime],
},
});

Agora todos os documentos Markdown terão uma propriedade minutesRead calculada em seu frontmatter.

  1. Exiba o Tempo de Leitura

Se seus posts de blog estiverem armazenados em uma coleção de conteúdo, acesse o remarkPluginFrontmatter da função entry.render(). Em seguida, renderize minutesRead em seu template onde você gostaria que ele aparecesse.

src/pages/posts/[slug].astro
---
import { CollectionEntry, getCollection } from 'astro:content';
export async function getStaticPaths() {
const blog = await getCollection('blog');
return blog.map(entry => ({
params: { slug: entry.slug },
props: { entry },
}));
}
const { entry } = Astro.props;
const { Content, remarkPluginFrontmatter } = await entry.render();
---
<html>
<head>...</head>
<body>
...
<p>{remarkPluginFrontmatter.minutesRead}</p>
...
</body>
</html>

Se você estiver usando um layout Markdown, use a propriedade minutesRead do frontmatter de Astro.props no layout de seu template.

src/layouts/BlogLayout.astro
---
const { minutesRead } = Astro.props.frontmatter;
---
<html>
<head>...</head>
<body>
<p>{minutesRead}</p>
<slot />
</body>
</html>
Contribua

O que passa em sua cabeça?

Comunidade