添加阅读时间
创建一个 remark 插件,它会为你的 Markdown 或 MDX 文件的 frontmatter 添加一个阅读时间属性。使用此属性可以显示每个页面的阅读时间。
-
安装辅助包
安装这两个辅助包
reading-time
用于计算阅读分钟数mdast-util-to-string
用于从你的 markdown 中提取所有文本
终端窗口 npm install reading-time mdast-util-to-string终端窗口 pnpm add reading-time mdast-util-to-string终端窗口 yarn add reading-time mdast-util-to-string -
创建一个 remark 插件。
该插件使用
mdast-util-to-string
包来获取 Markdown 文件的文本。然后将此文本传递给reading-time
包来计算以分钟为单位的阅读时间。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;};} -
将插件添加到你的配置中
astro.config.mjs import { defineConfig } from 'astro/config';import { remarkReadingTime } from './remark-reading-time.mjs';export default defineConfig({markdown: {remarkPlugins: [remarkReadingTime],},});现在,所有 Markdown 文档的 frontmatter 中都会有一个计算出的
minutesRead
属性。 -
显示阅读时间
如果你的博客文章存储在内容集合中,可以从
render(entry)
函数中访问remarkPluginFrontmatter
。然后,在你希望它出现的任何地方,在模板中渲染minutesRead
。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>如果你正在使用 Markdown 布局,可以在你的布局模板中使用来自
Astro.props
的minutesRead
frontmatter 属性。src/layouts/BlogLayout.astro ---const { minutesRead } = Astro.props.frontmatter;---<html><head>...</head><body><p>{minutesRead}</p><slot /></body></html>