vue项目中如何加载markdown

news/2025/3/13 10:40:04/文章来源:https://www.cnblogs.com/IwishIcould/p/18570406

场景

今天忽然临时接到一个需求:
就是将markdown文件直接在vue项目中进行加载,并正常显示出来。
这......,我知道是可以进行加载markdown文件的。
但是我之前没有做过,答复的是:可以做的,但是这个需要一点时间。
领导:那行,你先调研一下。

简单介绍 vue-markdown-loader

vue-markdown-loader可以将 Markdown 文件转换成Vue组件。
安装 npm i vue-markdown-loader -D

步骤1:在vue.config.js文件中去配置

module.exports = {chainWebpack:config=>{// 定义一个新的webpack模块规则,命名为mdconfig.module.rule('md')// 通过.test()方法,指定这个规则应该匹配哪些文件// 这个规则将应用于所有以.md结尾的文件,即Markdown文件.test(/\.md/)// 使用vue-loader来处理Markdown文件.use('vue-loader').loader('vue-loader').end()// 指定vue-markdown-loader来处理Markdown文件.use('vue-markdown-loader')// 使用vue-markdown-loader包中的markdown-compiler模块来处理Markdown文件.loader('vue-markdown-loader/lib/markdown-compiler')// raw: true以原始字符串的形式处理Markdown内容,不进行HTML转义等处理。.options({raw: true})}
}

哦豁-项目启动报错

遇见的问题1:SyntaxError: Unexpected token '??='
产生问题的原因:你的node版本是否太低。
在项目中验证是否支持??=,可以验证一下。太低的话升级版本就行
还有一种可能:less-loader或者sass-loader或者其他的包的版本不对。

遇见的问题2: Syntax Error: TypeError: Cannot read property ‘styles‘ of undefined
产生问题的原因:vue-loader的版本太高造成的。
我的项目是webpack的版本是:webpack5,它对应的vue-loader应该是vue-loader15,
我将它降级为:vue-loader@15

步骤2:在使用的页面

<template><div><showMarkdown></showMarkdown></div>
</template>
<script>
// 引入的
import showMarkdown from './biji.md'
export default {components:{showMarkdown},data() {return {}}
}
</script>

发现问题:优化样式

我们需要下载 github-markdown-css
npm i github-markdown-css -S
这个是用来优化markdown展示出来的样式
能够保持与GitHub相同的视觉效果
在需要的文件中引入 import 'github-markdown-css';
然后我们在组件的父级使用markdown-body这个类来美化markdown

<template><div><div class="markdown-body"><showMarkdown></showMarkdown></div></div>
</template><script>
import 'github-markdown-css';
import showMarkdown from './biji.md'
export default {components:{showMarkdown}
}
</script>

可以把markdown文件在路由中引入吗?

有的小伙伴说:既然我们能够在页面中引入当成组件,
那可以在路由文件中引入嘛?
回答:可以的。下面我们就来看下

const routes = [{path: '/',name: 'Home',component: ()=>import("../views/echarts.vue")},{path: '/xuexi',name: 'xuexi',component: ()=>import("../views/xuexi.vue")},{path: '/md',name: 'md',// 引入的md文件component: ()=>import("../views/biji.md")},
]
const router = new VueRouter({mode: 'hash',base: process.env.BASE_URL,routes
})

main.js中引入 'github-markdown-css';

import Vue from 'vue'
import App from './App.vue'
import router from './router'
//全局引入
import 'github-markdown-css';
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';
Vue.config.productionTip = falseVue.use(ElementUI);
new Vue({router,render: h => h(App)
}).$mount('#app')

app.vue使用样式

<template><div id="app" class="markdown-body"><div id="nav"><router-link to="/">Home</router-link> |<router-link to="/about">About</router-link> |<router-link to="/about">About</router-link> |<router-link to="/echarts">echarts</router-link> |<router-link to="/art">art</router-link> |<router-link to="/test">test</router-link> |<router-link to="/xuexi">xuexi</router-link> |</div><router-view/></div>
</template>

发现问题:markdown-body 污染了全局样式

我们发现这样整个项目中都有 markdown-body 这个类了。
这样会影响其他组件的布局样式。
我们只想在引入的文件是md才有这个样式。
其他的文件没有这个样式。
这个是否我们可以在app.vue文件中判断是否是md文件。
如果是md文件我们添加上markdown-body这个类,否则移除。
我们在路由文件中的meta属性来判断是否是md文件类型

路由文件

const routes = [{path: '/md',name: 'md',component: ()=>import("../views/biji.md"),meta:{fileType:'md'}},{path: '/amd',name: 'amd',component: ()=>import("../views/amd.md"),meta:{fileType:'md'}}
]

app.vue

<template><div id="app" :class="componentPathName=='md' ? 'markdown-body' : null"><div id="nav"><router-link to="/">Home</router-link> |<router-link to="/about">About</router-link> |<router-link to="/about">About</router-link> |<router-link to="/echarts">echarts</router-link> |<router-link to="/art">art</router-link> |<router-link to="/test">test</router-link> |<router-link to="/xuexi">xuexi</router-link> |</div><router-view/></div>
</template>
<script>export default {computed: {componentPathName () {return this.$route.meta && this.$route.meta.fileType}},}
</script>

md文件内容有些时候是从服务端获取的

上面我们渲染的都是本地的文件.
如果 markdown 的内容是从服务端获取的。
动态渲染怎么去处理呢?
我们需要下载 vue-markdown
npm install vue-markdown --save
然后在vue.config.js文件中去配置,与上面的配置相同(一样的哈)

vue-markdown

它允许在Vue应用中轻松展示Markdown格式的内容。
它支持标准的Markdown语法。
如标题、列表、链接、图片、代码块等,并能够将Markdown文本解析为HTML格式。
从而在Vue组件中展示。

vue-markdown 的简单使用

<template><div><VueMarkdown>{{ mdCont }}</VueMarkdown></div>
</template><script>
import VueMarkdown from 'vue-markdown';
export default {components:{VueMarkdown},data() {return{mdCont:'#### 绘制一个矩形的思路我们这里绘制矩形\n会使用到canvas.strokeRect(x,y, w, h)方法绘制一个描边矩形![](https://p0-xtjj-private.juejin.cn/tos-cn-i-73owjymdk6/91e6190a5cdf4b548cbb7db766acb01c~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5oiR55qEZGl25Lii5LqG6IK_5LmI5Yqe:q75.awebp?policy=eyJ2bSI6MywidWlkIjoiMTMxMDI3MzU5MzQ0MDM5OCJ9&rk3s=f64ab15b&x-orig-authkey=f32326d3454f2ac7e96d3d06cdbb035152127018&x-orig-expires=1733142556&x-orig-sign=Zghvt5lD2jYz6D0D0SaZye5cgos%3D)'}}
}
</script>

远端请求的内容为啥渲染失败

<template><div><VueMarkdown>{{ mdCont }}</VueMarkdown></div>
</template><script>
import VueMarkdown from 'vue-markdown';
export default {components:{VueMarkdown},data() {return{mdCont:'', //返回来的内容showKey: '0',}},created(){this.serveAPi()},methods:{serveAPi(){setTimeout(() => {this.mdCont = '#### 绘制一个矩形的思路我们这里绘制矩形\n会使用到canvas.strokeRect(x,y, w, h)方法绘制一个描边矩形![](https://p0-xtjj-private.juejin.cn/tos-cn-i-73owjymdk6/91e6190a5cdf4b548cbb7db766acb01c~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5oiR55qEZGl25Lii5LqG6IK_5LmI5Yqe:q75.awebp?policy=eyJ2bSI6MywidWlkIjoiMTMxMDI3MzU5MzQ0MDM5OCJ9&rk3s=f64ab15b&x-orig-authkey=f32326d3454f2ac7e96d3d06cdbb035152127018&x-orig-expires=1733142556&x-orig-sign=Zghvt5lD2jYz6D0D0SaZye5cgos%3D)'//更新设置这个key值this.showKey = new Date().getTime()+ ''},400)}},
}
</script>

我们发现md无法正常渲染,但是直接写在data中的是可以渲染的。
说明返回来的数据,在渲染的时候组件没有重新更新。
我们只需要使用key更新更新一下就行了。

远端请求内容渲染markdown,key更新组件

<template><div><!-- 更新渲染这个组件,要不然返回来的数据无法正常渲染 --><VueMarkdown :key="showKey">{{ mdCont }}</VueMarkdown></div>
</template><script>
import VueMarkdown from 'vue-markdown';
export default {components:{VueMarkdown},data() {return{mdCont:'', //返回来的内容showKey: '0',}},created(){this.serveAPi()},methods:{serveAPi(){setTimeout(() => {this.mdCont = '#### 绘制一个矩形的思路我们这里绘制矩形\n会使用到canvas.strokeRect(x,y, w, h)方法绘制一个描边矩形![](https://p0-xtjj-private.juejin.cn/tos-cn-i-73owjymdk6/91e6190a5cdf4b548cbb7db766acb01c~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5oiR55qEZGl25Lii5LqG6IK_5LmI5Yqe:q75.awebp?policy=eyJ2bSI6MywidWlkIjoiMTMxMDI3MzU5MzQ0MDM5OCJ9&rk3s=f64ab15b&x-orig-authkey=f32326d3454f2ac7e96d3d06cdbb035152127018&x-orig-expires=1733142556&x-orig-sign=Zghvt5lD2jYz6D0D0SaZye5cgos%3D)'//更新设置这个key值this.showKey = new Date().getTime()+ ''},400)}},
}
</script>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/843387.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【web安全】waf部署模式

一、dns解析模式 图中意思就说,咱给要防护的网站设置一个cname记录,比如www指向我们的WAF ip 1.1.1.1,这样www网站的流量会解析到WAF那里。 这种模式下,找到真实ip可能直接绕过检测。二、串联模式 像串葫芦一样串起来 这种模式当数据溢出WAF临界值,WAF可能就无法检测了。 …

【日记】自己内心戏好多(笑(968 字)

正文本来想手写来着,结果找了快一个小时的图。没找到。放弃了。时间也不大够用了,就不手写了。找图主要是因为一件事——今天忽然通知要拍证件照。我特别纳闷,之前不是拍过了吗,而且也没怎么用到,这东西。好像必须要重新拍,不知道为什么。而且中午才通知。还必须要打领带…

【wab安全】waf部署模式

一、dns解析模式 图中意思就说,咱给要防护的网站设置一个cname记录,比如www指向我们的WAF ip 1.1.1.1,这样www网站的流量会解析到WAF那里。 这种模式下,找到真实ip可能直接绕过检测。二、串联模式 像串葫芦一样串起来 这种模式当数据溢出WAF临界值,WAF可能就无法检测了。 …

【应急响应】Linux 计划任务与 DFIR 排查实践(三)

原创 Y1x1n Y1X1n安全 2024年11月29日 07:04免责声明 本公众号文章中的程序、方法、信息和工具仅用于安全研究、教学、网络安全人员对网站及服务器的检测维护,禁止用于其他非法用途。使用者对不当使用造成的后果承担全部法律及连带责任,作者和公众号不担责。文中安全漏洞情报…

20222416 2024-2025-1 《网络与系统攻防技术》实验五实验报告

1.实验内容 1.1 本周学习内容 Nessus是一款广泛使用的网络漏洞扫描工具。Nessus 可以执行自动化的漏洞扫描,通过扫描目标系统、识别和评估可能存在的安全漏洞和弱点。它可以检测操作系统、应用程序、服务和网络设备中的各种安全问题,如已知的漏洞、配置错误、弱密码、未经授权…

20222315 2024-2025 《网络与系统攻防技术》实验七实验报告

1、实验内容 本实践的目标理解常用网络欺诈背后的原理,以提高防范意识,并提出具体防范方法。具体实践有 (1)简单应用SET工具建立冒名网站 (2)ettercap DNS spoof (3)结合应用两种技术,用DNS spoof引导特定访问到冒名网站。 2、实验过程 2.1简单应用SET工具建立冒名网站…

20222417 2021-2022-2 《网络与系统攻防技术》实验七实验报告

1.实验内容 1.1本周学习内容 本周学习了网络欺诈背后的原理,让我深刻认识到网络欺骗的危害。同时,学习了中间人攻击以及arp欺骗与回话挟持等攻击原理中间人攻击就是通过欺骗目标主机和路由器之间的通信,使其流量经过攻击者控制的中继节点,从而窃取或篡改通信内容。ARP欺骗则…

UE5模拟交互篇|可交互流体风场实现

【USparkle专栏】如果你深怀绝技,爱“搞点研究”,乐于分享也博采众长,我们期待你的加入,让智慧的火花碰撞交织,让知识的传递生生不息!一、原理介绍1. 思路分析先来说观察介质模拟的两种视角:拉格朗日视角和欧拉视角。 拉格朗日视角一般将介质视为粒子(或微小网格)的集…

层板孔位自动镜像

横板垂直孔正反面设置(在设计中需要去开启功能)

hhdb数据库介绍(10-6)

升级中心 功能入口: 登录管理用户界面->页面右上角升级中心点击【添加升级任务】按钮可进入升级中心发起一次升级任务,具体如下:计算节点升级 计算节点升级为管理平台对计算节点版本提供在线升级的功能。满足对单节点、主备节点、多节点和容灾模式集群的跨版本或小版本升…

hhdb数据库介绍(10-5)

审计日志 管理用户界面的审计日志主要用来查看管理用户对管理平台的操作记录,同时可查看所有纳管的计算节点集群内普通用户的基本操作。 管理员操作 可以查看所有管理用户在管理平台的操作。可以在页面的操作类型下拉框中按操作类型过滤查看。访问IP和操作内容支持模糊查找。 …

SpringBoot集成MyBatis-Plus实现多数据源操作

添加依赖<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.18</version></parent><dependencies><dependency><groupId>org.springf…