markdown文件在vue网页上正确显示的方法(marked + DOMPurify)

热门推荐内容链接
1openlayers 从基础到精通,300+代码示例
2leaflet 热门分解学习教程,150+图文示例
3cesium 从0到1学习指南,200+代码示例
4 mapboxGL 从入门到实战,150+图文示例
5canvas 示例应用100+,揭密底层细节
6javascript从基础到高级,示例展示200+
7vue2 实战指南,100+个细节深度剖析

要在网页上正确显示 Markdown 文件的内容(即把 .md 文件渲染成格式化的 HTML),你需要完成两个主要步骤:

  1. 读取 Markdown 文件内容(通常是字符串)
  2. 将 Markdown 字符串转换为 HTML 并安全地插入页面

下面以 Vue 2 项目为例,说明如何实现这一功能。


推荐方案:使用 marked + DOMPurify(安全高效)

第一步:安装依赖

npm install marked dompurify
  • marked:将 Markdown 转为 HTML
  • DOMPurify:防止 XSS 攻击(非常重要!因为直接插入 HTML 可能有安全风险)

如果你不需要处理用户上传的 Markdown(比如只显示自己写的静态文档),可酌情省略 DOMPurify,但强烈建议保留


第二步:在 Vue 组件中使用

<template>
  <div class="markdown-content" v-html="compiledMarkdown"></div>
</template>

<script>
import marked from 'marked';
import DOMPurify from 'dompurify';

export default {
  data() {
    return {
      markdownContent: '' // 存放原始 Markdown 字符串
    };
  },
  computed: {
    compiledMarkdown() {
      const rawHtml = marked(this.markdownContent);
      return DOMPurify.sanitize(rawHtml); // 清洗 HTML 防止 XSS
    }
  },
  async mounted() {
    // 示例:从本地 public 目录加载 .md 文件
    try {
      const response = await fetch('/docs/example.md'); // 假设文件放在 public/docs/example.md
      this.markdownContent = await response.text();
    } catch (error) {
      console.error('Failed to load Markdown file:', error);
    }
  }
};
</script>

<style scoped>
/* 可选:添加基本的 Markdown 样式 */
.markdown-content {
  line-height: 1.6;
  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif;
}
.markdown-content h1 { font-size: 2em; margin: 0.67em 0; }
.markdown-content p { margin: 1em 0; }
.markdown-content code {
  background-color: #f5f5f5;
  padding: 2px 4px;
  border-radius: 3px;
}
.markdown-content pre {
  background-color: #f5f5f5;
  padding: 1em;
  overflow-x: auto;
}
/* 更多样式可参考 GitHub Markdown CSS */
</style>

🔧 其他常见场景

场景 1:Markdown 文件放在 public/ 目录下

  • 在 Vue CLI 或 Vite 项目中,public/ 下的文件会被直接复制到构建输出目录。
  • 你可以通过 fetch('/your-file.md') 直接请求(注意路径)。

场景 2:Markdown 内容来自 API

只需把 fetch 替换为你的 API 请求即可:

const res = await axios.get('/api/article/123');
this.markdownContent = res.data.content;

场景 3:使用高亮代码(如 Prism.js 或 highlight.js)

marked 支持自定义代码渲染。例如配合 highlight.js

import hljs from 'highlight.js';
import 'highlight.js/styles/github.css'; // 引入样式

marked.setOptions({
  highlight: function(code, lang) {
    const language = hljs.getLanguage(lang) ? lang : 'plaintext';
    return hljs.highlight(code, { language }).value;
  },
  langPrefix: 'hljs language-' // 确保 class 名匹配
});

安全警告

永远不要直接用 v-html 显示未经清洗的用户输入!
即使是你自己的 Markdown,如果包含 <script>onerror 等恶意内容,也会被浏览器执行。

所以务必使用 DOMPurify.sanitize()


总结

步骤操作
1fetch 或 API 获取 .md 文件内容(字符串)
2marked 转成 HTML
3DOMPurify 清洗 HTML
4v-html 渲染到页面
5添加 CSS 样式让 Markdown 看起来美观

如果你希望开箱即用的组件,也可以考虑:

但在大多数动态加载场景下,marked + DOMPurify 是最灵活安全的选择

### 实现 Vue 代码高亮 为了在 Markdown 文件中实现 Vue 代码高亮,可以采用多种方法来确保代码片段不仅被正确解析为 HTML 还能获得语法着色效果。 一种方式是在项目中集成 `highlight.js` 或者其他类似的库。通过这些工具可以在渲染阶段自动识别并美化不同编程语言的源码列表。对于特定于 Vue 的情况,则需进一步配置以适应框架特性[^1]。 另一种更为简洁的方法涉及到利用专门针对 Vue 设计的组件或插件来进行处理。例如,在 vue3 中可以通过自定义组件加载 Markdown 并完成必要的转换工作,期间也包含了对 `<code>` 块内文本实施高亮操作的过程[^2]。 下面是一个简单的例子说明如何设置: ```javascript // main.js 配置 highlight.js 和样式表 import 'highlight.js/styles/github.css'; import hljs from 'highlight.js/lib/core'; import xml from 'highlight.js/lib/languages/xml'; // 支持 html/vue template hljs.registerLanguage('xml', xml); app.use(/* ... */).mount('#app'); ``` 接着修改用于呈现 Markdown 内容的部分如下所示: ```html <template> <article class="markdown-body" v-html="highlightedContent"></article> </template> <script> export default { data() { return { rawMarkdown: '' }; }, computed: { highlightedContent() { const result = marked(this.rawMarkdown, { sanitize: true }); return this.$nextTick(() => { document.querySelectorAll('pre code').forEach((block) => { hljs.highlightBlock(block); // 对每个 <code> 应用高亮逻辑 }); }), result; } } }; </script> ``` 上述代码展示了怎样结合使用第三方库与 Vue 组件属性来达成目标。值得注意的是这里假设已经安装了 `marked` 来负责初步转化 Markdown 至 HTML 字符串;而最终的效果取决于所选主题以及是否正确指定了待突出显示的语言种类。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

还是大剑师兰特

打赏一杯可口可乐

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值