vue實(shí)現(xiàn).md文件預(yù)覽功能的兩種方法詳解
vue3 + vite 實(shí)現(xiàn)方案 (vite-plugin-md + github-markdown-css)
配置vite-plugin-md插件:插件詳情請參考插件文檔
步驟一:安裝依賴
npm i vite-plugin-md -D npm i github-markdown-css
步驟二: vite-plugin-md 插件配置
// vite.config.ts
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import WindiCSS from 'vite-plugin-windicss'
import Markdown from 'vite-plugin-md'
// https://vitejs.dev/config/
export default defineConfig({
plugins: [
vue({
include: [/\.vue$/, /\.md$/]
}),
WindiCSS(),
Markdown({
builders: []
})
],
resolve: {
alias: {
'@': '/src/',
'vue': 'vue/dist/vue.esm-bundler.js'
}
},
})步驟三: 配置 tsconfig.json, 將md文件加入編譯需要處理的文件列表中。
"include": [
"vite.config.ts",
"src/**/*.ts",
"src/**/*.d.ts",
"src/**/*.tsx",
"src/**/*.vue",
"src/**/*.css",
"src/**/*.md" // md文件
],步驟四: 樣式引入與使用
<template>
<article class="markdown-body"> // 使用article 標(biāo)簽并且設(shè)置class
<FileComMd />
</article>
</template>
<script>
import 'github-markdown-css'
</script>步驟五:組件中使用
使用vue組件一樣的引入方式,
<template>
<FileReadMd></FileReadMd>
</template>
<script lang="ts" setup>
import FileReadMd from './FileReadMd.vue'
</script>對于文檔的說明文件,通常需求引入多個(gè)md文件,這里提供批量引入方式。
<!--
* @Description: 說明文檔
* @Author: ym
* @Date: 2022-11-25 17:12:54
* @LastEditTime: 2022-11-29 14:20:39
-->
<template>
<div class="h-full flex flex-col">
<div class="flex p-2 items-center bg-primary text-white">
<img src="@/assets/img/logo.png" alt="" />
<div class="flex-1 px-1 text-[16px]">說明文檔</div>
</div>
<div class="flex-1 flex overflow-hidden">
<div class="w-[200px] overflow-y-auto bg-bg">
<el-menu active-text-color="#464bff" background-color="#f3f6fa" class="bg-bg" :default-active="defaultActive" text-color="#333">
<template v-for="menu in menuList">
<el-sub-menu v-if="menu.childrenList && menu.childrenList.length > 0" :index="menu.elementType">
<template #title>
<i :class="`${menu.icon} iconfont`"></i>
<span>{{ menu.name }}</span>
</template>
<template v-for="menuItem in menu.childrenList">
<el-sub-menu v-if="menuItem.childrenList && menuItem.childrenList.length > 0" :index="(menu.elementType || '') + menuItem.type">
<template #title>{{ menuItem.name }}</template>
<el-menu-item v-for="item in menuItem.childrenList" :index="item.type" @click="getMdFileData(item.type)">{{ item.name }}</el-menu-item>
</el-sub-menu>
<el-menu-item v-else :index="menuItem.type" @click="getMdFileData(menuItem.type)">{{ menuItem.name }}</el-menu-item>
</template>
</el-sub-menu>
<el-menu-item v-else :index="menu.elementType" @click="getMdFileData(menu.type)">
<i :class="`${menu.icon} iconfont`"></i>
<span>{{ menu.name }}</span>
</el-menu-item>
</template>
</el-menu>
</div>
<div class="flex-1 bg-opacity-20 flex px-18 py-10 overflow-y-auto">
<article class="markdown-body">
<component v-if="fileName" :is="content" :key="fileName" />
<div v-else>{{ `${fileName}文檔正在維護(hù)中...` }}</div>
</article>
</div>
</div>
</div>
</template>
<script lang="ts" setup>
import { ref, shallowRef } from 'vue'
import { menuList } from './graphManage/components/node'
import { useRoute } from 'vue-router'
const route = useRoute()
const fileName = ref('')
const defaultActive = ref('FileReadNode')
route.query.type && (defaultActive.value = route.query.type as string)
const content = shallowRef('')
// 導(dǎo)入document下的所有.md文件
const res = import.meta.glob('../assets/document/*.md', { eager: true })
const getMdFileData = (name?: string) => {
if (name) {
// 切換左側(cè)菜單時(shí),右側(cè)動(dòng)態(tài)加載對應(yīng)組件
Object.entries(res).forEach(([path, definition]: any) => {
const componentName = path
.split('/')
.pop()
?.replace(/\.\w+$/, '')
if (componentName === name) {
fileName.value = name
content.value = definition.default
}
})
}
}
getMdFileData(defaultActive.value)
// 這種方式在本地生效, 測試環(huán)境組件加載報(bào)錯(cuò)
// const getMdFileData = (name?: string) => {
// name &&
// import(/* @vite-ignore */ '../assets/document/' + name + '.md')
// .then((res) => {
// content.value = res.default
// fileName.value = name
// })
// .catch((err) => {
// console.error(err)
// fileName.value = ''
// })
// }
</script>vue2實(shí)現(xiàn)方案(vue-markdown + vue-markdown-loader +github-markdown-css)
步驟一: 安裝依賴
npm i vue-markdown npm i vue-markdown-loader github-markdown-css -D
步驟二:vue.config.js 配置loader
module.exports = {
runtimeCompiler: true,
css: {
loaderOptions: {
scss: {
prependData: `@import "~@/assets/style/index.scss";`
}
}
},
chainWebpack: config => {
config.module
.rule("md")
.test(/\.md$/)
.use("vue-loader")
.loader("vue-loader")
.end()
.use("vue-markdown-loader")
.loader("vue-markdown-loader/lib/markdown-compiler")
.options({
raw: true
});
},
}步驟三: .vue組件中使用
<template>
<div class="documentView">
<div class="header">
<img src="@/assets/logo.png" alt="">
<img class="bardBg" src="@/assets/bar_bg.png" alt="">
<div class="title">數(shù)據(jù) - 說明文檔</div>
</div>
<div class="content">
<div class="left">
<el-menu class="menu">
<template v-for="type in menuList">
<el-submenu v-if="type.childrenList && type.childrenList.length > 0" :index="type.type" :key="type.key">
<template #title>
<i :class="type.icon + ' iconfont'"></i>
<span>{{ type.text }}</span>
</template>
<template v-for="menuItem in type.childrenList">
<el-submenu class="menuSub" v-if="menuItem.childrenList && menuItem.childrenList.length > 0" :key="menuItem.key" :index="menuItem.key">
<template #title>{{ menuItem.text }}</template>
<el-menu-item @click="getMdFileData(lastMenu.key)" :index="lastMenu.path" v-for="lastMenu in menuItem.childrenList" :key="lastMenu.key">{{
lastMenu.text
}}</el-menu-item>
</el-submenu>
<el-menu-item v-else :key="menuItem.key" :index="menuItem.path" @click="getMdFileData(menuItem.key)">{{ menuItem.text }}
</el-menu-item>
</template>
</el-submenu>
<el-menu-item v-else :index="type.type" :key="type.key" @click="getMdFileData(menuItem.key)">
<el-icon size="20" :class="type.icon + ' iconfont'"></el-icon>
<span>{{ type.text }}</span>
</el-menu-item>
</template>
</el-menu>
</div>
<div class="markdown-body right">
<vueMarkDown v-if="mdData" :source="mdData"></vueMarkDown>
<div v-else>{{`${type}算子文檔正在維護(hù)中...`}}</div>
</div>
</div>
</div>
</template>
<script>
import vueMarkDown from "vue-markdown"
import axios from 'axios'
import 'highlight.js/styles/github.css'
import 'github-markdown-css' // 使用github樣式
import { menuConfig } from '@/utils/menu.js'
export default {
name: 'DocumentView',
components: { vueMarkDown },
data () {
return {
mdData: '',
menuList: menuConfig,
type: ''
}
},
methods: {
async getMdFileData (key) {
this.type = key
const url_ = `document/${key}.md` // *文明位于項(xiàng)目的public下
try {
const res = await axios.get(url_)
this.mdData = res.data
} catch (error) {
this.$message(this.type + '文檔維護(hù)中...')
console.log('缺少文檔', this.type)
this.mdData = ''
}
}
},
mounted () {
this.getMdFileData(this.$route.query.type)
}
}
</script>到此這篇關(guān)于vue實(shí)現(xiàn).md文件預(yù)覽功能的兩種方法詳解的文章就介紹到這了,更多相關(guān)vue預(yù)覽.md文件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用vue.js2.0 + ElementUI開發(fā)后臺管理系統(tǒng)詳細(xì)教程(二)
這篇文章主要介紹了使用vue.js2.0 + ElementUI開發(fā)后臺管理系統(tǒng)詳細(xì)教程(二),非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧2017-01-01
Vue?通過this.$emit()方法子組件向父組件傳值(步驟分享)
這篇文章主要介紹了Vue?this.$emit()方法通過子組件向父組件傳值,第一步在父組件中引入子組件,第二步子組件向父組件傳值,本文通過需要的朋友可以參考下2022-11-11
vue使用動(dòng)態(tài)組件實(shí)現(xiàn)TAB切換效果
這篇文章主要介紹了vue使用動(dòng)態(tài)組件實(shí)現(xiàn)TAB切換效果的方法,幫助大家更好的理解和學(xué)習(xí)使用vue框架,感興趣的朋友可以了解下2021-05-05
Vue項(xiàng)目中禁用ESLint的幾種常見方法小結(jié)
Vue ESLint是一個(gè)基于ESLint的插件,它專門為Vue.js應(yīng)用設(shè)計(jì),用于提供JavaScript代碼風(fēng)格檢查和最佳實(shí)踐規(guī)則,Vue項(xiàng)目通常會集成ESLint,目的是為了提升代碼質(zhì)量、保持一致性和可維護(hù)性,本文介紹了Vue項(xiàng)目中禁用ESLint的幾種常見方法,需要的朋友可以參考下2024-07-07
Vue2使用TailwindCSS方法及遇到問題小結(jié)
Tailwind CSS是一個(gè)全新的、可定制的CSS框架,它提供了一系列的CSS類,用于構(gòu)建現(xiàn)代化的Web界面,這篇文章主要介紹了Vue2使用TailwindCSS方法及遇到問題小結(jié),需要的朋友可以參考下2024-03-03
前端VUE雙語實(shí)現(xiàn)方案詳細(xì)教程
在項(xiàng)目需求中我們會遇到國際化的中英文切換,這篇文章主要給大家介紹了關(guān)于前端VUE雙語實(shí)現(xiàn)方案的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-08-08

