创建一个remark插件以提取MDX阅读时间

💡 原文英文,约1000词,阅读约需4分钟。
📝

内容提要

本文介绍了如何创建一个remark插件,以提取MDX文件的阅读时间数据。通过解析MDX内容并计算阅读时间,插件将数据附加到MDX内容中,使其在导入时可用。使用reading-time和mdast-util-to-string等库可以简化这一过程,并支持TypeScript以提升开发体验。

🔎

延伸解读

插件如何将阅读时间注入 MDX 模块

文章通过向 MDX AST 的 children 数组前插入一个 mdxjsEsm 节点,并利用 estree-util-value-to-estree 将阅读时间对象转换为 ESTree 表达式,从而在编译后的 ES 模块中导出名为 readingTime 的常量。这种方式不依赖 frontmatter,而是直接生成 ESM 导出,使得导入 MDX 文件时即可访问该数据。

依赖库的分工与 TypeScript 类型增强

实现中使用了三个核心库:reading-time 负责根据文本计算阅读时间,mdast-util-to-string 将 AST 转为纯文本,estree-util-value-to-estree 把数据转为 ESTree 节点。对于 TypeScript 用户,还需安装 @types/mdast 和 unified 以获得类型定义,并通过模块扩充声明 *.mdx 文件中的 readingTime 属性,从而在导入时获得类型提示。

与 Vite 和 MDX 插件的集成要点

文章假设使用 Vite 作为打包工具,并配合 @mdx-js/rollup 插件转换 MDX 文件。配置中需要设置 enforce: 'pre' 以确保 MDX 插件在其它插件之前执行。导入 MDX 文件时,默认导出是编译后的 JSX 组件,而插件添加的 readingTime 会作为额外的命名导出出现,方便在组件中直接使用。

❓

Q&A

如何创建一个remark插件来提取MDX文件的阅读时间?

创建remark插件的步骤包括提取MDX内容为文本、计算阅读时间,并将阅读时间数据附加到MDX内容中。

使用哪些库可以简化MDX阅读时间的计算?

可以使用reading-time库计算阅读时间,使用mdast-util-to-string库将MDX AST转换为文本。

如何在TypeScript中增强MDX类型定义以支持阅读时间?

可以通过声明模块并导入reading-time的类型定义来增强MDX类型定义,使TypeScript识别readingTime属性。

MDX文件导入时,如何访问阅读时间数据?

导入MDX文件后,可以通过readingTime属性访问阅读时间数据,例如:import { readingTime } from './example.mdx';。

创建remark插件时,如何处理MDX内容的AST?

在创建remark插件时,可以使用mdast-util-to-string将MDX AST转换为文本,然后进行阅读时间计算。

这个remark插件的主要功能是什么?

这个remark插件的主要功能是提取MDX文件的阅读时间数据,并在导入时使其可用。

🏷️

标签

➡️

继续阅读