直接用marked+fetch可运行,但必须配置服务器mime类型为text/plain、调用.text()读取响应,并用dompurify等库sanitize以防xss;否则易白屏或遭注入。

直接用 marked + fetch 就能跑通,但不配好 MIME 和 sanitize 会白屏或被 XSS 注入。
加载外部 .md 文件时 fetch 报 Failed to fetch 或返回空字符串
这是开发服务器没把 .md 当文本返回导致的。Chrome 会直接拒绝解析,不是代码写错了。
- Vite 用户必须在
vite.config.js中加:server.headers = { 'Content-Type': 'text/plain' }(注意不是text/markdown,浏览器不认) - Webpack Dev Server 要配
contentBasePublicPath并启用mimeTypes映射.md → text/plain -
fetch('doc.md')后必须链式调用.text(),不能漏;.json()或没处理 reject 会导致静默失败 - 本地双击 HTML 打开时,
fetch因跨域被拦——必须起一个本地服务(如npx serve)
渲染后代码块没颜色、表格不显示、任务列表变普通列表
marked 默认只转结构,不激活扩展语法,也不做高亮。
- GFM 表格、任务列表(
- [x])、脚注等需显式开启:marked.use({ gfm: true, breaks: true }) - 代码块高亮必须额外引入
highlight.js,且要在innerHTML设置完后再调hljs.highlightAll() - 别依赖
marked自带的renderer做样式定制——它只生成<pre class="brush:php;toolbar:false;"><code class="js"></code>,CSS 和 JS 高亮要自己配</pre> - 若用
marked.setOptions({ sanitize: true }),<img>标签会被删掉,需加白名单:allowedTags: ['img'], allowedAttributes: { img: ['src', 'alt'] }
长文档渲染卡顿、输入预览延迟明显
主线程同步解析万字 Markdown 会阻塞 UI,尤其在低端设备上。
- 必须用 Web Worker 搬到后台线程:新建
markdown.worker.js,用importScripts('marked.min.js')或 ESMimport加载 - Worker 内禁用 DOM 操作,所以不能调
hljs——高亮得留到主线程做,Worker 只负责marked.parse() - 避免每次输入都重发整个文档:对输入做节流(如
setTimeout+clearTimeout),只传变更部分或最后 2000 字符 - 别在 Worker 里用
marked.use({ async: true })——它依赖 Promise,而 Worker 环境中无事件循环保障,易出错
真正麻烦的不是怎么转,而是转完的 HTML 怎么安全地塞进 innerHTML:sanitize 开太严丢功能,关太松埋 XSS,图片路径相对/绝对混用又导致裂图——这些细节不手动测几遍根本发现不了。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











