Skip to content

INFO

v2.0.0 开始,vue-element-plus-x 不再内置 Markdown 渲染组件。如需 Markdown 渲染功能,请单独安装 x-markdown-vue

介绍

x-markdown-vue 是从 vue-element-plus-x 中抽离出来的独立 Markdown 渲染组件库,专为 AI 对话场景中的富文本展示与流式输出渲染而设计。

✨ 核心特性

  • 🚀 流式渲染 — 支持 AI 对话场景的实时输出动画,带逐字淡入效果
  • 📝 GitHub Flavored Markdown — 完整支持 GFM 语法(表格、任务列表等)
  • 🎨 代码高亮 — 基于 Shiki,支持 100+ 语言和多种主题,可按需禁用
  • 🧮 LaTeX 数学公式 — 支持行内 $...$ 与块级 $$...$$ 数学公式
  • 📊 Mermaid 图表 — 支持流程图、时序图、甘特图、类图等,可按需禁用
  • 🌗 深色模式 — 内置深浅色主题切换支持
  • 🔌 高度可定制 — 支持自定义渲染插槽、自定义属性、自定义代码块渲染器
  • 🎭 灵活插件系统 — 支持 remark 和 rehype 插件扩展
  • 🔒 安全可靠 — 可选的 HTML 内容清理,防止 XSS 攻击

v2.0.0 开始,组件库不再内置 Typewriter / XMarkdown / XMarkdownAsync,如需 Markdown 渲染,请单独安装并在业务侧集成。

安装

bash
# npm
npm install x-markdown-vue

# yarn
yarn add x-markdown-vue

可选依赖

x-markdown-vue 采用按需加载策略,以下功能需要安装对应依赖:

bash
# 代码高亮(Shiki)
npm install shiki shiki-stream

# Mermaid 图表
npm install mermaid

# LaTeX 数学公式(还需引入 KaTeX 样式)
npm install katex

TIP

如果不安装 shikishiki-stream,控制台可能会出现警告,代码块将降级为纯文本渲染。

代码演示

基础用法

流式渲染动画

深色模式

代码块配置

搭配 BubbleList 使用粘性代码头部

MarkdownRenderer 放入 BubbleList#content 插槽,以 BubbleList 自身作为滚动容器。滚动时代码块头部吸附到 列表可视区顶部,不受页面导航栏遮挡。

LaTeX 数学公式

需安装 katexnpm install katex,并在入口引入样式:

ts
import 'katex/dist/katex.min.css';

Mermaid 图表

需安装 mermaidnpm install mermaid

自定义代码块操作按钮

通过 code-block-actions 数组为代码块添加自定义操作按钮,支持 show 回调按语言条件显示。

onClick 回调接收的 CodeBlockSlotProps 参数:

属性类型说明
languagestring代码语言
codestring代码内容
copy(text: string) => void复制函数
copiedboolean是否已复制
collapsedboolean是否已折叠
toggleCollapse() => void切换折叠状态

自定义 Mermaid 操作按钮

通过 mermaid-actions 数组为 Mermaid 图表工具栏添加自定义按钮。

onClick 回调接收的 MermaidSlotProps 参数:

属性类型说明
showSourceCodeboolean是否显示源码视图
svgstring渲染后的 SVG 字符串
rawContentstringMermaid 原始代码
isLoadingboolean是否正在渲染
zoomIn() => void放大
zoomOut() => void缩小
reset() => void重置缩放
fullscreen() => void全屏
toggleCode() => void切换源码/图表视图
copyCode() => Promise<void>复制源码
download() => void下载 SVG

自定义代码块渲染器

自定义属性

自定义插槽

支持的插槽名称:

插槽名说明
heading / h1 ~ h6标题
code / inline-code / block-code代码
blockquote引用块
list / ul / ol / li / list-item列表
table / thead / tbody / tr / td / th表格
a链接
img图片
p / strong / em段落与行内元素
所有标准 HTML 标签名

自定义表格(el-table 插槽)

通过 #table 插槽拦截 Markdown 中所有 GFM 表格,从插槽暴露的 hast node 中提取列和行数据,然后传入 el-table 渲染,获得排序、条纹、边框等完整能力。

自定义代码块组件(el-table & my-echarts)

通过 code-x-render 自定义"语言标签",在 Markdown 中用围栏代码块声明 el-tablemy-echarts 语言,即可自动渲染为对应的 Vue 组件:

  • el-table — 解析 JSON { columns, rows } 并渲染为 Element Plus 表格
  • my-echarts — 解析 ECharts option JSON 并渲染为交互式图表

插件系统

通过 remark-plugins / remark-plugins-ahead / rehype-plugins / rehype-plugins-ahead 扩展解析管道:

ts
import remarkEmoji from 'remark-emoji';
import rehypeSlug from 'rehype-slug';

// 在业务组件中传入
const remarkPlugins = [remarkEmoji];
const rehypePlugins = [rehypeSlug];
vue
<MarkdownRenderer
  :markdown="content"
  :remark-plugins="remarkPlugins"
  :rehype-plugins="rehypePlugins"
/>

安全配置

启用 sanitize 后,渲染前会清洗 HTML 内容,防止 XSS 注入:

vue
<MarkdownRenderer
  :markdown="content"
  :sanitize="true"
  :sanitize-options="{ allowedTags: ['b', 'i', 'em', 'strong', 'a'] }"
/>

流式自定义代码块(骨架屏占位)

模拟 AI 流式输出场景:JSON 拼接过程中显示 el-skeleton 骨架屏,等数据可解析后切换为对应的 el-table / el-form / my-echarts 真实组件。

API 标准表

Props

属性类型默认值说明
...AiXMarkdownPropsRecord<string, unknown>-透传 Element Plus X XMarkdown 原生属性。
content / markdownstring-Markdown 内容,按底层组件支持的字段传入。

Events

当前包装层不声明固定事件,底层事件会通过 attrs 透传。

Slots

默认 slot 和所有具名 slot 都会透传到底层 XMarkdown。

Exposes

当前无公开 expose 方法。

样式入口

ts
import '@zhiyongui/lingxi-ui/ai-x-markdown/style.css'

FAQ

什么时候用 AiXMarkdown,什么时候用 AiRichContent?

只渲染 Markdown 时用 AiXMarkdown;需要结构化 block、流式 delta、图表或文件卡片时用 AiRichContent