Mermaid Preview与PlantUML插件共存时卡顿,主因是二者监听同类文件变更、重复初始化服务并争抢webview资源,导致保存Markdown文件触发两次重绘、主线程锁死;需禁用自动预览、排除文件监视干扰并用Extension Bisect精准定位冲突插件。

为什么Mermaid Preview和PlantUML插件一起开就卡
不是渲染引擎本身慢,而是两个插件都在监听同一类文件变更、重复初始化预览服务、争抢webview资源。Mermaid Preview默认对.md里所有```mermaid块实时扫描,PlantUML则对.puml和.plantuml文件启动独立语言服务器+本地Java进程——两者共存时,保存一个Markdown文件可能触发两次完整重绘,主线程直接被锁死。
典型表现:Ctrl+K V打开预览后滚动卡顿、输入公式延迟、甚至Extension host terminated unexpectedly报错反复弹出。
- 检查方法:按
Ctrl+Shift+I打开开发者工具 → Console标签页,搜mermaid或plantuml,看是否有TypeError: Cannot read property 'render' of null类错误 - 确认冲突:运行
Developer: Show Running Extensions,观察Activation Time是否双双超过800ms,且Status列有Activated但无响应 - 根本原因:Mermaid Preview的
mermaid.initialize()和PlantUML的plantuml-server进程都试图独占localhost:8080或8081端口,导致其中一个静默失败却不报错
禁用自动预览,改用手动触发渲染
Mermaid Preview和PlantUML都默认开启“保存即渲染”,这是卡顿主因。必须关掉这个行为,让渲染变成显式、按需、节流的操作。
在用户settings.json中添加以下配置:
"markdown-preview-enhanced.mermaidEnabled": false, "markdown-preview-enhanced.enableScriptExecution": false, "plantuml.render": "server", "plantuml.server": "http://localhost:8080", "plantuml.previewAutoUpdate": false
关键点:
-
"markdown-preview-enhanced.mermaidEnabled": false不是卸载插件,而是停用它对Markdown的自动接管,避免和PlantUML抢webview -
"plantuml.previewAutoUpdate": false强制关闭自动刷新,改为右键菜单选PlantUML: Preview Diagram手动触发 - 如果没起PlantUML Server,别用
local模式——它每次调用都fork新Java进程,CPU飙升;改用Docker起一个长期存活的服务:docker run -d -p 8080:8080 --name plantuml jgraph/drawio:plantuml
排除文件监视干扰,防止后台持续扫描
两个插件都会监听.md、.puml等后缀文件变化,一旦项目含大量文档或嵌套子目录,files.watcherExclude没配好,它们就在后台疯狂轮询。
在项目根目录的.vscode/settings.json中必须加:
"files.watcherExclude": {
"**/docs/**": true,
"**/notes/**": true,
"**/*.md": true,
"**/*.puml": true,
"**/*.plantuml": true
}
注意:
- 不能只写
"*.md"——必须用"**/*.md",否则子目录里的文件照样被扫 - 如果项目里真有用到
.md里的流程图,把"**/*.md": true删掉,换成更细粒度路径,比如"**/design/*.md" - 改完后必须关闭并重新打开该工作区,设置才生效;只刷新窗口无效
用Developer: Start Extension Bisect快速锁定问题插件
当不确定是Mermaid Preview、PlantUML还是其他插件(比如Markdown All in One)在捣鬼时,别手动一个个禁用——69个插件点到手软。
正确做法:
- 按
Ctrl+Shift+P(Win/Linux)或Cmd+Shift+P(macOS) - 输入并运行
Developer: Start Extension Bisect - 它会自动分组禁用一半插件 → 你测试预览是否还卡 → 回答“是”或“否” → 它继续缩圈
- 通常3轮内就能定位到具体插件,比如发现禁用
Markdown All in One后卡顿消失,那就说明它的autoPreview功能和Mermaid Preview存在底层事件监听冲突
真正难搞的是那种不报错、不崩溃、但让Activation Time稳定卡在1200ms上下的插件——它既不失败也不退出,就卡在激活中间态,把后续所有插件堵在队列里。这种必须靠Developer: Show Running Extensions和Developer: Start Extension Bisect双验证,单看控制台日志基本看不到痕迹。


















