缺点: 前台展示的内容不仅居中,而且代码块也没有高亮,可读性不强,不够美观;
...
// 插件版本:"marked": "^11.1.1", "highlight.js": "^11.9.0",
import { marked } from 'marked';
import hljs from 'highlight.js';
// 设置 highlight.js 的语言
hljs.configure({ languages: ['javascript', 'css', 'html'] });
/**
* @description: 将md文档转为html字符串
* @param: value-md格式的文档内容
* @returns: 返回html格式的内容
*/
function mdToHtml(value) {
if (!value) {
return '暂无文档'
}
// 自定义 renderer
const renderer = new marked.Renderer();
renderer.code = function (code, language) {
const validLanguage = hljs.getLanguage(language) ? language : 'plaintext';
const highlightedCode = hljs.highlight(validLanguage, code).value;
return `<pre><code class="hljs ${validLanguage}">${highlightedCode}</code></pre>`;
}
return marked(value, {
renderer: renderer
})
}
// 保存
async function handelSave(formEl) {
if (!formEl) return
await formEl.validate(async (valid, fields) => {
if (valid) {
const params = {
...formData.value
}
// 增加html格式的内容
params.htmlContent = mdToHtml(params.content)
...
}
})
}
...
// main.js入口文件
...
import { createApp } from 'vue'
// 导入配套的自定义样式
import '@/assets/style/myMavonEditor.css'
// 引入mavon-editor样式文件
import 'mavon-editor/dist/css/index.css'
// 引入markdown组件
import mavonEditor from 'mavon-editor'
const app = createApp(App)
// 注册mavon-editor组件
app.use(mavonEditor)
...
// blogDetail文件内容
<template>
...
<ClientOnly>
<div class="blog-rich-text" v-html="decodeHtml(blogInfo.htmlContent || '加载中...')" ></div>
</ClientOnly>
</template>
<script lang='ts' setup>
...
// 将html中的><实体编码还原成原始字符,从而使其在页面上显示正确
function decodeHtml(html) {
const txt = document.createElement('textarea');
txt.innerHTML = html;
return txt.value;
}
</script>
// nuxt.config.js配置文件
export default defineNuxtConfig({
css: [
{ src: '~/assets/css/myMavonEditor.css', lang: 'css' }
]
})
1)后台在使用md富文本进行博客内容编辑保存时,将其格式转为html格式,并使用highlight.js插件将代码块高亮添加对应的class类名,然后再入库;
2)在前台读取到库里的内容后,将html直接渲染出来,并将配套的样式文件导入进来显示即可;
1)后台在保存入库时,使用两个字段记录博客内容;一个字段content用于存放md格式的;一个字段htmlContent用于存放html格式的;
2)后台操作使用content字段,前台渲染使用htmlContent字段;
3)导入配套的样式文件;
1)后台入库时存放md格式的内容,在前台再使用相关插件marked+highlight将md内容转为html并添加对应的class样式类
2)在前台导入配套的样式类即可;