
小技术
在 Hexo 博客中优雅地集成 Markmap 思维导图
本文详细介绍了如何在 Hexo 博客中优雅地集成 Markmap 思维导图,让你能够直接在 Markdown 文件中创建交互式思维导图。同时这也是一个 Hexo 插件的标准实现案例。
在技术博客写作中,思维导图是一个非常有用的工具,它可以帮助我们更清晰地展示知识结构和概念关系。本文将介绍如何在 Hexo 博客中集成 Markmap,让你能够直接在 Markdown 文件中创建交互式思维导图。
什么是 Markmap?
Markmap 是一个将 Markdown 格式的文本转换为思维导图的开源工具。它允许我们使用熟悉的 Markdown 语法来创建漂亮的、交互式的思维导图。
实现方案
1. 安装必要依赖
首先,我们需要安装 uuid 包,这是用来给我们每一个思维导图生成一个唯一的 ID:
npm install uuid --save
2. 创建自定义标签插件
在 scripts/markmap_tag.js 中创建自定义标签:
/**
* Markmap Tag Plugin for Hexo
*/
"use strict";
const { v4: uuidv4 } = require("uuid");
hexo.extend.tag.register(
"markmap",
function (args, content) {
const id = uuidv4();
return `
<div class="markmap" id="markmap-${id}">
<script type="text/template">
${content}
</script>
</div>
<script>
document.addEventListener('DOMContentLoaded', () => {
const template = document.querySelector('#markmap-${id} script[type="text/template"]');
if (template) {
const content = template.textContent;
window.markmap.autoLoader.renderString(content, null, document.querySelector('#markmap-${id}'));
}
});
</script>
`;
},
{ ends: true }
);
3. 添加样式
创建 source/css/markmap.css:
/* Markmap Styles */
.markmap {
width: 100%;
height: 500px;
margin: 20px 0;
border: 1px solid #eaeaea;
border-radius: 5px;
overflow: hidden;
}
.markmap svg {
width: 100%;
height: 100%;
}
/* 响应式设计 */
@media (max-width: 768px) {
.markmap {
height: 400px;
}
}
@media (max-width: 480px) {
.markmap {
height: 300px;
}
}
4. 更新主题配置
在主题配置文件中添加必要的资源引用:
inject:
head:
- <link rel="stylesheet" href="/css/markmap.css">
- <script src="https://cdn.jsdelivr.net/npm/markmap-autoloader@0.18"></script>
使用方法
```text
- 技术栈
- 前端
- Vue.js
- React
- Angular
- 后端
- Node.js
- Python
- Go
- 数据库
- MySQL
- MongoDB
- Redis
<!-- tab 效果 -->
```text
- 技术栈
- 前端
- Vue.js
- React
- Angular
- 后端
- Node.js
- Python
- Go
- 数据库
- MySQL
- MongoDB
- Redis
工作原理
1. Hexo 插件系统
- Hexo 提供了强大的插件系统,允许我们通过
hexo.extendAPI 来扩展功能 - 我们使用了
hexo.extend.tag来注册自定义标签,这是 Hexo 提供的标准扩展点之一
2. 标签插件的工作原理
hexo.extend.tag.register(
"markmap",
function (args, content) {
const id = uuidv4(); // 生成唯一ID
return `
<div class="markmap" id="markmap-${id}">
<script type="text/template">
${content}
</script>
</div>
...
`;
},
{ ends: true }
);
- 当 Hexo 解析到
markmap标签时,会调用这个注册的函数 content参数包含了标签之间的所有内容(你的 markdown 结构){ends: true}表示这是一个闭合标签(需要 endmarkmap 结束)
3. Markmap 库的渲染过程
- Markmap 库使用
markmap-autoloader自动处理 markdown 到思维导图的转换 - 转换过程:
- Markdown 文本被解析成层级结构
- 层级结构被转换为 SVG 路径
- SVG 被渲染到页面上,并添加交互功能
4. HTML 结构设计
<div class="markmap" id="markmap-${id}">
<script type="text/template">
${content}
</script>
</div>
- 使用
script type="text/template"来存储原始 markdown - 每个思维导图都有唯一 ID,避免页面上多个图表互相干扰
5. JavaScript 初始化
document.addEventListener("DOMContentLoaded", () => {
const template = document.querySelector(
'#markmap-${id} script[type="text/template"]'
);
if (template) {
const content = template.textContent;
window.markmap.autoLoader.renderString(
content,
null,
document.querySelector("#markmap-${id}")
);
}
});
- 等待页面加载完成
- 获取模板中的 markdown 内容
- 使用 markmap 库渲染思维导图
6. 样式控制
.markmap {
width: 100%;
height: 500px;
margin: 20px 0;
border: 1px solid #eaeaea;
border-radius: 5px;
overflow: hidden;
}
- 提供响应式布局
- 确保思维导图在各种屏幕尺寸下都能正常显示
7. 主题集成
- 在主题配置中注入必要的 CSS 和 JavaScript
- 确保资源在正确的时机加载
来自开放网络的回应
引用、喜欢、转发和站外回复会通过 Webmention 回到这里。
接收与展示代码已经就绪,注册正式域名后即可开始收集回应。
评论
评论由 GitHub Discussions 保存和管理。