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 相关文章推荐
如何正确解决VuePress本地访问出现资源报错404的问题
Dec 03 Vue.js
vue使用exif获取图片经纬度的示例代码
Dec 11 Vue.js
手写Vue源码之数据劫持示例详解
Jan 04 Vue.js
Vue ​v-model相关知识总结
Jan 28 Vue.js
如何在vue中使用video.js播放m3u8格式的视频
Feb 01 Vue.js
vue实现可拖拽的dialog弹框
May 13 Vue.js
Vue图片裁剪组件实例代码
Jul 02 Vue.js
详解Vue的列表渲染
Nov 20 Vue.js
Vue的生命周期一起来看看
Feb 24 Vue.js
vue打包时去掉所有的console.log
Apr 10 Vue.js
vue css 相对路径导入问题级踩坑记录
Jun 05 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
PHP数组对比函数,存在交集则返回真,否则返回假
2011/02/03 PHP
Win2003+apache+PHP+SqlServer2008 配置生产环境
2014/07/29 PHP
php处理复杂xml数据示例
2016/07/11 PHP
javascript基础知识大全 便于大家学习,也便于我自己查看
2012/08/17 Javascript
jquery 如何动态添加、删除class样式方法介绍
2012/11/07 Javascript
JS原型对象通俗&quot;唱法&quot;
2012/12/27 Javascript
JS代码同步文本框内容的实例方法
2013/07/12 Javascript
教你用AngularJS框架一行JS代码实现控件验证效果
2014/06/23 Javascript
js使用html()或text()方法获取设置p标签的显示的值
2014/08/01 Javascript
JavaScript实现数组随机排序的方法
2015/06/26 Javascript
jQuery实现的经典竖向伸缩菜单效果代码
2015/09/24 Javascript
jquery实现的回旋滚动效果完整实例【附demo源码下载】
2016/09/20 Javascript
AngularJS实现使用路由切换视图的方法
2017/01/24 Javascript
关于Sequelize连接查询时inlude中model和association的区别详解
2017/02/27 Javascript
JavaScript基础之this详解
2017/06/04 Javascript
Angularjs中date过滤器失效的问题及解决方法
2018/07/06 Javascript
在Layui中实现开关按钮的效果实例
2019/09/29 Javascript
JS使用正则表达式实现常用的表单验证功能分析
2020/04/30 Javascript
Python自定义scrapy中间模块避免重复采集的方法
2015/04/07 Python
离线安装Pyecharts的步骤以及依赖包流程
2020/04/23 Python
Python交互环境下实现输入代码
2018/06/22 Python
python算法与数据结构之冒泡排序实例详解
2019/06/22 Python
Python字符串split及rsplit方法原理详解
2020/06/29 Python
蒂芙尼澳大利亚官方网站:Tiffany&Co. Australia
2017/08/27 全球购物
Dr.Jart+美国官网:韩国药妆品牌
2019/01/18 全球购物
学雷锋树新风演讲稿
2014/05/10 职场文书
商务经理岗位职责
2014/08/03 职场文书
解除劳动合同协议书范本
2014/09/13 职场文书
大学运动会加油稿200字(5篇)
2014/09/27 职场文书
感谢信范文大全
2015/01/23 职场文书
幼儿园教师节活动总结
2015/03/23 职场文书
2015年医生个人工作总结
2015/04/25 职场文书
2015年安置帮教工作总结
2015/05/22 职场文书
结婚主持人致辞
2015/07/28 职场文书
Spring Boot 排除某个类加载注入IOC的操作
2021/08/02 Java/Android
Go中的条件语句Switch示例详解
2021/08/23 Golang