更新记录

2.0.0(2026-11-08)

首个发布版本。l-markdown 主组件 + 8 个子组件(text-block / code / table / math / mermaid / webview / viewer / header)。

内容渲染

  • Markdown 原文与预渲染 HTML 双入口,解析内核按平台自动选择
  • 标题、段落、列表(含嵌套)、强调、行内代码、删除线、链接、图片、分割线
  • 引用块,支持多层嵌套
  • 代码块:18 门常用语言语法高亮、行号、按行数折叠、复制 / 下载 / 全屏;其余语言降级纯文本
  • GFM 表格、Mermaid 图表(流程图 / 时序图 / 甘特图等),图片 / 代码双视图
  • 数学公式:行内 $...$ / \(...\) 与块级 $$...$$ / \[...\];公式字体从 cdnjs 加载,需联网,小程序需配置合法域名
  • 脚注引用与回链

流式输出

  • streaming 消息级标记,配合 renderInterval 节流(0 为自适应)
  • 未闭合围栏的公式、图表、代码块显示源码占位,不误报错误
  • 流式表格自动补分隔行,显示等高骨架
  • 表格 / 代码块 / 图表 / 公式的复制、下载、全屏

交互

  • 正文可选中复制、拖动光标自由选词
  • 链接、图片、脚注点击事件;图片预览支持左右滑动
  • 点击放大时内置全屏查看器
  • 小程序端受 rich-text 限制,正文 / 表格内的链接、图片、脚注点击与图片预览不生效

主题与样式

  • light / dark / auto 三主题,auto 跟随系统
  • --l-md-* CSS 变量定制代码块、表格、头部、文本容器、Mermaid、公式占位与全屏查看器配色
  • 移动端排版刻度:正文 16px / 1.7,标题 24~14px

性能与复用

  • 渲染快照 snapshot / exportSnapshot(),历史消息重挂载免重复解析
  • documentReady 与 blocksReady() 判断整篇内容是否稳定
  • 代码块按行数折叠、未变块复用,降低流式重排开销
  • 小程序端不注册 math / mermaid / webview 组件,控制主包体积

平台支持

  • H5 / Web(uni-app 与 uni-app x):全功能
  • uni-app x App(Android / iOS / 鸿蒙):公式走内置 MathJax,需在页面放置 <l-markdown-webview />
  • 传统 uni-app App-Vue:公式、Mermaid 可用,无需代理;代码块高亮降级为纯文本
  • 微信小程序等小程序:公式正常渲染;Mermaid 以纯文本代码块展示源码;三个组件不注册

依赖

lime-uasm-cmark(必需)、lime-style、lime-shared。


平台兼容性

uni-app(5.34)

Vue2 Vue3 Chrome Safari app-vue app-nvue Android iOS 鸿蒙
- √ √ √ √ - √ √ √
微信小程序 支付宝小程序 抖音小程序 百度小程序 快手小程序 京东小程序 鸿蒙元服务 QQ小程序 飞书小程序 小红书小程序 快应用-华为 快应用-联盟
√ - - - - - - - - - - -

uni-app x(5.34)

Chrome Safari Android iOS 鸿蒙 微信小程序
√ √ √ √ √ √

其他

多语言 暗黑模式 宽屏模式 蒸汽模式
× × × √

name: lime-markdown Markdown 渲染组件 description: 跨端 Markdown 渲染组件,兼容 uni-app / uni-app-x,适配 AI 对话流式场景,支持代码高亮、表格、引用、Mermaid、数学公式。 tags:

  • markdown
  • 渲染
  • 流式
  • 代码高亮
  • mermaid
  • 公式 componentTag: l-markdown plugin: lime-markdown category: 业务组件 dependencies:
  • lime-uasm-cmark
  • lime-style
  • lime-shared

lime-markdown

跨端 Markdown 渲染组件,兼容 uni-app 与 uni-app x。支持标题、列表、引用(含嵌套)、代码高亮、GFM 表格、Mermaid 图表、行内 / 块级数学公式,并针对 AI 对话的流式输出做了专门优化。

插件依赖:lime-uasm-cmark、lime-style、lime-shared

能力一览

能力 说明
双入口 传 markdown 原文,或传已渲染的 html 片段(二选一,同时传入时优先 html)
内容 标题、段落、列表(含嵌套)、强调、行内代码、删除线、链接、图片、分割线、多层引用、脚注
代码块 18 门语言语法高亮、行号、按行数折叠、复制 / 下载 / 全屏
表格 GFM 表格、横向滚动、按行数折叠、复制 / 下载 / 全屏
公式 行内 $...$ / \(...\)、块级 $$...$$ / \[...\]
图表 Mermaid 流程图 / 时序图 / 甘特图等,图片 / 代码双视图
流式 streaming 消息级标记、节流渲染、未闭合围栏源码占位、表格骨架
复用 渲染快照 snapshot,历史消息重挂载免重复解析
主题 light / dark / auto,CSS 变量定制配色

安装方法

  1. 在 uni-app 插件市场中搜索并导入 lime-markdown,会自动拉取以下依赖
  2. 导入后重新编译项目
  3. 在页面中使用 l-markdown 组件;也可先用 <lime-markdown /> 查看演示(见「快速预览」)
依赖 说明
lime-uasm-cmark 必需,Markdown 解析引擎
lime-style 样式变量
lime-shared 公共工具

代码演示

基础用法

最小可用示例(Vue 3 / script setup):

<template>
  <l-markdown :markdown="mdText" theme="auto" @link="onLink" @image="onImage" />
</template>

<script setup lang="ts">
import { ref } from 'vue'
import { openMarkdownLink } from '@/uni_modules/lime-markdown'

const mdText = ref('# 标题\n\n正文 **加粗**、`行内代码`、[链接](https://uniapp.dcloud.net.cn/)')

function onLink(url: string): void {
  openMarkdownLink(url)
}
function onImage(src: string, alt: string): void {
  // 组件已自动调用 uni.previewImage(含全文图片列表),这里只做业务埋点
  console.log('preview', src, alt)
}
</script>

事件接入

完整事件接入(事件名均为小写,无连字符):

<l-markdown
  :markdown="mdText"
  @link="onLink"
  @image="onImage"
  @footnote="onFootnote"
  @codecopy="onCodeCopy"
  @codedownload="onCodeDownload"
  @codefullscreen="onCodeFullscreen"
  @tablecopy="onTableCopy"
  @tabledownload="onTableDownload"
  @tablefullscreen="onTableFullscreen"
  @mermaidcopy="onMermaidCopy"
  @mermaiddownload="onMermaidDownload"
  @mermaidfullscreen="onMermaidFullscreen"
/>

上例中的处理函数按业务自行实现,各事件参数见下方「l-markdown Events」表。

代码块语言

类别 语言
Web / 脚本 javascript(js / jsx / mjs / cjs)、typescript(ts / tsx / uts / arkts)、python(py)、css(wxss)、json(jsonc / json5)、xml(html / vue / wxml / svg)
系统 / 通用 java、go、cpp(c++ / cc / hpp)、c(h)
查询 / 脚本 / 标记 sql、bash(sh / zsh)、yaml(yml)、markdown(md)
配置 / 补丁 ini(toml)、dockerfile(docker)、diff(patch)、plaintext(text / txt)

括号内为可直接书写的别名;uts / arkts 复用 TypeScript,vue / wxml 复用 XML,wxss 复用 CSS。

为控制小程序包体,rust / csharp / objectivec / kotlin / php / dart / lua 默认不打包。这些语言仍可写进代码块,只是降级为纯文本;需要高亮时把它们加入 components/l-markdown-code/build-hljs.js 的 languages 数组并重跑该脚本。

App 端公式与图表

只有 uni-app x 的 App 原生端(Android / iOS / 鸿蒙)需要在页面根部放一次代理组件:

<template>
  <l-markdown-webview />
  <l-markdown :markdown="mdText" />
</template>

页面没有公式 / 图表时它不创建底层 web-view;首次需要时才创建,空闲 5 分钟自动释放。未放置时 x 端公式显示源码、图表显示降级提示。

Web(uni-app 与 uni-app x)和传统 uni-app 的 App-Vue 不需要放置该组件,公式与图表开箱即用。

流式输出

只给「当前正在增长的那条消息」传 streaming,历史消息保持 false:

<template>
  <l-markdown
    v-for="(msg, idx) in messages"
    :key="msg.id"
    :markdown="msg.body"
    :snapshot="msg.snapshot || ''"
    :streaming="isStreaming && idx === messages.length - 1"
  />
</template>

streaming 影响三处:表格显示等高骨架、代码块末行跳过高亮、块序列末尾预留占位以减少流式闪烁。renderInterval 控制节流间隔(默认 200ms,设 0 为按上一帧实耗自适应)。

历史消息快照

定稿后导出快照,下次挂载传 snapshot 即可跳过解析:

方式一,从组件实例导出(推荐):

import { ref, watch, nextTick } from 'vue'

const mdRef = ref<{ documentReady: boolean; exportSnapshot(): string } | null>(null)
const isStreaming = ref(false)
const messages = ref<Array<{ id: string; body: string; snapshot: string }>>([])

watch(isStreaming, async (v) => {
  if (v) return
  await nextTick()
  const last = messages.value[messages.value.length - 1]
  if (last && mdRef.value?.documentReady) {
    last.snapshot = mdRef.value.exportSnapshot()
  }
})

方式二,宿主已持有块序列时直接序列化:

import { blocksReady, serializeSnapshot, restoreSnapshot } from '@/uni_modules/lime-markdown'

// 用 Parameters 取出块数组类型,无需导入内部类型
type Blocks = Parameters<typeof serializeSnapshot>[0]

function saveSnapshot(blocks: Blocks): string {
  return blocksReady(blocks) ? serializeSnapshot(blocks) : ''
}
function loadSnapshot(snap: string): Blocks | null {
  return restoreSnapshot(snap) // null 表示版本不匹配,正常解析即可
}

快照只消费一次,streaming 期间不生效,可跨主题、跨宽度复用。

API 文档

l-markdown Props

🎯 内容与主题

参数 说明 类型 默认值
markdown Markdown 原文 string ''
html 已渲染的 HTML 片段,优先于 markdown string ''
theme 主题模式 light / dark / auto string auto

⚙️ 解析与流式

参数 说明 类型 默认值
renderInterval 流式节流间隔(毫秒),0 为自适应 number 200
parseErrorText 解析失败兜底文本 string Markdown 解析失败
streaming 当前消息是否仍在输出 boolean false
snapshot 渲染快照字符串,命中时跳过解析 string ''

🎨 样式与无障碍

参数 说明 类型 默认值
lClass / lStyle 根元素自定义类名 / 样式 string | Object -
ariaLabel / ariaRole 无障碍标签 / 角色 string -

l-markdown Events

事件 参数
link 链接地址
image 图片地址、替代文本
footnote 脚注 id、脚注正文
codecopy / codedownload / codefullscreen 代码文本 / 文件名 / true
tablecopy / tabledownload / tablefullscreen 表格 HTML / 文件名 / true
mermaidcopy / mermaiddownload / mermaidfullscreen Mermaid 源码 / 文件名 / true

link / image / footnote 仅小程序端不触发;其它端(Web / App-Vue / uni-app x App)均正常,点击图片可弹出预览。详见「平台差异与限制」。

l-markdown 实例方法

成员 说明
documentReady 整篇是否结构就绪,截图 / 导出 / 写快照前可先判断
exportSnapshot() 导出当前块序列的快照字符串

插件入口公共方法

import {
  // 代理注册(扩展非 Web 端的图表 / 公式渲染器)
  registerMermaidProxy, getMermaidProxy, registerMathProxy, getMathProxy,
  // 链接与跳转
  openMarkdownLink, linkScheme,
  // 块就绪判断
  blocksReady, pendingBlockCount, markCompleteness,
  // 渲染快照
  serializeSnapshot, restoreSnapshot, SNAPSHOT_VERSION,
  // 主题 / 代码工具
  resolveTheme, getExtByLanguage, getCodeFileName, copyCode, downloadCode
} from '@/uni_modules/lime-markdown'

类型导出:MermaidRenderer、MathProxyRenderer、MathRenderResult、LinkScheme。

l-markdown-code Props

参数 说明 类型 默认值
code / language 代码文本 / 语言名 string '' / text
theme 主题模式 string auto
copyable / downloadable / fullscreenable 显示对应操作按钮 boolean true
maxRows 折叠时最大显示行数,0 或负数不限制 number 13
lineNumbers 显示行号(长代码可关掉省节点) boolean true
showHeader / bordered / collapsible 显示头部 / 边框 / 启用折叠 boolean true
collapsibleText 折叠按钮文字 string 查看全部
streaming 流式输出中 boolean false
lClass / lStyle / ariaLabel / ariaRole 同主组件 - -

Events:copy(代码文本)、download(文件名)、fullscreen(true)

l-markdown-table Props

参数 说明 类型 默认值
html 表格 HTML string ''
theme 主题模式 string auto
copyable / downloadable / fullscreenable 显示对应操作按钮 boolean true
maxRows 折叠时最大显示行数(含表头) number 4
rowCount 表格行数(含表头),-1 由组件自行扫描 number -1
showHeader / bordered / collapsible 显示头部 / 边框 / 启用折叠 boolean true
collapsibleText 折叠按钮文字 string 查看全部
languageText 头部标签文字 string 表格
streaming 流式输出中(显示骨架占位) boolean false
lClass / lStyle / ariaLabel / ariaRole 同主组件 - -

Events:copy(表格 HTML)、download(文件名)、fullscreen(true)、link(链接地址)、image(图片地址)

l-markdown-math Props

小程序端不可用:小程序不注册本组件,单独放置不会渲染公式。请通过 l-markdown 的 $$...$$ / $...$ 语法使用,行内与块级公式会自动渲染。

参数 说明 类型 默认值
code LaTeX 源码 string ''
theme 主题模式 string auto
renderInterval 渲染节流间隔(毫秒),0 为立即渲染 number 300
streaming 围栏未闭合,显示源码占位 boolean false
lClass / lStyle / ariaLabel / ariaRole 同主组件 - -

l-markdown-mermaid Props

小程序端不可用:小程序不注册本组件,Mermaid 源码以纯文本代码块展示。

参数 说明 类型 默认值
code Mermaid 源码 string ''
theme 主题模式 string auto
viewMode 默认视图 image / code string image
copyable / downloadable / fullscreenable / showHeader / bordered 显示对应按钮 / 区域 boolean true
maxHeight 图表展示框最大高度 number | string 开启全屏时 300px
renderInterval 渲染节流间隔(毫秒) number 300
streaming 围栏未闭合,不尝试渲染 boolean false
imageTabText / codeTabText 图片 / 代码 tab 文字 string 图片 / 代码
renderingText / errorText / fallbackText 渲染中 / 失败 / 平台不支持提示 string 渲染中... / 渲染失败: / 当前平台不支持 Mermaid 渲染
lClass / lStyle / ariaLabel / ariaRole 同主组件 - -

Events:copy(源码)、download(文件名)、fullscreen(true)

l-markdown-viewer Props

参数 说明 类型 默认值
show 是否显示 boolean false
type 内容类型 code / mermaid / table string code
code / language 代码或 Mermaid 源码 / 语言 string '' / text
html 表格 HTML string ''
theme 主题模式 string auto
closeAriaLabel 关闭按钮无障碍标签 string 关闭
lClass / lStyle / ariaLabel / ariaRole 同主组件 - -

Events:close

l-markdown-header Props

参数 说明 类型 默认值
title 标题文字,为空不渲染 string ''
actions 操作按钮列表,按显示顺序排列:copy / download / fullscreen string[] []
lClass / lStyle / ariaLabel / ariaRole 同主组件 - -

Events:action(按钮类型) Slots:tabs(中间区域)

l-markdown-webview Props

仅 uni-app x 的 App 原生端需要,页面放一次即可。

参数 说明 类型 默认值
format 渲染产物格式;auto 会按平台选择(鸿蒙用 PNG,其余用 SVG) 'auto' | 'svg' | 'png' auto

l-markdown-text-block(内部组件)

由主组件内部使用,一般不直接引用。Props:html(块 HTML)、theme(light / dark,默认 light)、mathCode(块级公式源码,仅小程序生效)、streaming(默认 false)。Events:itemclick。

主题定制

theme 支持 light / dark / auto(跟随系统)。配色可通过 CSS 变量覆盖,变量名统一为 --l-md-<name>;下表每个变量都可单独设置、互不影响:

变量 默认值 说明
--l-md-card-margin $space-base 所有卡片共享外边距;全屏查看器内置为 0
--l-md-card-radius $radius-lg 所有卡片共享圆角;全屏查看器内置为 0
--l-md-richtext-bg $bg-surface 文本块背景
--l-md-richtext-color $text-primary 文本块文字色
--l-md-richtext-font-family PingFang SC, Microsoft YaHei, sans-serif 正文字体族
--l-md-richtext-font-size $font-size-md 正文字号
--l-md-richtext-line-height 1.7 正文行高
--l-md-code-bg $gray-50 代码块背景
--l-md-code-text $text-primary 代码块文字
--l-md-code-border $gray-200 代码块边框
--l-md-code-keyword #cf222e 语法高亮:关键字
--l-md-code-string #0a3069 语法高亮:字符串
--l-md-code-comment #6e7781 语法高亮:注释
--l-md-code-meta #0550ae 语法高亮:元信息
--l-md-code-storage #cf222e 语法高亮:修饰符
--l-md-code-entity #6639ba 语法高亮:实体 / 标签名
--l-md-code-support #0550ae 语法高亮:内置支持
--l-md-code-constant #0550ae 语法高亮:常量
--l-md-code-variable #953800 语法高亮:变量
--l-md-code-punctuation #24292f 语法高亮:标点
--l-md-code-function #8250df 语法高亮:函数名
--l-md-code-line-number-color $text-quaternary 代码行号色
--l-md-code-mask-bg linear-gradient(…) 代码折叠遮罩背景
--l-md-code-collapsible-text-color $text-tertiary 代码折叠按钮文字
--l-md-table-border $gray-200 表格边框
--l-md-table-richtext-bg $bg-surface 表格文字区背景
--l-md-table-richtext-color $text-primary 表格文字色
--l-md-header-bg $gray-100 共用头部背景
--l-md-header-border-color $gray-200 共用头部边框
--l-md-header-title-color $text-primary 头部标题色
--l-md-header-action-color $text-primary 头部按钮色
--l-md-mermaid-bg transparent Mermaid 容器背景
--l-md-mermaid-border $gray-200 Mermaid 容器边框
--l-md-mermaid-svg-height 300px 图表默认高度
--l-md-math-source-bg $gray-50 公式源码占位背景
--l-md-math-source-border $gray-200 公式源码占位边框
--l-md-math-source-color $text-tertiary 公式源码占位文字
--l-md-viewer-bg $bg-elevated 全屏查看器背景
--l-md-viewer-close-color $text-secondary 查看器关闭按钮

深色主题会覆写上述部分变量,定制时建议同时检查 .l-markdown--dark 下的取值。正文标题色、链接色、引用色、分割线色由内联样式固定,不提供 CSS 变量。

使用示例

方式一:父级或页面根节点设置(推荐)

CSS 变量可继承,在父级容器或页面根节点上设置,即可覆盖组件内卡片、代码块、表格等容器的配色。

<view class="md-wrapper">
  <l-markdown :markdown="mdText" />
</view>

<style>
.md-wrapper {
  --l-md-card-radius: 8px;
  --l-md-richtext-font-size: 15px;
  --l-md-code-bg: #f6f8fa;
}
</style>

方式二:通过 lStyle 在单个实例上设置

<l-markdown :markdown="mdText" :lStyle="{ '--l-md-code-bg': '#1e1e1e' }" />

⚠️ 样式作用域

自定义类名走 lClass、内联变量走 :lStyle,或统一写在父级容器上;正文标题 / 链接 / 引用 / 分割线颜色由内联样式固定,CSS 变量改不到。深色定制还需检查 .l-markdown--dark 下的覆写值。

平台差异与限制

端 差异与限制
H5 / Web(uni-app 与 uni-app x) 全功能,含 Mermaid 与公式;无需放置 <l-markdown-webview />
uni-app x App(Android / iOS / 鸿蒙) 公式走内置 MathJax;必须在页面放置 <l-markdown-webview />,否则公式显示源码、图表以纯文本代码块展示源码;theme="auto" 首次进入可能不跟随系统深色(依赖 lime-style 的响应式主题)
微信小程序等小程序 公式正常渲染;Mermaid 以纯文本代码块展示源码;正文与表格内的链接 / 图片 / 脚注不可点击,link / image / footnote 不触发,内置图片预览不生效;字体域名需加入合法域名白名单
uni-app(非 x)App-Vue 代码块语法高亮降级为纯文本;Mermaid 与公式可用,无需挂代理;离线时公式字体退化为系统字体

补充限制:

  • 小程序不注册 l-markdown-math / l-markdown-mermaid / l-markdown-webview,单独放置这三个组件不会渲染内容;这是为了控制主包体积。
  • 小程序端不支持的点击仅限正文 / 表格内的链接、图片、脚注;代码块 / 表格 / Mermaid 头部的复制 / 下载 / 全屏 / 折叠按钮,以及长按选词、微信原生图片长按菜单均可正常使用。
  • 若小程序端需要链接或图片交互,请在正文之外自行提供入口。
  • 公式引擎在 Web / App-Vue / 小程序为 KaTeX,仅 uni-app x 的 App 原生端为 MathJax;\require{...} 等 MathJax 扩展宏在 KaTeX 下不支持。
  • 下载能力:H5 走浏览器下载,App 写入用户目录,其它端提示不支持。
  • 多实例可同页并存,样式默认隔离。

注意事项

  • 公式字体走 CDN,必须联网;小程序需在后台配置 cdnjs.cloudflare.com 合法域名,App-Vue 离线会退化字体。
  • snapshot 只消费一次,streaming 期间不生效;restoreSnapshot() 返回 null 表示版本不匹配,此时正常解析即可。
  • 长代码或强流式场景可传 :line-numbers="false" 减少节点数;表格折叠行数由 maxRows 控制。
  • 需要扩展代码高亮语言时,修改 components/l-markdown-code/build-hljs.js 的 languages 数组并重跑脚本,产物 lib/hljs-core.js 由脚本生成,请勿手改。
  • 链接需带 http(s) / mailto: / tel: 协议,相对路径不触发 link;组件只抛事件、不接管导航,请用 openMarkdownLink() 或自行实现跳转。文档内锚点与脚注回链不走 link。
  • image 事件触发前组件已调用 uni.previewImage(含全文图片列表,支持左右滑动),宿主不要重复调用,否则会把列表覆盖成单张。
  • 脚注写法:正文写 [^1]、文末写 [^1]: 正文 定义;点击引用触发 footnote,回链「↩」不触发。
  • 正文与引用块可选中复制、可拖动光标自由选词;App 端原生选择菜单会优先消费长按手势,建议只在自己发出的消息上弹菜单。
  • 引用支持多层嵌套,但引用块内的 ul/li、pre、表格面板暂不带灰底。
  • 行内公式覆盖上下标、分式、根号、希腊字母、常用运算符;不认识的命令或括号不配平时退回行内代码显示源码。
  • 深色定制请同时检查 --l-md-* 变量在 .l-markdown--dark 下的覆写值;正文标题 / 链接 / 引用 / 分割线颜色不提供变量覆盖。

快速预览

导入插件后,可以直接使用以下标签查看完整演示:

<!-- 代码位于 uni_modules/lime-markdown/components/lime-markdown -->
<lime-markdown />

插件标签说明

标签类型 示例 说明
组件标签 l-markdown Markdown 渲染主组件
子组件标签 l-markdown-code / l-markdown-table / l-markdown-math / l-markdown-mermaid / l-markdown-viewer / l-markdown-header / l-markdown-webview 功能组件,一般由主组件内部调用,无需单独引用
演示标签 lime-markdown 完整功能演示

文档链接

支持与赞赏

如果你觉得本插件解决了你的问题,可以考虑支持作者:

支付宝赞助 微信赞助

欢迎反馈与贡献。

隐私、权限声明

1. 本插件需要申请的系统权限列表:

无

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

无

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

无

暂无用户评论。