后端仔折腾 react markdown 遇到的问题


搭技术博客嘛,基本都是用 markdown 写文章。那必然需要将 markdown 文件渲染到浏览器里。

我本来想着,这事应该很简单。哪怕我是 react 零基础,但是怎么通用的一件事,应该是三下五除二就能解决。

结果前前后后折腾了好几天,才基本上算是搞定了。

我这个后端仔遇到的最大的误区是:

_markdown 库只处理基础的转换(md->html),不提供主题 _

不管是 react-markdownmarkdown-to-jsx 还是最终使用的 markdown-it,都是这样,本质上并不是开箱即用的。

语法高亮

例如 markdown-it 想要添加语法高亮,需要添加下面的代码,并且引用 hljs 库。

const md = markdownit({
  highlight: function (str, lang) {
    if (lang && hljs.getLanguage(lang)) {
      try {
        return hljs.highlight(str, { language: lang }).value;
      } catch (__) {}
    }

    return ""; // use external default escaping
  },
});

到这还算简单的,官方文档基本都会写。你以为完了吗,你只能得到下图:

这不对啊,虽然有高亮,但是怎么没有背景呢?我这个后端仔第一时间真是理解不能,查了半天才发现,要好看还需要改 css 代码。

.MarkdownPage code {
  --code-bg: color-mix(in srgb, #f5deb3 10%, transparent);

  background: var(--code-bg) !important;
  border-radius: 2px;
  display: inline-block;
  font-family: 'Jetbrains Mono', Consolas, Monaco, monospace;
  font-size: 0.9em;
  padding: 0 4px;
  text-decoration: inherit;
}

这样才能得到正常的代码块现实:

表格

默认情况下,表格是这样子:

这哪是表格呢?为了让它真正变成表格,markdown-it 需要增加如下渲染规则:

md.renderer.rules.table_open = function () {
  return '<table class="table table-striped">\n';
};

并且要添加 bootstrap 库。这样你才能得到:

引用

默认的引用是这样的:

为了让他正常显示,需要添加:

.MarkdownPage blockquote {
  padding: 10px 20px;
  margin: 0 0 20px;
  font-size: 17.5px;
  border-left: 5px solid #eee;
}

最终得到:

结论

总的来说,这个过程对于零基础的后端仔来说真的不轻松。最大的问题是,几个 markdown 库给出了在线的交互网页,但是没有给出一个具体的成品的例子(也可能是给了我没不出来)。

转念一想,可能我最开始就去找现成的模板拿来用是最好的。不过这是事后诸葛亮了。