如何使用react-markdown安全地渲染markdown

9,013 阅读4分钟

Markdown格式是开发者社区的一个长期主力。自2004年以来,我们一直在使用Markdown为各种平台创建内容,包括博客、网络论坛、聊天应用程序、所见即所得编辑器等等。

在本教程中,我们将向你展示如何使用 react-markdown 库从 React 组件中安全地渲染 Markdown。

什么是 react-markdown?

react-markdown是一个React组件,可以将Markdown文本转换为相应的HTML代码。它建立在remark 上,它是一个 Markdown 预处理器。

react-markdown使你能够安全地呈现markdown,因为它不依赖于dangerouslySetInnerHTML prop。相反,它使用一个语法树来构建虚拟DOM。

使用dangerouslySetInnerHTML 道具来解析 HTML 是危险的,因为如果你不确定来源,它可能会注入恶意的脚本。这可能使你的软件容易受到跨站脚本(XSS)攻击,在这种攻击中,不良分子将代码注入其他良性的应用程序和网站,向毫无戒心的用户发送恶意的脚本。

Markdown语言的设计是为了帮助你轻松创建编辑内容。这就是为什么它只包括基本标签。 react-markdown默认不支持HTML,因此可以防止脚本注入。这使得它可以安全地使用。

安装 react-markdown

你可以用npm安装react-markdown 库。

npm install react-markdown

或者,你也可以用yarn来安装这个库。

yarn add react-markdown

你不需要安装任何其他库来与 react-markdown 一起工作。然而,你可以选择使用一些插件来增强它的功能。我们将在后面讨论这些插件。

使用 react-markdown。一个简单的例子

由于 react-markdown 库提供了一个组件,我们需要把我们的 Markdown 文本作为子节点放在其中。然后这将返回转换后的HTML代码。

这里有一个例子。

import React from 'react'
import ReactMarkdown from 'react-markdown'
export default function MarkdownToHtml(){
  return(
    <ReactMarkdown>*React-Markdown* is **Awesome**</ReactMarkdown>
  )
}

渲染后的输出结果将是 "React-Markdown真_厉害_"。

支持的Markdown语法

下面是react-markdown支持的Markdown语法的列表,无需使用任何外部插件。



CodePen上Akash Mittal(@akash-mittal)的Pen
React-Markdown表

在react-markdown中使用插件

如果你想超越上面描述的语法,react-markdown的父项目react-markdown已经创建了许多插件,你可以用来增强库的功能。

例如,react-markdown默认不支持自动链接、删除线、表格、任务列表等。如果你曾经在GitHub上创建过readme文件,你可能会用Markdown创建任务列表和表格。为了满足这一需求,备注创建了备注-gfm,它代表Github风味的Markdown

为了使用插件,react-markdown提供了两个道具--remarkPluginsrehypePlugins ,这两个道具接受一个你想使用的所有插件的数组。你可以把诸如remark-gfmremark-maths 这样的评论插件放在remarkPlugin 道具中,而把诸如rehype-katex 这样的催眠插件放在rehypePlugins 道具中。

例如,如果你想支持删除线功能,你就需要使用 remark-gfm。让我们创建一个快速的演示,以显示这是如何工作的。

首先,安装remark-gfm

npm install remark-gfm

现在你可以在你的代码中使用它。

import React from 'react'
import ReactMarkdown from 'react-markdown'
import gfm from 'remark-gfm'
export default function MarkdownToHtml(){
  return(
    <ReactMarkdown remarkPlugins={[gfm]}>*React-Markdown* now supports ~strikethrough~. Thanks to gfm plugin.</ReactMarkdown>
  )
}

现在,由于 remark-gfm 插件,输出将是 "React-Markdown现在支持 删除线"。

如果你想支持数学表达式(如书面公式、方程式、分数等)或KaTeX,一个流行的数学排版库,你可以考虑使用remark-mathrehype-katex。这些插件使你能够将一般语言的符号转换成人类可读的数学格式。

这里有一个例子。

$$
L = \frac{1}{2} \rho v^2 S C_L
$$

用KaTeX解析的上述例子会是这样的。

Example Parsed with KaTex

前往官方文档查看你可以在 react-markdown 中使用的注释插件的完整列表。

remark-gfm 插件的特殊语法

下表显示了你可以使用remark-gfm 插件启用的特殊功能,包括创建表格、删除线文本和待办事项列表的能力。

请看下面的实时演示。


CodePen上看Pen Akash Mittal(@akash-mittal) 的
React-Markdown Table using Remark-gfm


React-Markdown Table using Remark-gfm by Akash Mittal(@akash-mittal)
onCodePen.

结论

在这个react-markdown教程中,我们学习了如何安全地将markdown语法渲染成适当的HTML。我们还回顾了如何使用各种插件,包括remark-gfm ,通过将它们传递给所提供的组件来使用 react-markdown。

The postHow to safely render markdown using react-markdownappeared first onLogRocket Blog.