本文覆盖主题启用的全部 16 个 markdown-it 插件。每个插件都按同一条学习路径组织:最小示例 → 常用变体 → 全部写法 → 参数与选项 → 边界与坑。所有示例都是「效果在前、源码在后」成对出现——看到什么就能立刻知道怎么写的。
插件注册位置:根
_config.yml的markdown.plugins;渲染配置(breaks/linkify/typographer/html)在同文件markdown.render。
1. emoji 表情(markdown-it-emoji)
用途:在 Markdown 正文里用短代码写 emoji,不必依赖输入法。
学习路径:最小示例 → 常用变体 → 全部写法 → 参数与选项 → 边界与坑
1.1 最小示例
效果:😄
对应源码:
:smile:两个冒号夹住短代码名,解析后就是 emoji 字符本身。
1.2 常用变体
效果:❤️ 🚀 👍
对应源码:
:heart: :rocket: :+1:符号类短代码同样支持,
+1/-1这种带符号的名字也能用。
效果:✅
对应源码:
:white_check_mark:多词短代码用下划线连接,不用连字符。
效果:中文😄中文
对应源码:
中文:smile:中文冒号两侧无需空格,紧贴中文也能转换。
1.3 全部写法
| 写法 | 渲染结果 | 说明 |
|---|---|---|
:smile: | 😄 | 标准短代码,最常用 |
:heart: :rocket: :+1: | ❤️ 🚀 👍 | 符号类短代码同样支持(+1/-1 这类带符号名也可以) |
:white_check_mark: | ✅ | 多词短代码用下划线连接 |
| 直接输入 😄 | 😄 | Unicode 字符原样输出,不经过插件 |
中文紧邻 中文:smile:中文 | 中文😄中文 | 无需空格 |
1.4 参数与选项
插件以裸 use() 启用,无 options:整套 shortcode 表全量注册,无法按需裁剪白名单。
输出就是纯 emoji 字符(不额外包 <span>),所以样式完全由系统 emoji 字体决定。
1.5 边界与坑
| 情况 | 行为 |
|---|---|
:foo: 非标准短代码 | 原样输出字面量 :foo:,不报错 |
写在行内代码里 `:smile:` | 不转换(代码内容受保护) |
短代码缺尾冒号 :smile | 不转换 |
中文紧邻 中文:smile:中文 | 正常转换,冒号两侧无需空格 |
| 在代码块里写 | 不转换 |
1.6 小结
- 记不住短代码名就直接输入 emoji 字符,效果一样
- 多词名一律下划线:
white_check_mark,不是white-check-mark - 想禁用某个短代码做不到——插件不支持白名单
测试断言:页面含 emoji 渲染字符(如 😄 ✅)。
2. 缩写 abbr(markdown-it-abbr)
用途:给缩写词挂全称,鼠标悬停时显示。
学习路径:最小示例 → 常用变体 → 全部写法 → 参数与选项 → 边界与坑
2.1 最小示例
效果:
W3C 制定 Web 标准。
对应源码:
*[W3C]: World Wide Web Consortium
W3C 制定 Web 标准。定义行
*[缩写]: 全称独占一行,紧随其后的正文里同名缩写自动带虚线。
2.2 常用变体
效果:HTML 定义结构,CSS 定义表现。
对应源码:
*[HTML]: Hyper Text Markup Language
*[CSS]: Cascading Style Sheets
HTML 定义结构,CSS 定义表现。多行定义连续写即可,一次定义全文生效。
效果:同一缩写出现两次:HTML 与 HTML。
对应源码:
*[HTML]: Hyper Text Markup Language
同一缩写出现两次:HTML 与 HTML。正文里每一处都会加
abbr,只需定义一次。
2.3 全部写法
| 写法 | 渲染结果 | 说明 |
|---|---|---|
*[HTML]: Hyper Text Markup Language | <abbr title="Hyper Text Markup Language">HTML</abbr> | 定义行,独占一行 |
| 连续多行定义 | 多个缩写同时生效 | 每行一个 |
| 正文多次出现同一缩写 | 每一处都加 abbr | 全文生效 |
| 定义行写在正文之后 | 同样生效 | 插件先收集全部定义再替换(实测) |
2.4 参数与选项
- 定义行格式固定:
*[缩写]: 全称,冒号后可带空格 - 缩写区分大小写:定义了
HTML不会匹配小写html - 定义行位置不影响效果:插件在 block 解析阶段先收集全部定义,写在正文之后同样生效
2.5 边界与坑
| 情况 | 行为 |
|---|---|
定义行与正文写在同一行 *[API]: …* API | 整行被当成定义吞掉,正文丢失(实测渲染为空) |
大小写不一致 html | 不加 abbr,保持原文 |
| 缩写含空格或特殊符号 | 不支持,按普通文本处理 |
HTTP 与 HTTPS 同时存在 | 按整词匹配,需分别定义 |
| 在代码块 / 行内代码里 | 不替换 |
2.6 小结
- 定义行一定单独一行,别和正文挤在一起
- 大小写敏感,
HTML≠html - 定义放文末也行,位置无所谓
测试断言:页面含
<abbr标记。
3. 脚注 footnote(markdown-it-footnote)
用途:正文挂角标,注释集中排到文末。
学习路径:最小示例 → 常用变体 → 全部写法 → 参数与选项 → 边界与坑
3.1 最小示例
效果:Hexo 是一个快速静态博客框架[^hexo]。
对应源码:
Hexo 是一个快速静态博客框架[^hexo]。
[^hexo]: Hexo 官网:https://hexo.io正文写
[^标签],任意位置写[^标签]: 内容,自动生成角标 + 文末脚注列表 + 回链箭头。
3.2 常用变体
效果:数字标签也行[1],命名标签也行[named]。
对应源码:
数字标签也行[^1],命名标签也行[^named]。
[^1]: 数字标签的脚注。
[^named]: 命名标签的脚注,标签可以是任意单词。标签只是配对用的标识,渲染出来的序号按出现顺序自动排。
效果:同一脚注引用两次:第一处[dup],第二处[dup]。
对应源码:
同一脚注引用两次:第一处[^dup],第二处[^dup]。
[^dup]: 只有一条定义,但两个回链。第二次起自动加后缀(
[1:1]),文末脚注项会带两个 ↩ 回链。
3.3 全部写法
| 写法 | 渲染结果 | 说明 |
|---|---|---|
正文[^1] + [^1]: 内容 | 上标 [1] | 数字脚注,编号按出现顺序 |
正文[^note] + [^note]: 内容 | 上标 [2] | 命名脚注,标签可为任意单词 |
| 同一脚注多次引用 | 首次 [1],之后 [1:1] | 第二次起自动加后缀 |
| 定义行缩进续行 | 多段脚注内容 | 续行缩进 4 空格即并入同一脚注 |
3.4 参数与选项
插件无 options。脚注列表自动追加到文末(<hr> + <section class="footnotes">),每条的回链箭头(↩)自动生成,无需手写。
3.5 边界与坑
| 情况 | 行为 |
|---|---|
有引用无定义 [^x] | 原样输出 [^x],不报错 |
| 有定义无引用 | 不渲染到文末,定义被丢弃 |
| 定义行位置 | 可集中写在文末(推荐),不必紧跟引用处 |
| 引用写在代码块 / 行内代码内 | 不解析 |
| 标签大小写 | 视为不同标签,需一致 |
3.6 小结
- 标签用有意义的名字(
[^hexo])比数字好维护 - 定义统一堆文末,别散落在正文中间
- 一稿多引没问题,回链自动生成
测试断言:页面含
footnote相关标记(<sup或footnotes)。
4. 插入文本 ins(markdown-it-ins)
用途:
++插入文本++渲染为下划线插入效果(修订标记语义)。学习路径:最小示例 → 常用变体 → 全部写法 → 参数与选项 → 边界与坑
4.1 最小示例
效果:这是 插入的内容。
对应源码:
这是 ++插入的内容++。4.2 常用变体
效果:本次更新 新增了暗色模式 支持。
对应源码:
本次更新 ++新增了暗色模式++ 支持。内容是中文短语也照常工作,只要在同一行内闭合。
效果:多词 含空格
对应源码:
++多词 含空格++和
~/^不同,++允许内容含空格。
4.3 全部写法
| 写法 | 渲染结果 | 说明 |
|---|---|---|
++文本++ | <ins>文本</ins> | 唯一写法,无其他变体 |
++多词 含空格++ | <ins>多词 含空格</ins> | 内容可含空格 |
4.4 参数与选项
插件无 options;<ins> 的样式(下划线/颜色)由主题 CSS 决定,与语法无关。
4.5 边界与坑
| 情况 | 行为 |
|---|---|
未闭合 ++文本 | 原样输出,不报错 |
跨行书写(++ 分处两行) | 不匹配,原样输出 |
写在行内代码里 `++x++` | 不转换 |
与 ==高亮== 叠加 ++==内容==++ | 允许,但嵌套顺序不同会得到不同 HTML,建议分开写 |
4.6 小结
- 唯一写法
++…++,没有~~那种双字符变体 - 必须同一行闭合
测试断言:页面含
<ins标记。
5. 下标 sub(markdown-it-sub)
用途:
~下标~渲染为下标,用于化学式、变量下标。学习路径:最小示例 → 常用变体 → 全部写法 → 参数与选项 → 边界与坑
5.1 最小示例
效果:H2O 是水的化学式。
对应源码:
H~2~O 是水的化学式。5.2 常用变体
效果:CO2 是二氧化碳。
对应源码:
CO~2~ 是二氧化碳。效果:word 这种单词下标也可以。
对应源码:
~word~ 这种单词下标也可以。5.3 全部写法
| 写法 | 渲染结果 | 说明 |
|---|---|---|
H~2~O | H<sub>2</sub>O | 单个 ~ 包裹 |
~word~ | <sub>word</sub> | 单词下标 |
~多词短语~(含空格) | 不转换 | 内容不能含空格(实测 ~a b~ 原样输出) |
5.4 参数与选项
插件无 options。注意:单个 ~ 由本插件处理,~~ 属于另一套规则(删除线)。
5.5 边界与坑
| 情况 | 行为 |
|---|---|
~~删除线~~ | 渲染为 <s> 删除线(markdown-it 内置 strikethrough),不是 sub |
~text~ 内含空格 | 不转换 |
单侧 ~ 未闭合 | 原样输出 |
与数学公式混排 $a_i$ | 用数学语法写上下标更稳,避免 ~/^ 冲突 |
5.6 小结
- 单个
~是下标,两个~~是删除线,别混 - 下标内容不能含空格
测试断言:页面含
<sub标记。
6. 上标 sup(markdown-it-sup)
用途:
^上标^渲染为上标,用于指数、单位。学习路径:最小示例 → 常用变体 → 全部写法 → 参数与选项 → 边界与坑
6.1 最小示例
效果:E=mc2 是质能方程。
对应源码:
E=mc^2^ 是质能方程。6.2 常用变体
效果:210 = 1024。
对应源码:
2^10^ = 1024。效果:x2 + y2 = z2(同一行多次使用)
对应源码:
x^2^ + y^2^ = z^2^(同一行多次使用)6.3 全部写法
| 写法 | 渲染结果 | 说明 |
|---|---|---|
E=mc^2^ | E=mc<sup>2</sup> | 单个 ^ 包裹 |
^n^ | <sup>n</sup> | 单词上标 |
x^2^ + y^2^ | 两处上标 | 同一行可多次使用 |
6.4 参数与选项
插件无 options;上标字号由主题 CSS(sup 样式)控制。
6.5 边界与坑
| 情况 | 行为 |
|---|---|
内容含空格 ^a b^ | 不转换 |
未闭合 ^2 | 原样输出 |
写在行内代码里 `^2^` | 不转换 |
表格里写 ^^(合并标记) | 正文中无意义,表格合并请见 §9 |
6.6 小结
^…^内容不能含空格(和++不同)- 表格里的
^^是合并语法,与上标无关
测试断言:页面含
<sup标记。
7. 高亮 mark(markdown-it-mark)
用途:
==高亮==渲染为荧光笔高亮。学习路径:最小示例 → 常用变体 → 全部写法 → 参数与选项 → 边界与坑
7.1 最小示例
效果:这是 重点内容。
对应源码:
这是 ==重点内容==。7.2 常用变体
效果:请特别注意 密码安全。
对应源码:
请特别注意 ==密码安全==。效果:多词 含空格 同样有效。
对应源码:
==多词 含空格== 同样有效。7.3 全部写法
| 写法 | 渲染结果 | 说明 |
|---|---|---|
==重点内容== | <mark>重点内容</mark> | 唯一写法 |
==多词 含空格== | <mark>多词 含空格</mark> | 内容可含空格 |
7.4 参数与选项
插件无 options;高亮底色由主题 CSS 决定,改色改 mark 样式而非语法。
7.5 边界与坑
| 情况 | 行为 |
|---|---|
未闭合 ==重点 | 原样输出 |
空内容 ==== | 不生成 mark,原样输出 |
| 跨行书写 | 不匹配(需同一行) |
| 写在行内代码里 | 不转换 |
7.6 小结
==…==允许空格,比~/^宽松- 必须同一行闭合,空内容不生效
测试断言:页面含
<mark标记。
8. 任务列表 task-checkbox(markdown-it-task-checkbox)
用途:
- [x]/- [ ]渲染为只读复选框列表。学习路径:最小示例 → 常用变体 → 全部写法 → 参数与选项 → 边界与坑
8.1 最小示例
效果:
对应源码:
- [x] 已完成任务
- [ ] 未完成任务8.2 常用变体
效果:
对应源码:
- [x] 主题测试文章创建
- [x] 自动化测试脚本
- [ ] 视觉回归验证效果(嵌套 + 行内语法):
对应源码:
- [ ] 父级任务 **加粗** :rocket:
- [x] 子任务一
- [ ] 子任务二复选框后的内容仍走 inline 解析:粗体、emoji、行内代码都能用。
8.3 全部写法
| 写法 | 渲染结果 | 说明 |
|---|---|---|
- [ ] 未完成 | 空复选框 | 方括号内一个空格 |
- [x] 已完成 | 勾选复选框 | 小写 x |
嵌套:- [ ] 父 + 缩进 - [x] 子 | 二级任务列表 | 子项需缩进 2 空格 |
- [ ] **粗体** :emoji: | 行内语法正常生效 | 复选框后的内容仍走 inline 解析 |
8.4 参数与选项
插件裸启用、无 options,但它默认给 checkbox 写入 disabled:渲染为 <input type="checkbox" disabled>,并给 <li> 加 task-list-item 类、给 <ul> 加 task-list 类。
8.5 边界与坑
| 情况 | 行为 |
|---|---|
| 复选框能点吗 | 不能:disabled 只读展示,点击无效果 |
| 勾选状态会保存吗 | 不会:纯静态 HTML,刷新页面即还原 |
[x] 前面不是列表标记 正文 [x] | 不转换,按普通文本处理 |
中间态 [-] | 不识别,按普通文本处理 |
大写 [X] | 实测同样渲染为勾选(大小写不敏感) |
8.6 小结
- 只读展示,别指望读者能勾
- 想保存进度就得用真正的待办服务,静态站做不到
测试断言:页面含
task-list-item或 checkbox 标记。
9. 表格增强 multimd-table(markdown-it-multimd-table)
用途:在标准表格语法上追加对齐、行合并、列合并、表题。
学习路径:最小示例 → 对齐 → 行合并 → 列合并 → 表题 → 全部写法 → 参数与选项 → 边界与坑
9.1 最小示例
效果:
| 左对齐 | 居中 | 右对齐 |
|---|---|---|
| a | b | c |
对应源码:
| 左对齐 | 居中 | 右对齐 |
| :----- | :--: | -----: |
| a | b | c |冒号位置决定对齐:
:---左、:--:中、---:右。
9.2 常用变体
效果(行合并,^^ 表示与上一行合并):
| 组 | 项 | 状态 |
|---|---|---|
| A | 基础 | ✅ |
| 高级 | ✅ | |
| B | 实验 | ⚠️ |
对应源码:
| 组 | 项 | 状态 |
| :--- | :--- | :--- |
| A | 基础 | ✅ |
| ^^ | 高级 | ✅ |
| B | 实验 | ⚠️ |需要
rowspan: true(本项目已开启),且^^必须在有上一行的连续行里。
效果(列合并,留空单元格向右跨列):
| 模块 | 说明 | 备注 |
|---|---|---|
| 表格 | ||
| 图片 | 单列 | 正常 |
对应源码:
| 模块 | 说明 | 备注 |
| :--- | :--- | :--- |
| 表格 | 跨两列 ||
| 图片 | 单列 | 正常 |效果(表题,表格下方单独一行 [标题]):
| 插件 | 类型 | 状态 |
|---|---|---|
| emoji | 行内 | ✅ |
| footnote | 行内 | ✅ |
| mathjax3 | 块级 | ✅ |
对应源码:
| 插件 | 类型 | 状态 |
| :---- | :--- | :--- |
| emoji | 行内 | ✅ |
| footnote | 行内 | ✅ |
| mathjax3 | 块级 | ✅ |
[常用插件一览]表题渲染为
<caption>且靠下(caption-side: bottom),空行隔开后归属上一张表。
9.3 全部写法
| 写法 | 渲染结果 | 说明 |
|---|---|---|
| :--- | :--: | ---: | | 左 / 居中 / 右对齐 | 分隔行里的冒号位置决定对齐 |
| ^^ | | <td rowspan="2"> | 行合并:^^ 表示「与上一行合并」(需 rowspan: true) |
| 跨列 || | <td colspan="2"> | 列合并:留空单元格即向右跨列 |
表格下方一行 [表格标题] | <caption> | 表题,渲染在表格下方 |
| 表头行 + 分隔行 | 普通表格 | 第一行恒为表头(headerless 未启用) |
单元格内 \| | 字面竖线 | 需转义为 \\| |
9.4 参数与选项
| 选项 | 本项目值 | 作用 |
|---|---|---|
rowspan | true | 启用 ^^ 行合并 |
colspan | true(默认) | 启用空单元格跨列 |
multiline | false(默认) | 单元格内多行未启用 |
headerless | false(默认) | 无表头表格未启用 |
想用单元格内多行,得在
markdown.plugins里把该项选项改成multiline: true再 clean 构建。
9.5 边界与坑
| 情况 | 行为 |
|---|---|
行与行之间插空行再写 ^^ | 合并失效:被当成新表格,生成第二个 <tbody>,^^ 原样显示 |
| 单元格内换行写多行 | multiline 未启用,换行被拆成新的一行 |
^^ 出现在表体第一行 | 无上一行可合并,原样显示 ^^ |
| 某行少一列 / 多一列 | 缺列补空,多余列被丢弃 |
单元格里要写字面 \| | 需转义为 \\| |
| 表题与表格之间插空行 | 仍归属上一张表(但多表连排时容易错认,建议紧贴) |
9.6 小结
- 对齐靠分隔行冒号,行合并靠
^^,列合并靠留空 ^^不能隔空行,否则合并失效- 表题写在表格下方,用
[标题]
测试断言:页面含
<table标记。
10. 图片尺寸 imsize(markdown-it-imsize)
用途:用
=宽x高控制图片显示尺寸,编译期写进<img>的width/height。学习路径:最小示例 → 只定宽/只定高 → 百分比 → 全部写法 → 参数与选项 → 边界与坑
10.1 最小示例
效果:

对应源码:
尺寸串挂在 URL 之后,与 URL 用空格分隔。
10.2 常用变体
效果(只定宽,高度按比例自适应):

对应源码:
效果(只定高,宽度按比例自适应):

对应源码:
效果(百分比宽度,必须带 x):

对应源码:
10.3 全部写法
| 写法 | 渲染属性 | 说明 |
|---|---|---|
 | width="300" height="200" | 宽 + 高 |
 | width="300" | 只定宽,高度自适应 |
 | height="200" | 只定高,宽度自适应 |
 | width="50%" | 百分比宽度,必须带 x |
 | width="50%" height="200" | 百分比宽 + 固定高 |
10.4 参数与选项
- 尺寸串挂在 URL 之后,与 URL 用空格分隔:
 - 无插件级 options,写法即参数
- 百分比必须写成
=50%x(带x占位),裸=50%不识别
10.5 边界与坑
| 情况 | 行为 |
|---|---|
只写 =50%(不带 x) | 不生效,图片语法整段原样输出(实测) |
只写 =300(不带 x) | 不识别,原样输出 |
想同时加 title =300x200 "标题" | 不支持,整段原样输出(实测) |
URL 与尺寸间漏空格 url=300x200 | 不识别 |
| 尺寸写在 alt 里 | 无效,必须是 URL 之后的独立参数 |
与 imgsize.js 的区别:
markdown-it-imsize是 Markdown 渲染插件,在编译阶段处理=宽x高语法并写入<img>标签的width/height属性;主题另有scripts/events/lib/imgsize.js脚本,在运行时为未手动指定尺寸的<img>注入真实宽高(本地同步读取/网络异步拉取),防 CLS。两者协作:手动指定的尺寸由 imsize 插件处理,未指定的由 imgsize.js 兜底。
10.6 小结
- 两个数字用
x连,缺哪个就空着:=300x、=x200 - 百分比必须带
x:=50%x,裸=50%会整段失效 - 别在尺寸后加 title,插件不认
测试断言:页面含
img且带尺寸属性。
11. 容器 container(markdown-it-container)
用途:
::: 类型渲染带语义色的提示容器(Markdown 层,不是 tag 插件)。学习路径:最小示例 → 常用类型 → 全部写法 → 参数与选项 → 与 note 的区别 → 边界与坑
11.1 最小示例
效果:
这是 warning 容器。
对应源码:
::: warning
这是 warning 容器。
:::开始与结束标记各占一行,容器名只能用白名单里的 7 个。
11.2 常用类型
效果:
这是 tip 容器(蓝色,与 info 同义)。
对应源码:
::: tip
这是 tip 容器(蓝色,与 info 同义)。
:::效果(多段内容,空行不结束容器):
第一段说明。
第二段仍在同一容器内。
对应源码:
::: note
第一段说明。
第二段仍在同一容器内。
:::11.3 全部写法
| 写法 | 渲染结果 | 说明 |
|---|---|---|
::: warning … ::: | <div class="warning"> | 开始/结束标记各占一行 |
::: note … ::: | <div class="note"> | 同上,7 个名字任选 |
| 内容多段(段间空行) | 多段落在同一容器内 | 空行不结束容器 |
11.4 参数与选项
本项目注册的 7 个容器名(其余名字不识别):
| 容器名 | 语义色 | 备注 |
|---|---|---|
warning | 黄 / 警示 | |
note | 蓝 / 说明 | |
info | 蓝 / 信息 | |
tip | 蓝 / 技巧 | 与 info 同义 |
hint | 蓝 / 提示 | 与 info 同义 |
attention | 紫 / 注意 | |
error | 红 / 错误 |
无标题参数:::: tip 容器标题 里的「容器标题」会被丢弃(实测只渲染 <div class="tip"><p>内容</p></div>),需要标题请改用 §19 admon 或 {% note %} 标签。
11.5 与 note 标签的区别
{% note primary 说明 %}
正文
{% endnote %}| 维度 | ::: name 容器 | note 标签 |
|---|---|---|
| 实现层 | markdown-it-container(Markdown 渲染阶段) | 主题 tag 插件(Markdown 渲染之前) |
| 产出 HTML | <div class="warning"> | <div class="note primary"> |
| 支持标题 | ❌ 会被丢弃 | ✅ 支持 title 参数 |
| 支持图标/折叠 | ❌ | ✅ |
| 写在代码块内 | 不解析 | 不解析 |
11.6 边界与坑
| 情况 | 行为 |
|---|---|
名字不在 7 个白名单内 ::: custom | 不识别,原样输出 ::: custom |
| 在名字后加标题 | 标题被丢弃,只剩容器 |
| 容器嵌套容器 | 不可靠:实测外层被提前闭合,并残留多余的 ::: 段落 |
| 开始/结束标记与其他文字同行 | 不识别 |
| 只写开始不写结束 | 容器延伸到文末(吞掉后续内容) |
11.7 小结
- 想无脑用就记
warning/note/info三个 - 要标题、要图标、要折叠 → 用
{% note %},不要在:::上折腾 - 别嵌套
:::,会出错
测试断言:页面含
note warning容器标记。
12. 定义列表 deflist(markdown-it-deflist)
用途:术语 + 描述的结构化列表(
<dl>/<dt>/<dd>)。学习路径:最小示例 → 多定义 → 全部写法 → 参数与选项 → 边界与坑
12.1 最小示例
效果:
- Markdown
- 轻量级标记语言。
- 由 John Gruber 于 2004 年创建。
对应源码:
Markdown
: 轻量级标记语言。术语行与
: 定义行之间不能有空行,冒号后要一个空格。
12.2 常用变体
效果(一个术语多条定义):
- Hexo
- 快速、简洁且高效的博客框架。
- 基于 Node.js 编写。
对应源码:
Hexo
: 快速、简洁且高效的博客框架。
: 基于 Node.js 编写。效果(定义内可用行内语法):
- Node.js
- 支持 JavaScript 与
npm生态。
对应源码:
Node.js
: 支持 **JavaScript** 与 `npm` 生态。12.3 全部写法
| 写法 | 渲染结果 | 说明 |
|---|---|---|
术语 + 换行 + : 定义 | <dt> + <dd> | 最简形式 |
同一术语多个 : 定义 | 一个 <dt> + 多个 <dd> | 一术语多定义 |
| 多个术语连续书写 | 自动分组 | 无需空行也能连续 |
| 定义内写行内语法 | 正常解析 | : 支持 **粗体** 与 \代码`` |
12.4 参数与选项
插件无 options。要求:术语行与 : 定义 行之间不能有空行,冒号后需一个空格。
12.5 边界与坑
| 情况 | 行为 |
|---|---|
| 术语与定义之间插空行 | 断成两个段落,定义不生效 |
冒号后无空格 :定义 | 不识别,按普通文本处理 |
| 定义跨多行 | 续行需缩进,否则被判为新段落 |
| 与表格/脚注相邻无空行 | 可能被并入上一个块,建议块间留空行 |
12.6 小结
- 术语行、
: 定义行必须紧贴,中间不能空行 - 一个术语可以挂多条定义
测试断言:页面含
<dl/<dt/<dd>标记。
13. 数学公式 mathjax3(markdown-it-mathjax3)
用途:编译期把 LaTeX 渲染成 SVG(SSR,无前端 JS 依赖)。
学习路径:行内 → 块级 → 全部写法 → 参数与选项 → 边界与坑
13.1 行内公式
效果:质能方程
对应源码:
质能方程 $E=mc^2$ 是最著名的物理公式之一。单个
$包裹,与文字同排;内部不能换行。
13.2 块级公式
效果:
对应源码:
$$
\int_0^\infty e^{-x^2} dx = \frac{\sqrt{\pi}}{2}
$$
$$各占一行,内容居中独占一块。
效果(块级多行,\\ 换行 + aligned 环境):
对应源码:
$$
\begin{aligned}
a^2 + b^2 &= c^2 \\
\int_0^1 x^2 dx &= \frac{1}{3}
\end{aligned}
$$13.3 全部写法
| 写法 | 渲染结果 | 说明 |
|---|---|---|
$E=mc^2$ | 行内 SVG 公式 | 与文字同排 |
$$\n...\n$$ | 块级居中公式 | $$ 单独占行,内容换行写 |
\\(...\\) / \\[...\\] | 不支持 | mathjax3 5.x 硬编码 $/$$,实测退化为普通括号文字 |
| 块级内多行 | \\ 换行、aligned/cases 环境 | 需 ams 宏包(mathjax 内置) |
13.4 参数与选项
| 项 | 值 |
|---|---|
| 引擎 | mathjax3(默认,构建时 SSR 输出 <mjx-container> SVG) |
| 分隔符 | $...$ 行内 / $$...$$ 块级 |
配置里的 inlineMath / displayMath | 无效(mathjax3 5.x 硬编码,写了也不生效) |
与 texmath | 互斥,两者同时启用会冲突 |
13.5 边界与坑
| 情况 | 行为 |
|---|---|
正文含金额 $100 和 $200 | 两个 $ 会被当成行内公式,渲染异常 |
| 行内公式里换行 | 不跨行,块级请用 $$ |
写成 \\(...\\) 或 \\[...\\] | 不渲染,输出普通括号文字 |
公式内含 {} | 正常渲染;若模板引擎报解析错误,用 `` 包裹该段 | | 公式内有下划线 `_` | 正常(在 `$` 内不受 `sub` 插件影响) | ### 13.6 公式双引擎(mathjax / katex,2026-09-10 补) 主题 `post.math.engine` 支持二选一(根 `_config.yml` markdown 插件配套切换): | 引擎 | 分隔符 | 渲染 | |---|---|---| | `mathjax`(默认) | `$...$` 行内 / `$$...$$` 块级(mathjax3 5.x 硬编码,`\(...\)` 不支持) | Node 端 SSR 输出 MathJax SVG(` |
源码一个字都不用改:插件在 CJK 字符与拉丁字母/数字/西文标点之间插入零宽空格(U+200B)作为断行点。
效果(插件未覆盖的场景仍可能溢出):中文句子里的超长 URL 仍会溢出容器,因为零宽空格不插入 URL 内部。
对应源码:
{% raw %}中文句子里的超长 URL 仍会溢出容器:https://example.com/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa14.2 全部写法
无语法:插件自动生效,源码一个字都不用改。它在 CJK 字符与拉丁字母/数字/西文标点之间插入断行机会(零宽空格),让浏览器在中英文交界处正常折行,而不是把整串英文挤到下一行或撑破容器。
| 输入 | 输出 |
|---|---|
中文English中文 | 中文 + ZWSP + English + ZWSP + 中文 |
纯中文 | 不变 |
英文 only | 不变 |
14.3 参数与选项
无 options、无开关,全站所有正文生效。不作用于代码块/行内代码内容。
14.4 边界与坑
| 情况 | 行为 |
|---|---|
| 纯中文段落 | 无变化(本就逐字可断) |
中英混排 中文English中文 | 允许在中英边界断行 |
| 代码块 / 行内代码内 | 不处理,保持原样 |
与 breaks: true 叠加 | 只影响软换行,不影响硬换行 <br> |
| 长 URL 在中文句子里 | 仍可能溢出(零宽空格不插入 URL 内部) |
| 复制文本时 | 零宽空格可能被一起复制,粘贴到别处偶尔出现「看不见的字符」 |
14.5 小结
- 零配置、纯收益,没有需要学的东西
- 唯一要注意的是超长 URL 仍会溢出,必要时手动断行
测试断言:中文文本正常渲染(无异常断字)。
15. 表格进阶实战(multimd-table 组合用法)
用途:把对齐、行合并、列合并、表题组合到一张真实表格里。
学习路径:组合示例 → 启用项 → multiline 说明 → 边界与坑
15.1 组合示例
效果:
| 分类 | 插件 | 状态 |
|---|---|---|
| 行内 | emoji | ✅ |
| footnote | ✅ | |
| mark | ✅ | |
| 块级 | mathjax3 | ✅ |
| container | ✅ |
对应源码:
{% raw %}| 分类 | 插件 | 状态 |
| :--- | :--- | :--: |
| 行内 | emoji | ✅ |
| ^^ | footnote | ✅ |
| ^^ | mark | ✅ |
| 块级 | mathjax3 | ✅ |
| ^^ | container | ✅ |
[按渲染阶段分类]连续
^^会逐行向上合并(rowspan累加),分类列只写一次。
15.2 常用变体
效果(列合并 + 右对齐数值):
| 项目 | 说明 | 数值 |
|---|---|---|
| 表格扩展 | ||
| 行合并 | ^^ | 2 |
| 表题 | [标题] | 1 |
对应源码:
{% raw %}| 项目 | 说明 | 数值 |
| :--- | :--- | ---: |
| 表格扩展 | 跨两列 ||
| 行合并 | `^^` | 2 |
| 表题 | `[标题]` | 1 |15.3 启用项
| 选项 | 本项目 | 说明 |
|---|---|---|
rowspan | ✅ 启用 | ^^ 向上合并 |
colspan | ✅ 默认 | 空单元格向右跨列 |
multiline | ❌ 未启用 | 单元格内多行;需显式 multiline: true |
headerless | ❌ 未启用 | 无表头表格 |
multiline 未启用时的现象:单元格里换行会被拆成新的一行,而不是同一单元格内的多行内容。真需要多行单元格只能改配置 + clean 构建,或用 HTML 表格。
15.4 边界与坑
| 情况 | 行为 |
|---|---|
| 合并行之间插空行 | 断表,^^ 原样输出 |
^^ 用在第一行表体 | 无上一行,原样输出 |
| 列合并把最后一列留空 | 跨列数为剩余列数,注意别多留 |
单元格内含 | | 用 \| 转义 |
| 表格与上下段无空行 | 可能被并入同段,表格不渲染 |
15.5 小结
- 行合并写
^^,列合并留空,表题写[标题] - 组合使用时最容易踩的坑是「行间空行」——合并立刻失效
测试断言:页面含
<table标记(≥2 个表格)。
16. 综合测试(多插件组合)
用途:验证多个插件在同一段内容里互不干扰。
学习路径:组合示例 → 逐项拆解 → 边界与坑
16.1 组合示例
效果:
任务清单(task-checkbox + emoji):
定义列表(deflist):
- Markdown
- 轻量级标记语言。
- 由 John Gruber 发明。
脚注(footnote):主题测试文章共 4 篇[1]。
对应源码:
{% raw %}**任务清单**(task-checkbox + emoji):
- [x] emoji 正常::white_check_mark:
- [x] 插入正常:++新增内容++
- [x] 数学正常:$a^2 + b^2 = c^2$
**定义列表**(deflist):
Markdown
: 轻量级标记语言。
: 由 John Gruber 发明。
**脚注**(footnote):主题测试文章共 4 篇[^total]。
[^total]: 内容tag篇、交互视觉篇、布局页面篇、Markdown语法篇。16.2 逐项拆解
| 组合 | 关键点 |
|---|---|
| 复选框 + emoji | 复选框后内容走 inline,emoji 正常 |
| 复选框 + ins | ++…++ 在 inline 阶段处理,列表项内正常生效 |
| 任务列表 + 数学 | $…$ 在 inline 解析阶段处理,不受列表影响 |
| 定义列表 + 强调 | : 定义 内容走 inline,粗体/代码均可 |
| 脚注 + 任意块 | 脚注可从任何块内引用,列表统一追加文末 |
16.3 边界与坑
| 情况 | 行为 |
|---|---|
同一段里 ~(下标)与 $…$ 混用 | 数学公式内优先,$ 内的 ~ 不当下标 |
| 复选框内写脚注引用 | 可以,脚注正常生成 |
| 定义列表紧跟表格 | 建议留空行,避免并入同一块 |
| 多层嵌套 tag + 插件语法 | 主题 tag 先于 markdown 渲染,插件语法在 tag 正文里仍生效 |
16.4 小结
- 插件之间基本互不冲突,冲突集中在符号重叠:
~/^与数学、==与 attrs - 混排时优先用代码块包住原始语法示例
测试断言:页面含多类标记组合(checkbox + dl + footnote + ins)。
17. 行内属性 attrs(markdown-it-attrs)
用途:给块级/行内元素加
id/class/ 自定义属性,用于样式定位、锚点、target。学习路径:最小示例 → 行内元素 → 链接 → 全部写法 → 参数与选项 → 边界与坑
17.1 最小示例
效果:
这是居中段落(class 定位)。
对应源码:
{% raw %}这是居中段落(class 定位)。
{.text-center}属性块独占下一行,作用于上一个块级元素。
17.2 常用变体
效果(行内元素后紧贴,同一行):这是红色粗体的示例。
对应源码:
{% raw %}这是**红色粗体**{.red}的示例。行内元素必须与属性块同一行,否则属性落到段落上。
效果(链接加属性):带 target 的链接
对应源码:
{% raw %}[带 target 的链接](https://hexo.io){target="_blank"}效果(多个 class 连写):这里的文字同时带两个 class。
对应源码:
{% raw %}这里的文字同时带两个 class。
{.my-class .another-class}多个 class 用空格分隔连写;
#id、key=value可以混在同一个花括号里。属性块必须紧贴上一块,中间隔空行会变成空段落<p class="…"></p>。
17.3 全部写法
| 写法 | 渲染结果 | 说明 |
|---|---|---|
段落下一行 {.text-center} | <p class="text-center"> | 属性块独占一行,作用于上一块 |
**粗体**{.red} | <strong class="red"> | 行内元素后紧贴(同一行) |
[链接](url){target="_blank"} | <a target="_blank"> | 链接后紧贴 |
标题 {#custom-id} | <h2 id="custom-id"> | 标题加锚点 id |
{.a #id key=val} | 多个属性连写 | class 可多个,值与 key 用 = |
17.4 参数与选项
| 形式 | 含义 |
|---|---|
#id | 设置 id(锚点/JS 选择器) |
.class | 追加 class,可写多个 .a .b |
key=value | 任意自定义属性 |
key="带 空格" | 值含空格时用引号 |
17.5 边界与坑
| 情况 | 行为 |
|---|---|
纯文本后紧贴 文字{.red} | 不生效,原样输出(需加在行内元素后或独占一行) |
行内元素与属性分处两行 **粗** ↵ {.red} | 属性落到段落上,不是粗体 |
行首单独一行 {.x} 且上方无块 | 生成空段落 <p class="x"></p> |
| 属性块后无空行紧跟正文 | 可能被并入上一块,属性作用范围变大 |
和 ==高亮== 等插件混用 | 加在标记之后:==文字=={.x} |
写 {target="_blank"} 漏引号含空格 | 值从空格处断开,属性残缺 |
17.6 小结
- 三种位置:块后独占一行、行内元素后紧贴、链接后紧贴
- 关键在「同一行」——跨行就换作用对象
- 纯文本不能直接挂属性,先包成行内元素
测试断言:页面含带
text-centerclass 的元素。
18. 外链属性 link-attributes(markdown-it-link-attributes)
用途:给 Markdown 链接自动加
target="_blank"+rel="noopener noreferrer"。学习路径:最小示例 → 站内链接 → 锚点/裸 URL → 全部写法 → 参数与选项 → 边界与坑
18.1 最小示例
效果:Hexo 官网
对应源码:
{% raw %}[Hexo 官网](https://hexo.io)新窗口打开 + 防反向链接,源码里什么都不用写。
18.2 常用变体
效果(站内链接同样被加 target):站内文章
对应源码:
{% raw %}[站内文章](/posts/8a11fe0a/)效果(锚点链接也被命中):回到顶部
对应源码:
{% raw %}[回到顶部](#)效果(linkify 自动识别的裸 URL):https://hexo.io
对应源码:
{% raw %}https://hexo.io裸 URL 由
linkify: true转成链接,再被本插件加上属性。
18.3 全部写法
| 写法 | 处理 | 说明 |
|---|---|---|
[文字](https://hexo.io) | 加 target + rel | 外链 |
[文字](/posts/xxx/) | 同样加 target + rel | 站内相对链接也命中 |
[文字](#锚点) | 同样加 target | 锚点链接也命中 |
<https://hexo.io>(linkify 自动识别) | 同样加 target | 裸 URL 转成链接后处理 |
[](b.html) | 外层 <a> 同样加 | 图片链接 |
18.4 参数与选项
| 配置项 | 本项目值 | 说明 |
|---|---|---|
attrs.target | _blank | 新窗口打开 |
attrs.rel | noopener noreferrer | 防反向链接 + 性能 |
pattern | ^https?:// | 未生效:插件只接受 matcher 函数,不认 pattern 字符串 |
18.5 边界与坑
| 情况 | 行为 |
|---|---|
| 站内链接 | 也被加 target="_blank"(配置缺陷,非预期但当前如此) |
| 模板生成的链接(上一篇/下一篇、侧栏、导航) | 不受影响,不经过 markdown 渲染 |
| 想让站内链接同窗打开 | 改配置为 matcher 函数,或去掉 pattern 只保留外链判断逻辑 |
HTML 里手写 <a href> | 不受影响(插件只处理 markdown 链接 token) |
写 pattern 字符串 | 不报错但被忽略 → 所有正文链接(含站内、锚点)都加 target |
18.6 小结
- 「只对外链生效」这条当前不成立——
pattern是无效配置 - 结果:正文里所有链接都新窗口打开,站内跳转也开新标签
- 想修就得改
matcher函数,改配置后 clean 构建
测试断言:外链
<a>含target="_blank"+rel="noopener noreferrer"。
19. admon 提示块(markdown-it-admon)
用途:
!!! type语法渲染提示块(python-markdown 风格,与 §11 的:::并存)。学习路径:最小示例 → 自定义标题 → 不同类型 → 全部写法 → 参数与选项 → 边界与坑
19.1 最小示例
效果:
note
这是 note admon——最基础的提示块。
对应源码:
{% raw %}!!! note
这是 note admon——最基础的提示块。正文必须缩进 4 空格,否则落在块外。
19.2 常用变体
效果(自定义标题,类型后直接写文字):
部署前请先备份
改动 _config.yml 后记得 clean 构建。
对应源码:
{% raw %}!!! warning 部署前请先备份
改动 `_config.yml` 后记得 clean 构建。效果(不写标题时用类型名,首字母大写):
Tip
这是 tip admon——小技巧。
对应源码:
{% raw %}!!! tip
这是 tip admon——小技巧。效果(多段内容 + 列表):
Danger
危险操作示例:
- 删除
public/ - 覆盖
_config.yml
对应源码:
{% raw %}!!! danger
危险操作示例:
- 删除 `public/`
- 覆盖 `_config.yml`空行后继续缩进 4 空格,仍属于同一块。
19.3 全部写法
| 写法 | 渲染结果 | 说明 |
|---|---|---|
!!! note | <div class="admonition note"> | 蓝色信息块 |
!!! info / !!! tip | admonition 块 | 提示类 |
!!! warning | 黄色警示块 | |
!!! danger / !!! error / !!! failure | 红色危险块 | |
!!! success | 绿色成功块 | |
!!! bug / !!! question / !!! quote / !!! example | 对应图标块 | 语义类 |
!!! note 自定义标题 | 标题替换为指定文字 | 类型后空格接文字,成为 admonition-title |
19.4 参数与选项
| 项 | 说明 |
|---|---|
| 类型 | note / info / tip / warning / danger / error / success / failure / bug / question / quote / example(插件还接受 summary abstract tldr todo hint check done help faq attention caution fail missing snippet cite,但主题 CSS 只给常见类型配了色) |
| 标题 | 类型后空格接文字即可,不用引号;省略时用类型名(首字母大写,如 Success/Danger) |
| 内容 | 必须缩进 4 空格,否则不进入块内 |
| 引号 | 若手写 "标题",typographer 会把直引号转成中文弯引号 “” 并连引号一起显示 |
19.5 边界与坑
| 情况 | 行为 |
|---|---|
| 内容不缩进 | 只有标题进入块内,正文落在块外 |
折叠块 ??? note | 不支持:当前插件版本(1.0.1)无折叠语法,实测原样输出 ??? note |
类型拼错 !!! cautoin | 类型照收(不校验),但主题没有对应配色,显示为无样式块 |
与 §11 ::: 容器混用 | 两套独立语法:admon 产出 .admonition.<type>,container 产出 .<type>,样式不同 |
| 缩进 2 空格 | 不足 4 空格,视为普通段落 |
| 标题加引号 | 引号会被渲染出来(“标题”),纯属多余 |
19.6 小结
- 三要素:
!!! 类型、缩进 4 空格、可选标题(不加引号) - 想折叠 → 用
{% note %},admon 的???在这个版本不存在 - 类型不校验,拼错不报错但没样式
测试断言:页面含 admon 渲染标记。
⚠️ 已知坑
坑 1:标题编号双重叠加
现象:标题渲染为「1. 1. 概述」(两个编号)。
原因:主题 CSS 自动给 h2–h6 加编号(默认开启),手写编号(如 ## 1. 概述)会叠加。
正确做法:手写编号的页面在 front-matter 加 closeAutoTocNum: true;不手写编号的页面不要加该字段。
本文已正确设置
closeAutoTocNum: true。
坑 2:{% raw %}` 忘了包 **现象**:示例源码里的 `{% note %}`、`{{ }}` 被真实执行或报模板错误。 **正确做法**:所有含 `{% %}` / `{{ }}` 的示例代码块都用 `{% raw %}` … `{% endraw %} 包住。
坑 3:配置项写了不生效
现象:link-attributes 的 pattern: ^https?://、mathjax3 的 inlineMath 都写了,但行为没变。
原因:两处都是插件不认这个键(一个只认 matcher 函数,一个是源码硬编码 $/$$),配置静默失效。
坑 4:改配置后必须 clean 构建
现象:修改根 _config.yml 的 markdown.plugins(如切换 mathjax/katex 引擎、开 multiline)后页面不变。
原因:Hexo 缓存机制不会自动检测配置变更。
正确做法:改 markdown 插件配置后必须 npm run clean && npm run build。
附:markdown-it 插件速查表
| 插件 | 语法 | 渲染 | 测试标记 |
|---|---|---|---|
| emoji | :smile: | emoji 字符 | emoji |
| abbr | *[ABBR]: 全称 | <abbr> | abbr |
| footnote | [^1] | 脚注 | footnote |
| ins | ++文本++ | <ins> | ins |
| sub | ~文本~ | <sub> | sub |
| sup | ^文本^ | <sup> | sup |
| mark | ==文本== | <mark> | mark |
| task-checkbox | - [x] | 复选框 | task-list-item |
| multimd-table | 表格 | <table> | table |
| imsize | =200x100 | 尺寸图 | img |
| container | ::: type | note 容器 | note |
| deflist | 术语: 定义 | <dl> | dl |
| mathjax3 | $公式$ | SVG | math |
| cjk-breaks | 自动 | 中文优化 | - |
| attrs | {#id .class key=val} | 元素属性 | class/id |
| link-attributes | 外链自动 | target=_blank + rel | target |
| admon | !!! type | 提示块 | admon |
参考&致谢
系列教程
Hexo 主题功能测试系列
- Hexo主题功能测试-布局与页面篇 —— 页面布局、导航、侧边栏、卡片等结构功能
- Hexo主题功能测试-交互视觉篇 —— 代码高亮、图片灯箱、动画、明暗切换等交互
- Hexo主题功能测试-内容tag篇 —— note / tabs / timeline / label / button 等 tag 插件
- Hexo主题功能测试-Markdown语法篇 —— Markdown 渲染与扩展语法
- Hexo主题功能测试-自动化测试篇 —— 主题功能的自动化测试方案
内容tag篇、交互视觉篇、布局页面篇、Markdown语法篇。 ↩︎

