Vue单页面应用中实现Markdown渲染

 更新时间:2021年02月14日 09:55:48   作者:YouXam  
这篇文章主要介绍了Vue单页面应用中如何实现Markdown渲染,帮助大家更好的理解和使用vue,感兴趣的朋友可以了解下

之前渲染 Markdown 的时候, 笔者使用的是 mavonEditor 的预览模式, 使用起来比较爽, 只需要引入组件即可, 但是在最近的开发中, 遇到了困难.

主要问题在于作为单页面应用, 站内链接必须是使用 router-link 跳转, 如果使用 mavonEditor 默认渲染的 a 标签, 就会重新加载页面, 用户体验较差.

动态渲染

想要实现在前端动态地根据用户内容渲染router-link , 需要使用动态渲染, 根据 官方文档, 直接修改vue.config.js 即可:

// vue.config.js
module.exports = {
 runtimeCompiler: true
}

渲染 Markdown

笔者使用的是 markdown-it, 配置过程如下:

安装

npm install markdown-it --save # 本体
npm install markdown-it-highlightjs --save # 代码高亮
npm install markdown-it-katex --save # latex 支持

这里还另外安装了两个语法插件, 如果有其他需要的话, 可以在 npm 上搜索

静态文件导入

highlight.js
通过 cdn 导入, 在 index.html 中加入:

<link rel="stylesheet" href="//cdn.jsdelivr.net/gh/highlightjs/cdn-release@10.5.0/build/styles/default.min.css" rel="external nofollow" >
<script src="//cdn.jsdelivr.net/gh/highlightjs/cdn-release@10.5.0/build/highlight.min.js"></script>

github-markdown-css

markdown 的样式

安装

npm install github-markdown-css --save

导入

在 main.js 文件中添加

import 'github-markdown-css/github-markdown.css'

katex

通过 cdn 导入, 在 index.html 中加入:

<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.5.1/katex.min.css" rel="external nofollow" >

使用

首先在 components 目录下创建 Markdown.vue 文件,

<template>
 <components :is="html" class="markdown-body"></components>
</template>

<script>
import MarkdownIt from 'markdown-it'
import hljs from 'markdown-it-highlightjs'
import latex from 'markdown-it-katex'
export default {
 name: 'Markdown',
 props: {
  content: String
 },
 data: () => ({
  md: null
 }),
 computed: {
  // 使用 computed 才能在动态绑定时动态更新
  html: function () {
   let res = this.md.render(this.content)
   // 使用正则表达式将站内链接替换为 router-link 标签
   res = res.replace(/<a href="(?!http:\/\/|https:\/\/)(.*?)" rel="external nofollow" >(.*?)<\/a>/g, '<router-link to="$1">$2</router-link>')
   // 使用正则表达式将站外链接在新窗口中打开
   res = res.replace(/<a href="(.*?)" rel="external nofollow" >(.*?)<\/a>/g, '<a href="$1" rel="external nofollow" target="_blank">$2</a>')
   return {
    template: '<div>' + res + '</div>'
   }
  }
 },
 created () {
  this.md = new MarkdownIt()
  this.md.use(hljs).use(latex)
 }
}
</script>

然后在想使用的地方导入即可

<template>
  <div>
    <Markdown :content="content"/>
  </div>
</template>

<script>
import Markdown from '@/components/Markdown.vue'
export default {
 name: 'Home',
 components: {
  Markdown
 },
 data: () => ({
  content: ''
 }),
 created () {
  this.content = '# 测试'
 }
}
</script>

以上就是Vue单页面应用中实现Markdown渲染的详细内容,更多关于vue Markdown渲染的资料请关注脚本之家其它相关文章!

相关文章

  • 深入解析el-col-group强大且灵活的Element表格列组件

    深入解析el-col-group强大且灵活的Element表格列组件

    这篇文章主要为大家介绍了el-col-group强大且灵活的Element表格列组件深入解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • iview table render集成switch开关的实例

    iview table render集成switch开关的实例

    下面小编就为大家分享一篇iview table render集成switch开关的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-03-03
  • 如何在Vue3中正确使用ElementPlus,亲测有效,避坑

    如何在Vue3中正确使用ElementPlus,亲测有效,避坑

    这篇文章主要介绍了如何在Vue3中正确使用ElementPlus,亲测有效,避坑!具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-03-03
  • Vite开发环境搭建详解

    Vite开发环境搭建详解

    Vite是一款非常轻量级的Web开发框架,它可以帮助开发者快速搭建一个开发环境。Vite搭建的开发环境可以提供更快的编译速度,更少的配置,更好的性能和更多的开发者友好性,使开发者可以更快地构建出功能强大的Web应用程序。
    2023-02-02
  • vue3的基本使用方法详细教程

    vue3的基本使用方法详细教程

    这篇文章主要介绍了vue3的基本使用方法,结合实例形式详细分析了vue3功能、组件、生命周期、TypeScript结合运用等相关概念与使用方法,需要的朋友可以参考下
    2023-06-06
  • vue2中使用echarts实现中国地图、在中国地图上标注坐标散点图的操作代码

    vue2中使用echarts实现中国地图、在中国地图上标注坐标散点图的操作代码

    这篇文章主要介绍了vue2中使用echarts实现中国地图、在中国地图上标注坐标散点图,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2024-05-05
  • 一款移动优先的Solid.js路由solid router stack使用详解

    一款移动优先的Solid.js路由solid router stack使用详解

    这篇文章主要为大家介绍了一款移动优先的Solid.js路由solid router stack使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • vue中如何引入jest单元测试

    vue中如何引入jest单元测试

    这篇文章主要介绍了vue中如何引入jest单元测试问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • 一文学会什么是vue.nextTick()

    一文学会什么是vue.nextTick()

    这篇文章主要介绍了一文学会什么是vue.nextTick(),下面文章围绕主题的相关资料展开详细内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-04-04
  • Vue Router之router.push和router.resolve页面跳转方式

    Vue Router之router.push和router.resolve页面跳转方式

    这篇文章主要介绍了Vue Router之router.push和router.resolve页面跳转方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-04-04

最新评论