MicroLighter 是 Dave Rupert 在 2026 年 8 月发布的零依赖客户端语法高亮库,核心 runtime 约 2.05 KiB gzip,目前支持约 35 种语言、Grammar 按需加载。
它最本质的一句定位是:把“代码高亮”从 DOM 层搬到了 CSS 渲染层——用 TextMate Grammar 做词法分析,用浏览器原生的 CSS Custom Highlight API 做着色,全程不修改 DOM 结构。
传统 highlight.js 的思路是解析源码后往 <code> 里塞 <span>,生成嵌套 HTML:const 包成 <span class="keyword">、foo 包成 <span class="variable">,再由 CSS 给 class 上色。
因此 MicroLighter 渲染的 HTML 更加纯净:
<code>const foo = 42</code>
JS 只算出 Range(0,5)→keyword、Range(6,9)→variable 这样的文本区间,然后 CSS.highlights.set('keyword', new Highlight(range)),最后由 CSS 的 ::highlight(keyword){color:…} 让浏览器直接把那段文字染出来。解析结果存在 Highlight Registry 里,不在 DOM 里。
为什么能压到 2 KiB? 因为它把两块最重的东西都推给了外部:语言知识推给 TextMate Grammar(VS Code 同款,按需 ESM 加载,用多少语言付多少流量),文本渲染推给 CSS Highlight API。MicroLighter 自身只是一个极薄的 glue layer——扫描 code 块、加载对应 Grammar、正则匹配 Token、生成 Range、CSS.highlights.set() 完事。顺带还把 TextMate 过细的 scope 压扁成 keyword/string/function/comment 等人类好写的分类,主题用 light-dark() 一把梭,行号和复制按钮丢进一个约 1 KiB 的 Web Component。
和 highlight.js 摆在一起看定位就清楚了:
| 维度 | MicroLighter | highlight.js |
|---|---|---|
| 核心体积 | ~2 KiB gzip | 常用包几十 KiB(全量 min+gzip 约 316 KiB) |
| 语言数 | ~35 | 193 |
| 主题数 | 10 | 516+ |
| Grammar 来源 | TextMate(按需) | 自有语言定义 |
| DOM 影响 | 不改 DOM,无 span | 生成大量 span |
| 依赖 | 0 | 0 |
| 浏览器要求 | 需 CSS Highlight API(2025.6 起四大浏览器 Baseline) | 极低 |
| 自动识语言 | 弱 | 强 |
| 可编辑代码友好度 | 高 | 一般 |
它的三个真优势:
① DOM 极其干净,<code contenteditable> 不受 span 干扰,光标/选区/复制行为正常,特别适合博客、Markdown 文档、在线 IDE 简单展示;
② 固定运行时成本约 2 KiB,Grammar 懒加载,技术博客只用到 JS/TS/Go/Bash 时不必背 193 种语言;
③ 内容与表现彻底分离,主题就是一段 ::highlight(keyword){…} 的 CSS,没有 class 耦合。
劣势也很硬:
- 最大一条是兼容性——CSS Custom Highlight API 虽已在 2026 年进入 Baseline,但旧 WebView、老浏览器直接无高亮(需降级策略);
- 第二条是
::highlight()只能接受color、background-color、text-decoration、text-shadow、-webkit-text-stroke*等少量属性,font-weight、font-style、background-image均无效,所以做不到斜体关键字、加粗函数名、渐变背景这类排版; - 第三条是语言覆盖和 Grammar 精度明显不如 highlight.js/Shiki,IDE 级语义分析不在目标内。
选型上可以这么切:
- 现代浏览器优先的博客、文档站、知识库、每个代码块不长的页面,MicroLighter 很香;
- 要 SSR、要 Node 端高亮、要兼容旧端、要 Haskell/Elixir/Perl 等冷门语言、要 500+ 主题或极强自动识语言,仍选 highlight.js;
- 追求 IDE 级精度则上 Shiki。