reveal-md能一键启动带热更新的幻灯片服务,因其封装了reveal.js运行时与marked解析器,自动处理---分页、事件绑定及浏览器交互,无需手写HTML模板或配置webpack。

为什么直接用 markdown-it 渲染幻灯片会卡住交互?
因为标准的 markdown-it 只做静态解析,不处理 --- 分页、??? 暂停、鼠标点击翻页这些行为。你写完 Markdown,它只会吐出一整块 HTML,没有事件绑定,也没有分页状态管理。
真正能跑起来的方案必须带运行时环境:要么用现成的幻灯片框架(如 reveal.js)加载渲染后的 HTML,要么用支持服务端动态注入逻辑的工具(比如 mdx-js + Next.js)。VSCode 本身不提供浏览器运行时,所以“动态转换”实际指:在本地启动一个轻量服务,把 Markdown 实时编译并挂载交互逻辑。
- 别试图用 VSCode 内置预览插件(如
Markdown Preview Enhanced)直接开幻灯片——它默认只支持基础分页,不支持键盘导航、演讲者视图或自定义 transition -
reveal.js是最稳妥的选择:它把每段---当作一页,用Reveal.initialize()启动后,自动绑定←/→、空格、触摸滑动 - 关键路径是:
your-slide.md→marked或remark解析 → 注入reveal.js模板 → 启动本地 HTTP 服务
如何用 reveal-md 一行命令启动带热更新的幻灯片服务?
reveal-md 是专为这个场景设计的 CLI 工具,底层就是 reveal.js + marked,它省掉了手写 HTML 模板和配置 webpack 的步骤。
安装和运行只需要两步:
- 全局安装:
npm install -g reveal-md - 进入 Markdown 所在目录,执行:
reveal-md slides.md --watch --port 3000
它会自动:
- 监听
slides.md变更,保存即刷新浏览器 - 把
## 标题渲染为 slide 标题,---作为分页符 - 支持 YAML front matter 配置主题、过渡动画、控制条显示等,例如:
--- theme: black transition: zoom ---
- 注意:如果 Markdown 里用了
$$数学公式,需额外加--mathjax参数启用渲染
怎样让 Node 脚本接管转换流程,而非依赖全局 CLI?
当项目需要复用逻辑、集成构建流程,或者多人协作时,全局安装的 reveal-md 就不够灵活。这时候应该用 reveal.js 的 Node API 直接调用。
核心是三件事:读取 Markdown、用 marked 转 HTML、塞进 reveal.js 模板里返回完整页面。
- 安装依赖:
npm install reveal.js marked - 创建
slide-server.js,用http模块监听请求,每次读取slides.md并重新渲染(不要用fs.readFileSync缓存,否则热更新失效) - 模板中必须包含:
<div class="reveal"><div class="slides">${htmlContent}</div></div>,且末尾引入Reveal.initialize() - 常见坑:
marked默认不解析---为分页,得手动按/^---$/gm切割字符串,再对每段分别调用marked()
VSCode 里怎么一键运行、自动打开浏览器、还能调试?
靠 tasks.json + launch.json 组合,而不是点右键“在终端运行”。这样能确保服务启动后自动唤起浏览器,并支持断点调试 Node 脚本。
- 在
.vscode/tasks.json中定义 task:{ "label": "start slides", "type": "shell", "command": "npx reveal-md slides.md --watch --port 3000", "isBackground": true, "problemMatcher": [] } - 在
.vscode/launch.json中配 launch:{ "name": "Debug Slide Server", "type": "node", "request": "launch", "program": "${workspaceFolder}/slide-server.js", "console": "integratedTerminal", "autoAttachChildProcesses": true } - 务必关掉其他占 3000 端口的进程(比如另一个
create-react-app),否则reveal-md会静默失败,只显示白屏 - 如果用的是 WSL,浏览器可能打不开
localhost,改用127.0.0.1或在settings.json里加:"reveal-md.host": "127.0.0.1"
交互逻辑其实就藏在 Reveal 对象里,比如想加个按钮跳转到第 5 页,直接调 Reveal.slide(4) 就行——但前提是你的 HTML 已经加载了 reveal.js 且初始化完成。这点容易被忽略:脚本执行顺序错了,Reveal 还没定义就调用,控制台报 ReferenceError。


















