当前位置: 首页 > news >正文

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 组件中使用


<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.mdthis.markdownContent = await response.text();} catch (error) {console.error('Failed to load Markdown file:', error);}}
};
</script>

其他常见场景

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

场景 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 是最灵活安全的选择

http://www.jsqmd.com/news/200885/

相关文章:

  • 鸿蒙生态新篇章:从手机到电脑的全景升级
  • uniapp定义一个简单的全局弹窗组件
  • 重组蛋白AVI标签技术详解:生物素化策略与亲和纯化应用
  • CPU三大核心部件功能详解
  • 鸿蒙电脑亮相 中国国产操作系统再次突破
  • 百度免费大模型API深度解析 大厂llm大模型市场国产大模型API免费全平台对比指南,薅羊毛指南与实战建议 政策深度解析与 - 教程
  • 【图像加密】Lorenz超混沌系统和Rivest-Shamir-Adleman(RSA)算法的新图像加密方案附matlab代码
  • 关于dify 工作流的LLM并发顺序执行问题的复盘
  • 【转载】权限控制模型
  • 专业音乐喷泉厂家怎么选?这3家别错过!
  • Docker + containerd 存储和启动完整原理
  • 导师推荐!自考必备AI论文软件TOP8:8款深度测评与推荐
  • 行业观察:2026生成式引擎优化(GEO)的范式转移与服务商能力重构 摘要 - 速递信息
  • 联机分析处理(OLAP)通过数据立方体模型支持多维数据分析
  • 【图像加密】基于超混沌系统和斐波那契 Q 矩阵的新图像加密算法研究附matlab代码
  • Modbus TCP Java入门 - 指南
  • JavaScript DOM 核心操作:从内容到节点的实战指南
  • TF卡系列、SD卡系列、CF卡系列有什么区别呢?我本来应该买TF卡系列,用在树莓派上面的。
  • Oracle RAS:AI时代企业数据安全核心
  • 【拯救HMI】工业HMI常见故障及排查方法:黑屏、通信中断、操作无响应,新手别慌
  • 安全体验馆!优质供应商榜单:口碑评估维度与采购参考指南
  • 快快网络入选福州市网络与信息安全信息通报中心2026年度网络安全技术支撑单位
  • 2026必备!10个AI论文工具,继续教育学生轻松搞定毕业论文!
  • 揭秘GEO:AI时代,如何让你的品牌被ChatGPT“点名”推荐?
  • 杰和IM1-210核心板用模块化设计重新定义工业主板开发
  • 数眼智能搜索API VS 腾讯(搜狗)搜索API:技术赋能下的差异化价值绽放
  • 彼得林奇的“买入并持有“策略
  • 享元模式
  • 如何保证rabbitmq或kafka 消息不丢失,从生产到消费端全过程
  • 数眼智能搜索 API VS 安思派搜索 API,谁是 AI 应用的最佳信息搭档?