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


Posted in Vue.js onFebruary 14, 2021

之前渲染 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渲染的资料请关注三水点靠木其它相关文章!

Vue.js 相关文章推荐
vue+iview分页组件的封装
Nov 17 Vue.js
vue组件中节流函数的失效的原因和解决方法
Dec 02 Vue.js
详解如何在vue+element-ui的项目中封装dialog组件
Dec 11 Vue.js
手写Vue源码之数据劫持示例详解
Jan 04 Vue.js
如何在VUE中使用vue-awesome-swiper
Jan 04 Vue.js
Vue项目中使用mock.js的完整步骤
Jan 12 Vue.js
vue 递归组件的简单使用示例
Jan 14 Vue.js
详解实现vue的数据响应式原理
Jan 20 Vue.js
vue3.0 自适应不同分辨率电脑的操作
Feb 06 Vue.js
使用Vue3+Vant组件实现App搜索历史记录功能(示例代码)
Jun 09 Vue.js
详细聊聊vue中组件的props属性
Nov 02 Vue.js
vue3使用vuedraggable实现拖拽功能
Apr 06 Vue.js
vue仿携程轮播图效果(滑动轮播,下方高度自适应)
Feb 11 #Vue.js
Vue+Bootstrap实现简易学生管理系统
Feb 09 #Vue.js
详解Vue的七种传值方式
Feb 08 #Vue.js
Vue中使用wangeditor富文本编辑的问题
Feb 07 #Vue.js
vue使用lodop打印控件实现浏览器兼容打印的方法
Feb 07 #Vue.js
vue如何使用rem适配
Feb 06 #Vue.js
如何管理Vue中的缓存页面
Feb 06 #Vue.js
You might like
外媒评选出10支2020年最受欢迎的Dota2战队
2021/03/05 DOTA
php adodb连接不同数据库
2009/03/19 PHP
php str_pad() 将字符串填充成指定长度的字符串
2010/02/23 PHP
在PHP中使用curl_init函数的说明
2010/11/02 PHP
php 邮件发送问题解决
2014/03/22 PHP
js tab 选项卡
2009/04/26 Javascript
JavaScript中使用replace结合正则实现replaceAll的效果
2010/06/04 Javascript
JavaScript 联动的无限级封装类,数据采用非Ajax方式,随意添加联动
2010/06/29 Javascript
jquery下组织javascript代码(js函数化)
2010/08/25 Javascript
二叉树的非递归后序遍历算法实例详解
2014/02/07 Javascript
ES6中如何使用Set和WeakSet
2016/03/10 Javascript
完美解决jQuery符号$与其他javascript 库、框架冲突的问题
2016/08/09 Javascript
bootstrap按钮插件(Button)使用方法解析
2017/01/13 Javascript
客户端(vue框架)与服务器(koa框架)通信及服务器跨域配置详解
2017/08/26 Javascript
NodeJs通过async/await处理异步的方法
2017/10/09 NodeJs
微信小程序实现上传图片功能
2018/05/28 Javascript
基于element-ui的rules中正则表达式
2018/09/04 Javascript
微信小程序iBeacon测距及稳定程序的实现解析
2019/07/31 Javascript
Vue过渡效果之CSS过渡详解(结合transition,animation,animate.css)
2020/02/05 Javascript
vue点击Dashboard不同内容 跳转到同一表格的实例
2020/11/13 Javascript
[40:48]DOTA2上海特级锦标赛D组败者赛 Liquid VS COL第二局
2016/02/28 DOTA
python实现单向链表详解
2018/02/08 Python
Python基于进程池实现多进程过程解析
2020/04/30 Python
美国女性服饰销售网站:Nasty Gal(坏女孩)
2016/07/26 全球购物
自我评价格式
2014/01/06 职场文书
高中军训感言400字
2014/02/24 职场文书
中等生评语大全
2014/05/04 职场文书
白莲教口号
2014/06/18 职场文书
网络妈妈观后感
2015/06/08 职场文书
公司年会晚会开幕词
2019/04/02 职场文书
用python实现监控视频人数统计
2021/05/21 Python
Python自动化测试PO模型封装过程详解
2021/06/22 Python
浅谈redis整数集为什么不能降级
2021/07/25 Redis
Spring Security使用单点登录的权限功能
2022/04/03 Java/Android
4种方法python批量修改替换列表中元素
2022/04/07 Python
Javascript webpack动态import
2022/04/19 Javascript