MarkdownRenderer - 流式 Markdown 渲染器

MarkdownRenderer 是轻量只读 Markdown 渲染组件,面向 LLM 流式输出。相比 MarkdownEditor 只读模式,无 Slate 依赖,体积更小、首屏更快;内置 GPT 风格逐词淡入,并支持图表 / 思维链 / 工具调用 / 文件预览 / Mermaid / 公式等代码块扩展。

何时使用

  • 聊天 / Agent 场景渲染 LLM 的 Markdown 输出
  • 内容流式追加(streaming + 持续更新 content),需要 GPT 风格逐词淡入
  • 将代码块语言扩展为图表、Mermaid、文件树、工具调用、Schema 等业务渲染器
  • 不需要编辑能力,希望尽可能轻量

如需可编辑能力(评论、富文本、表格 inline 编辑等),请使用 MarkdownEditor。

代码演示

API Playground

串联调试流式、链接、自定义渲染与 ref

流式与逐词淡入

流式输出 · 限流 / 淡入开关与对比预览

streaming={true} 时默认开启 GPT 风格逐词淡入:新词各自淡入一次,已显示内容复用 DOM、不闪烁;纯 CSS 驱动,尊重 prefers-reduced-motion。代码块、表格、公式不参与拆词。关闭方式:

<MarkdownRenderer
  content={content}
  streaming
  throttleOptions={{ fade: false }}
/>

限流与淡入相互独立:throttleOptions.enabled: false 时内容即时渲染,fade 仍可单独控制。

isFinished={true} 会立即展示剩余正文并退出流式状态,即使 streaming 仍为 true。结束后移除内部逐词动画节点,保留媒体、图表等已有组件的状态。

流式追加会复用未变块的 React 元素与解析结果,普通正文只重新切分末尾窗口;脚注保留定义上下文并增量解析尾部,新增全局定义或正文修订时重新校验。代码块、表格分别订阅自身配置,更新表格预览配置不会刷新代码块。自定义解析插件数组建议保持引用稳定,实际插件变更会重建解析器并重新解析。

Mark 标签颜色与 Label

Mark 颜色定制与 Label 显示

快速上手

静态 Markdown

import { MarkdownRenderer } from '@ant-design/agentic-ui';
import React from 'react';

export default () => (
  <MarkdownRenderer
    content={`# Hello\n\n这是 **Markdown** 内容。\n\n- 支持列表\n- 支持 \`代码\`\n\n\`\`\`ts\nconst answer = 42;\n\`\`\``}
  />
);

流式渲染

import { MarkdownRenderer } from '@ant-design/agentic-ui';
import React, { useEffect, useState } from 'react';

const FULL = '# 流式输出\n\n智能体正在思考,逐字给出答案……';

export default () => {
  const [content, setContent] = useState('');
  const [done, setDone] = useState(false);

  useEffect(() => {
    let i = 0;
    const timer = setInterval(() => {
      i += 3;
      setContent(FULL.slice(0, i));
      if (i >= FULL.length) {
        setDone(true);
        clearInterval(timer);
      }
    }, 60);
    return () => clearInterval(timer);
  }, []);

  return (
    <MarkdownRenderer
      content={content}
      streaming={!done}
      isFinished={done}
      // 逐词淡入默认开启;传 throttleOptions={{ fade: false }} 可关闭
    />
  );
};

在 Bubble 中经 markdownRenderConfig 透传即可:

<BubbleList
  markdownRenderConfig={{
    renderMode: 'markdown',
    throttleOptions: { fade: false }, // 可选:关闭淡入
  }}
/>

自定义代码块渲染

通过 plugins[].renderer.rendererComponents 注册渲染器,键名对应代码块 language。内置语言(mermaid、chart、schema 等)的同名键会优先覆盖默认渲染。

import { MarkdownRenderer } from '@ant-design/agentic-ui';
import React from 'react';

export default () => (
  <MarkdownRenderer
    content={'```mermaid\ngraph TD;\nA-->B;\n```'}
    plugins={[
      {
        renderer: {
          rendererComponents: {
            // 键名是 language;props.language 与 props.children 会透传
            mermaid: ({ language, children }) => (
              <pre>自定义 {language} 渲染</pre>
            ),
          },
        },
      },
    ]}
  />
);

MarkdownEditorPlugin.elements 仅用于 Slate 编辑器;MarkdownRenderer 只读 plugin.renderer.rendererComponents。

完整示例见 OfficeViewer - Markdown 中渲染卡片:Word / Excel 渲染为文件卡片、PPTX 卡片内展示幻灯片缩略图列表,点击打开详情预览。

API

MarkdownRendererProps

PropertyDescriptionTypeDefaultVersion
apaasifyApaas 数据双向绑定(render 签名与 MarkdownEditor.apaasify 不同:此处入参为已解析 value){ enable?: boolean; render?: (value: any) => React.ReactNode }--
className自定义类名string--
codeProps代码块配置(透传 MarkdownEditor 同名属性)MarkdownEditorProps['codeProps']--
contentMarkdown 文本内容string--
eleRender自定义节点渲染回退;返回 undefined 时用默认渲染(props: MarkdownRendererEleProps, defaultDom: React.ReactNode) => React.ReactNode--
fileMapConfig文件地图(agentic-ui-filemap)代码块渲染配置FileMapConfig--
fncProps脚注配置(透传 MarkdownEditor 同名属性)MarkdownEditorProps['fncProps']--
htmlConfigMarkdown → HTML 配置,见 MarkdownToHtmlConfigMarkdownToHtmlConfig--
isFinished流式是否已结束;立即展示剩余正文、退出流式状态并清理逐词动画节点booleanfalse-
linkConfig链接行为;仅显式 openInNewTab: false 时同标签页打开{ openInNewTab?: boolean; onClick?: (url?: string) => boolean | void }{ openInNewTab: true }-
plugins编辑器 / 渲染器插件MarkdownEditorPlugin[]--
prefixCls类名前缀(透传 antd getPrefixCls)string'agentic-md-editor'-
remarkPlugins自定义 remark/rehype 插件,如 [remarkGfm, [remarkMath, { singleDollarTextMath: false }]]MarkdownRemarkPlugin[]--
streaming是否处于流式输出booleanfalse-
style自定义样式React.CSSProperties--
tableConfig原生只读表格预览配置,支持按需挂载全屏弹窗或抽屉MarkdownRendererTableConfig-2.32.48
throttleOptions流式限流与展示配置(含逐词淡入 fade);streaming={true} 且未设 enabled: false 时默认开启限流ContentThrottleOptions--

MarkdownRendererTableConfig

PropertyDescriptionTypeDefaultVersion
actions.fullScreen表格全屏预览容器'modal' | 'drawer'-2.32.48
previewTitle预览标题,默认使用语言包string-2.32.48
<MarkdownRenderer
  content={markdown}
  tableConfig={{ actions: { fullScreen: 'modal' } }}
/>

表格操作在悬停或聚焦后挂载,预览正文在打开后挂载,关闭后释放。视频与音频默认 preload="none",自动播放时加载元数据;HTML 中显式指定的 preload 优先。

MarkdownRendererRef

Property / MethodDescriptionType
getDisplayedContent获取当前已实际渲染(含限流推进)的文本内容() => string
nativeElement根 DOM 节点HTMLDivElement | null

ContentThrottleOptions

控制流式内容按帧推进的节奏,并统一承载逐词淡入开关。

PropertyDescriptionTypeDefaultVersion
backgroundBatchMultiplier后台每批字符相对前台倍数number10-
backgroundInterval标签页不可见时的轮询间隔(ms)number100-
charsPerFrame每帧最多推进字符数number3-
enabled为 false 时关闭限流,流式内容即时渲染booleantrue-
fadeGPT 风格逐词淡入;仅 streaming 时生效,传 false 关闭booleantrue-
flushOnComplete流式结束时是否立即展示剩余内容booleantrue-
speed速度倍率number1-

MarkdownToHtmlConfig

PropertyDescriptionTypeDefault
markedConfig用户自定义 unified 插件数组MarkdownRemarkPlugin[]-
openLinksInNewTab是否在新标签页打开链接(与外层 linkConfig.openInNewTab 二选一即可)boolean-
paragraphTag自定义段落标签string'p'

FileMapConfig

PropertyDescriptionType
itemRender自定义媒体条目渲染FileMapViewProps['itemRender']
normalizeFile将原始 JSON 条目转为 AttachmentFile,返回 null 过滤该条目(raw: Record<string, unknown>, defaultFile: AttachmentFile) => AttachmentFile | null
onPreview自定义预览(传入则阻止内置灯箱 / 弹窗 / window.open)(file: AttachmentFile) => void

内置代码块渲染器

按代码块 language 路由;业务可直接书写带语言标记的代码块触发:

LanguageRendererDescription
mermaidMermaidBlockRendererMermaid 流程图 / 时序图
chart / json-chartChartBlockRenderer内置图表(line/bar/pie/area/scatter/radar/funnel 等)
agentic-ui-filemapAgenticUiFileMapBlockRenderer文件地图 / 附件列表预览
agentic-ui-taskAgenticUiTaskBlockRendererTaskList 任务步骤
agentic-ui-toolusebar / agentic-ui-usertoolbarAgenticUiToolUseBarBlockRendererToolUseBar 工具调用
schema / apaasify / apassify / agentar-cardSchemaBlockRendererSchema 渲染 / 编辑(多语言别名等价触发)
其它(含 katex、ts、bash 等)CodeBlockRenderer代码高亮、KaTeX 公式

上述渲染器均由 MarkdownRenderer 顶层导出,可在自定义流水线中独立复用。

相关 Hook 与工具

NameDescription
useMarkdownToReact将 Markdown 同步转为 React 节点(非流式)
markdownToReactSyncuseMarkdownToReact 的非 Hook 版本
useStreaming流式 token 安全缓存,暂缓未闭合语法避免半成品 DOM
useStreamingMarkdownReact与 useMarkdownToReact 同一函数(互为别名);token 缓存 + Markdown→React 组合发生在 MarkdownRenderer 内部
useContentThrottle按 ContentThrottleOptions 限流推进已展示内容

注意事项

  1. isFinished vs streaming:流式过程保持 streaming={true};结束时将 isFinished 置 true 会立即展示剩余字符并退出流式状态。未设置结束标记时,限流器也会按 charsPerFrame 自然推完,但仍保留流式展示模式。
  2. throttleOptions.fade:仅 streaming={true} 时生效,默认开启;仅显式 fade: false 关闭。代码块、表格、公式不参与拆词。Slate 模式(默认 renderMode: 'slate')无逐词淡入。
  3. linkConfig.onClick:返回 false 可阻止默认跳转。
  4. eleRender:返回 undefined / null 回退默认 DOM;只有显式返回 React 节点才会覆盖。