Vue3实现markdown-it支持chartjs、Echartjs、mermaid的渲染(附实例代码)

 更新时间:2025年08月13日 08:58:22   作者:小牛变大niu  
markdown-it-vue使用markdown-it作为Markdown数据解析引擎,整合多种markdown-it插件,并内置了一些自己的功能性插件,这篇文章主要介绍了Vue3实现markdown-it支持chartjs、Echartjs、mermaid渲染的相关资料,需要的朋友可以参考下

核心功能需求

通过markdown-it插件扩展语法解析Markdown代码块,支持动态渲染交互式图表和流程图。配置自定义渲染规则处理特殊代码类型,实现可视化内容嵌入。

<template>
  <div v-html="renderedContent"></div>
</template>

1.插件安装与配置

npm install markdown-it markdown-it-multimd-table markdown-it-anchor markdown-it-toc markdown-it-emoji markdown-it-footnote markdown-it-task-lists

2. 引入markdown-it插件

import MarkdownIt from 'markdown-it'
import markdownItTable from 'markdown-it-multimd-table'
import markdownItAnchor from 'markdown-it-multimd-table'
import markdownItToc from 'markdown-it-multimd-table'
import markdownItEmoji from 'markdown-it-multimd-table'
import markdownItFootnote from 'markdown-it-multimd-table'
import markdownItTaskLists from 'markdown-it-multimd-table'

3. 配置markdown渲染规则

const md = new MarkdownIt({
  html: true,
  xhtmlOut: true,
  linkify: true,
  breaks: true,
  typographer: true,
  quotes: ["\"", "\"", "'", "'"],
  langPrefix: 'language-',
  highlight: (code, lang) => {
    if (!lang) return `<pre><code>$[code]</code></pre>`

    const languageName = getCorrectLanguageName(lang)

    // 处理特殊语言
    if (lang === 'echarts') {
      return `<div class="code-block">
        ${renderECharts(code)}
      </div>`
    }

    if (lang === 'mermaid') {
      return `<div class="code-block">
        ${renderMermaid(code)}
      </div>`
    }

    // 处理普通代码
    if (hljs.getLanguage(lang)) {
      try {
        const highlightedCode = hljs.highlight(code, { language: lang }).value
        return `<div class="code-block">
          <pre><code class="hljs ${lang}">${highlightedCode}</code></pre>
        </div>`
      } catch (__) { }
    }

    return `<pre><code>$[code]</code></pre>`
  }
}).use(markdownItTable)
  .use(markdownItAnchor)
  .use(markdownItToc)
  .use(markdownItEmoji)
  .use(markdownItFootnote)
  .use(markdownItTaskLists)

除了配置 markdown 渲染规则外,您还可以通过 md.renderer.rules 自定义渲染规则。上述配置的作用是:在 markdown 渲染过程中,代码块会生成带有 language-代码类型名称 的标签,以此来确定适用的渲染规则。

4.配置语言名称映射

const languageNameMap = {
  sql: 'SQL',
  javascript: 'JavaScript',
  java: 'Java',
  typescript: 'TypeScript',
  vbscript: 'VBScript',
  css: 'CSS',
  html: 'HTML',
  xml: 'XML',
  php: 'PHP',
  python: 'Python',
  yaml: 'Yaml',
  mermaid: 'Mermaid',
  markdown: 'MarkDown',
  makefile: 'MakeFile',
  echarts: 'ECharts',
  shell: 'Shell',
  powershell: 'PowerShell',
  json: 'JSON',
  latex: 'Latex',
  svg: 'SVG',
  abc: 'ABC',
}
// 获取正确的语言名称
const getCorrectLanguageName = (language) => {
  if (!language) return 'Plain'
  return languageNameMap[language] || language.charAt(0).toUpperCase() + language.substring(1)
}

5.渲染 ECharts

const renderECharts = (code) => {
  console.log(code)
  try {
    const option = JSON.parse(code)
    const chartId = 'chart-' + Math.random().toString(36).substr(2, 9)
    const chartHtml = `<div id="${chartId}" class="echarts-container" style="width: 100%; height: 400px;"></div>`
    // 使用 nextTick 确保 DOM 已经渲染
    nextTick(() => {
      const chartDom = document.getElementById(chartId)
      if (chartDom) {
        const chart = echarts.init(chartDom)
        chart.setOption(option)

        // 响应式调整
        const resizeObserver = new ResizeObserver(() => {
          chart.resize()
        })
        resizeObserver.observe(chartDom)

        // 清理函数
        onUnmounted(() => {
          resizeObserver.disconnect()
          chart.dispose()
        })
      }
    })

    return chartHtml
  } catch (error) {

    return `<div class="error-message">ECharts渲染中</div>`
  }
}

6.渲染 Mermaid

const renderMermaid = async (code) => {
  try {
    const diagramId = 'mermaid-' + Math.random().toString(36).substr(2, 9)
    const diagramHtml = `<div class="mermaid" id="${diagramId}">$[code]</div>`

    // 使用 nextTick 确保 DOM 已经渲染
    nextTick(async () => {
      const diagramDom = document.getElementById(diagramId)
      if (diagramDom) {
        await mermaid.render(diagramId, code)
      }
    })

    return diagramHtml
  } catch (error) {
    // console.error('Mermaid rendering error:', error)
    return `<div class="error-message">Mermaid 图表渲染中</div>`
  }
}

总结

到此这篇关于Vue3实现markdown-it支持chartjs、Echartjs、mermaid渲染的文章就介绍到这了,更多相关Vue3支持chartjs、Echartjs、mermaid渲染内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • vue.js 嵌套循环、if判断、动态删除的实例

    vue.js 嵌套循环、if判断、动态删除的实例

    下面小编就为大家分享一篇vue.js 嵌套循环、if判断、动态删除的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-03-03
  • Vue3和Vue2的slot-scope插槽用法解读

    Vue3和Vue2的slot-scope插槽用法解读

    这篇文章主要介绍了Vue3和Vue2的slot-scope插槽用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-10-10
  • IOS上微信小程序密码框光标离开提示存储密码的完美解决方案

    IOS上微信小程序密码框光标离开提示存储密码的完美解决方案

    ios密码框输入密码光标离开之后会提示存储密码的弹窗,关于这样的问题怎么解决呢,下面给大家分享IOS上微信小程序密码框光标离开提示存储密码的完美解决方案,感兴趣的朋友一起看看吧
    2024-07-07
  • Vue组件选项props实例详解

    Vue组件选项props实例详解

    父组件通过 props 向下传递数据给子组件,子组件通过 events 给父组件发送消息。本文将详细介绍Vue组件选项props,需要的朋友可以参考下
    2017-08-08
  • 基于Vue3+Node.js实现实时可视化监控系统

    基于Vue3+Node.js实现实时可视化监控系统

    在日常运维和开发工作中,服务器监控是必不可少的环节,市面上有不少优秀的监控方案,但对于中小型团队或个人开发者来说,这些工具往往过于复杂,学习成本较高,本文将介绍我自己开发的 ServWatch 监控系统——一个轻量级、易部署、界面美观的实时监控解决方案
    2026-02-02
  • vue启动报错‘vue-cli-service serve‘问题及解决

    vue启动报错‘vue-cli-service serve‘问题及解决

    这篇文章主要介绍了vue启动报错‘vue-cli-service serve‘问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-10-10
  • Vue中路由参数与查询参数传递对比解析

    Vue中路由参数与查询参数传递对比解析

    在Vue.js中,路由与导航不仅涉及页面切换,还包括了向页面传递参数和获取查询参数,这篇文章主要介绍了Vue路由参数与查询参数传递,需要的朋友可以参考下
    2023-08-08
  • vue子组件改变父组件传递的prop值通过sync实现数据双向绑定(DEMO)

    vue子组件改变父组件传递的prop值通过sync实现数据双向绑定(DEMO)

    本文通过一个demo给大家介绍了vue子组件改变父组件传递的prop值通过sync实现数据双向绑定,代码简单易懂,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-02-02
  • 前端构建工具Webpack、Vite区别有哪些

    前端构建工具Webpack、Vite区别有哪些

    Webpack和Vite是两种主流的前端构建工具,它们在功能、性能和使用场景上有所不同,Webpack提供丰富的功能和配置,适合大型复杂项目,但可能导致启动和构建速度较慢,Vite基于ES模块,支持快速的热替换,适合小型或中等项目,需要的朋友可以参考下
    2024-10-10
  • vue2.0 路由模式mode=

    vue2.0 路由模式mode="history"的作用

    这篇文章主要介绍了vue2.0 路由模式mode="history"的作用,非常不错,具有一定的参考借鉴价值 ,需要的朋友可以参考下
    2018-10-10

最新评论