Skip to content

x-markdown-vue

Vue3 Markdown 渲染器 —— GFM · Shiki 代码高亮 · Mermaid 图表 · LaTeX 数学公式 · 流式动画。

在线演示

安装

bash
pnpm add @flowporr/x-markdown-vue
# 可选能力:代码高亮 / 图表(未安装时优雅降级)
pnpm add shiki shiki-stream mermaid

基本用法

vue
<script setup lang="ts">
import { ref } from 'vue'
import { MarkdownRenderer } from '@flowporr/x-markdown-vue'
import '@flowporr/x-markdown-vue/style'

const md = ref(`# Hello **World**

\`\`\`js
console.log('Hello')
\`\`\`

$$E = mc^2$$`)
</script>

<template>
  <MarkdownRenderer :markdown="md" :is-dark="isDark" enable-animate />
</template>

导出

ts
// 高层组件(主要使用)
export { MarkdownRenderer, MarkdownRendererAsync } from '@flowporr/x-markdown-vue'
// 核心引擎(高级定制)
export { VueMarkdown, VueMarkdownAsync } from '@flowporr/x-markdown-vue'
// 处理器工厂(自定义 pipeline)
export { createProcessor, useMarkdownProcessor } from '@flowporr/x-markdown-vue'
// HAST 渲染(自定义渲染逻辑)
export { render, renderChildren, getVNodeInfos } from '@flowporr/x-markdown-vue'
// 样式
import '@flowporr/x-markdown-vue/style'

MarkdownRenderer Props

渲染开关

Prop类型默认值说明
markdownstring''Markdown 原始字符串
allowHtmlbooleanfalse是否允许原始 HTML(需配合 sanitize)
enableLatexbooleantrue启用 LaTeX 数学公式(KaTeX 渲染)
enableAnimatebooleanfalse启用流式逐字动画(Intl.Segmenter 分词)
enableBreaksbooleantrue换行符转 <br>(remark-breaks)
enableGfmbooleantrueGFM(表格/任务列表/删除线)
enableShikibooleantrueShiki 代码高亮(需安装 shiki)
enableMermaidbooleantrueMermaid 图表(需安装 mermaid)

外观

Prop类型默认值说明
isDarkbooleanfalse暗色模式(Shiki 主题 + CSS 类)
shikiTheme[BuiltinTheme, BuiltinTheme]['vitesse-light', 'vitesse-dark'][浅色, 深色] 主题
showCodeBlockHeaderbooleantrue代码块工具栏(语言标签 + 复制)
stickyCodeBlockHeaderbooleanfalse代码块头部 sticky
enableCodeLineNumberbooleantrue代码块行号
codeLineNumberStartnumber1行号起始值
codeMaxHeightstringundefined代码块最大高度(如 '400px'

安全与扩展

Prop类型默认值说明
sanitizebooleanfalseHTML 安全过滤(DOMPurify + rehype-sanitize)
sanitizeOptionsSanitizeOptions{}安全过滤选项
customAttrsCustomAttrs{}自定义 HTML 属性
codeXRenderRecord<string, any>{}自定义代码渲染器
codeBlockActionsCodeBlockAction[]undefined代码块额外操作按钮
mermaidActionsMermaidAction[]undefinedMermaid 额外操作按钮
mermaidConfigRecord<string, any>undefinedMermaid 初始化配置
remarkPluginsPluggableList[]额外 remark 插件(默认插件之后)
remarkPluginsAheadPluggableList[]额外 remark 插件(默认插件之前)
rehypePluginsPluggableList[]额外 rehype 插件(默认插件之后)
rehypePluginsAheadPluggableList[]额外 rehype 插件(默认插件之前)
rehypeOptionsRecord<string, any>{}传递给 remark-rehype 的选项

Slots — 覆盖任意元素渲染

支持命名插槽覆盖任意 HTML 元素,插槽名即 HTML 标签名:

插槽名对应元素Scope 额外属性
h1 ~ h6标题level: number
heading所有标题(优先级低于具体级别)level: number
code所有代码language, content, inline
inline-code内联代码language, content, inline: true
block-code代码块language, content, inline: false
ul / ol列表ordered, depth
list所有列表ordered, depth
li列表项ordered, depth, index
list-item所有列表项ordered, depth, index
td / th / tr表格元素isHead: boolean
vue
<MarkdownRenderer :markdown="md">
  <template #h1="{ level, children }">
    <h1 :class="`heading-${level}`"><component :is="children" /></h1>
  </template>
</MarkdownRenderer>

可选能力依赖

用途缺失时行为
shiki ^3.0代码高亮(可选)降级为纯文本代码块
shiki-stream ^0.1流式 token 化(可选)Shiki 不可用
mermaid ^11.0图表渲染(可选)Mermaid 代码块显示为普通代码

Shiki 体积大(~20MB 含语法/主题)、Mermaid ~3MB,因此动态 import() + peerDependenciesMeta.optional,消费方按需安装。

子菜单