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+vant实现购物车全选和反选功能
Nov 17 Vue.js
Vue项目如何引入bootstrap、elementUI、echarts
Nov 26 Vue.js
Vue用mixin合并重复代码的实现
Nov 27 Vue.js
Vue中ref和$refs的介绍以及使用方法示例
Jan 11 Vue.js
vue实现按钮切换图片
Jan 20 Vue.js
vue如何使用rem适配
Feb 06 Vue.js
Vue中使用wangeditor富文本编辑的问题
Feb 07 Vue.js
如何在 Vue 中使用 JSX
Feb 14 Vue.js
vue 使用 v-model 双向绑定父子组件的值遇见的问题及解决方案
Mar 01 Vue.js
vue3.0 项目搭建和使用流程
Mar 04 Vue.js
Vue.Draggable实现交换位置
Apr 07 Vue.js
vue本地构建热更新卡顿的问题“75 advanced module optimization”完美解决方案
Aug 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实现点击可刷新验证码
2015/11/07 PHP
最新最全PHP生成制作验证码代码详解(推荐)
2016/06/12 PHP
PHP实现在对象之外访问其私有属性private及保护属性protected的方法
2017/11/20 PHP
jquery Firefox3.5中操作select的问题
2009/07/10 Javascript
禁止你的左键复制实用技巧
2013/01/04 Javascript
JS常用字符串处理方法应用总结
2014/05/22 Javascript
javascript实现时间格式输出FormatDate函数
2015/01/13 Javascript
JavaScript 基本概念
2015/01/20 Javascript
jQuery验证元素是否为空的两种常用方法
2015/03/17 Javascript
javascript产生随机数方法汇总
2016/01/25 Javascript
plupload+artdialog实现多平台上传文件
2016/07/19 Javascript
ES6学习笔记之Set和Map数据结构详解
2017/04/07 Javascript
swiper移动端轮播插件(触碰图片之后停止轮播)
2017/12/28 Javascript
通过webpack引入第三方库的方法
2018/07/20 Javascript
jQuery实现的简单手风琴效果示例
2018/08/29 jQuery
优雅地使用loading(推荐)
2019/04/20 Javascript
Vue源码之关于vm.$delete()/Vue.use()内部原理详解
2019/05/01 Javascript
js实现图片区域可点击大小随意改变(适用移动端)代码实例
2019/09/11 Javascript
微信小程序全局变量的设置、使用、修改过程解析
2019/09/24 Javascript
Vue中实现回车键切换焦点的方法
2020/02/19 Javascript
[00:35]可解锁地面特效
2018/12/20 DOTA
python 字典(dict)按键和值排序
2016/06/28 Python
Python中使用asyncio 封装文件读写
2016/09/11 Python
Python中fnmatch模块的使用详情
2018/11/30 Python
python 调用钉钉机器人的方法
2019/02/20 Python
健康监测猫砂:Pretty Litter
2017/05/25 全球购物
人力资源主管职责范本
2014/03/05 职场文书
建筑节能汇报材料
2014/08/22 职场文书
办公室禁烟通知
2015/04/23 职场文书
学校推普周活动总结
2015/05/07 职场文书
机关单位保密工作责任书
2015/05/11 职场文书
被告代理词范文
2015/05/25 职场文书
会计岗位工作总结
2015/08/12 职场文书
九年级化学教学反思
2016/02/22 职场文书
浅谈Java实现分布式事务的三种方案
2021/06/11 Java/Android
Python合并pdf文件的工具
2021/07/01 Python