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实现表格合并功能
Dec 01 Vue.js
如何在VUE中使用vue-awesome-swiper
Jan 04 Vue.js
vue keep-alive的简单总结
Jan 25 Vue.js
如何封装Vue Element的table表格组件
Feb 06 Vue.js
vue3.0 自适应不同分辨率电脑的操作
Feb 06 Vue.js
vue如何使用rem适配
Feb 06 Vue.js
vue首次渲染全过程
Apr 21 Vue.js
vue配置型表格基于el-table拓展之table-plus组件
Apr 12 Vue.js
vue使用localStorage持久性存储实现评论列表
Apr 14 Vue.js
vue项目配置sass及引入外部scss文件
Apr 14 Vue.js
vue里使用create, mounted调用方法
Apr 26 Vue.js
vue el-table实现递归嵌套的示例代码
Aug 14 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获取表单textarea数据中的换行问题
2010/09/10 PHP
php学习之简单计算器实现代码
2011/06/09 PHP
php中mkdir函数用法实例分析
2014/11/15 PHP
PHP常用函数总结(180多个)
2016/12/25 PHP
ThinkPHP框架实现的MySQL数据库备份功能示例
2018/05/24 PHP
基于jQuery的ajax功能实现web service的json转化
2009/08/29 Javascript
js去空格技巧分别去字符串前后、左右空格
2013/10/21 Javascript
AngularJS的一些基本样式初窥
2015/07/27 Javascript
JavaScript中var关键字的使用详解
2015/08/14 Javascript
JS中的==运算: [''] == false —&gt;true
2016/07/24 Javascript
javascript笔记之匿名函数和闭包
2017/02/06 Javascript
js实现二级导航功能
2017/03/03 Javascript
Vue波纹按钮组件制作
2018/04/30 Javascript
微信小程序实现日历效果
2018/12/28 Javascript
VScode格式化ESlint方法(最全最好用方法)
2019/09/10 Javascript
js+css3实现简单时钟特效
2020/09/13 Javascript
python正则表达式判断字符串是否是全部小写示例
2013/12/25 Python
Python中的True,False条件判断实例分析
2015/01/12 Python
详解 Python 与文件对象共事的实例
2017/09/11 Python
Python实现一个服务器监听多个客户端请求
2018/04/12 Python
python模块和包的应用BASE_PATH使用解析
2019/12/14 Python
Python matplotlib图例放在外侧保存时显示不完整问题解决
2020/07/28 Python
使用python实现学生信息管理系统
2021/02/25 Python
使用HTML5 Geolocation实现一个距离追踪器
2018/04/09 HTML / CSS
中国专业的音频分享平台:喜马拉雅
2019/05/24 全球购物
法国体育用品商店:GO Sport
2019/10/23 全球购物
动态密码技术
2012/10/18 面试题
C#可否对内存进行直接的操作
2015/02/26 面试题
大四学生思想汇报
2014/01/13 职场文书
读群众路线心得体会
2014/03/07 职场文书
学习雷锋演讲稿
2014/05/10 职场文书
学生偷窃检讨书
2014/09/25 职场文书
高一学年自我鉴定范文(3篇)
2014/09/26 职场文书
学习习近平主席讲话心得体会
2016/01/20 职场文书
《角的初步认识》教学反思
2016/02/17 职场文书
Python列表删除重复元素与图像相似度判断及删除实例代码
2021/05/07 Python