marked.parse()是v4.3+唯一推荐解析入口,需先setOptions全局配置、禁用sanitize改用DOMPurify净化,动态加载须fetch+.text()配合本地服务,Prism高亮须在innerHTML设置后调用。

marked.parse() 是唯一推荐的解析入口,别再用 marked() 调用
新版 marked(v4.3+)已彻底移除函数式调用 marked(text, options),直接写会报 TypeError: marked is not a function。必须显式使用 marked.parse(),且所有配置需提前通过 marked.setOptions() 设置。
- 初始化必须放在
<script></script>加载后、解析前:先marked.setOptions({ gfm: true, breaks: true }),再marked.parse(mdText) - 不要在每次解析时传 options ——
marked.parse(text, { breaks: true })在 v4.3+ 中已被废弃,仅支持全局配置 - 若混用旧版代码片段(比如从 Stack Overflow 复制的),务必检查是否含
marked(...)形式,替换成marked.parse(...)
sanitize: false 不等于放行 XSS,必须配合 dompurify
marked 内置的 sanitize: true 早在 v4.0 就被标记为 deprecated,且实际过滤能力极弱,无法防绕过 payload。官方明确建议:禁用它,改用 dompurify 做后处理。
- 正确流程是:
marked.parse(mdText)→ 得到原始 HTML 字符串 → 用DOMPurify.sanitize(htmlString)净化 → 再赋值给innerHTML - 千万别设
allowDangerousHtml: true还不净化——这等于主动打开 XSS 入口 - 若内容完全可控(如内部文档),可关闭
sanitize并跳过dompurify,但需在项目文档中明确标注“仅限可信源”
动态加载 .md 文件时,fetch + .text() 是唯一可靠路径
直接 fetch('./doc.md') 在双击打开 index.html 时必然失败(net::ERR_FILE_NOT_FOUND 或 CORS),因为浏览器禁止 file:// 协议下跨文件读取。开发阶段必须走本地服务。
- 启动命令选一个就行:
npx serve、python3 -m http.server 8000、或 Vite 的npm run dev -
fetch后必须链式调用.text(),不能漏掉;.json()或未处理response.ok会导致静默失败 - 错误写法示例:
fetch('a.md').then(r => r.json())——.md不是 JSON,Chrome 会直接 reject Promise
代码块高亮失效?Prism.highlightAll() 必须在 innerHTML 设置之后
marked 只生成带 <pre class='brush:js;toolbar:false;'></pre> 结构的 HTML,不触发任何高亮逻辑。如果你看到的是纯灰底黑字,问题一定出在 Prism 执行时机或 class 匹配上。
立即学习“前端免费学习笔记(深入)”;
- 必须严格按顺序:先
element.innerHTML = marked.parse(mdText),再Prism.highlightAll() - 确保引入了对应语言包,例如 JS 高亮要加
prismjs/components/prism-javascript.min.js - 检查生成的
<code>标签是否有class="js"(不是class="js")——Prism 默认只认language-xxx前缀
最易被忽略的一点:渲染后 DOM 更新和第三方库(如 Prism、dompurify)的执行顺序,不是“写了就生效”,而是依赖严格的时序控制。任何一步异步脱钩,都会导致内容空白、样式丢失或安全漏洞暴露。



















