分工

  • remark 处理 markdown 语法树
  • rehype 处理 HTML 语法树
  • remark-rehype 负责在两个世界之间搭桥

最小可用管线只有四步:

const html = await unified()
  .use(remarkParse)
  .use(remarkRehype)
  .use(rehypeStringify)
  .process(markdown);

为什么不用现成的一体化方案

一体化方案上手更快,但扩展点少。当你想给标题加锚点、给代码块加高亮时,还是得回到管线里加插件。

排版比转换更重要

转换只是一行代码,真正决定阅读体验的是 CSS:正文宽度控制在 680 到 720 像素,行高 1.75,中文每行 30 到 40 个字最舒服。

引用块用左侧强调色竖线,代码块用第二个层级的背景色加圆角——这些规则都应该写进品牌契约,而不是散落在各个组件里。

安全提醒

如果内容来自用户而不是你自己写的仓库,必须在管线里加消毒插件。当前内容全部由仓库维护,风险可控,但换来源之前一定要补上。