MicroLighter 代码高亮库

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)→keywordRange(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 耦合。

劣势也很硬

  1. 最大一条是兼容性——CSS Custom Highlight API 虽已在 2026 年进入 Baseline,但旧 WebView、老浏览器直接无高亮(需降级策略);
  2. 第二条是 ::highlight() 只能接受 colorbackground-colortext-decorationtext-shadow-webkit-text-stroke* 等少量属性,font-weightfont-stylebackground-image 均无效,所以做不到斜体关键字、加粗函数名、渐变背景这类排版;
  3. 第三条是语言覆盖和 Grammar 精度明显不如 highlight.js/Shiki,IDE 级语义分析不在目标内。

选型上可以这么切:

  • 现代浏览器优先的博客、文档站、知识库、每个代码块不长的页面,MicroLighter 很香;
  • 要 SSR、要 Node 端高亮、要兼容旧端、要 Haskell/Elixir/Perl 等冷门语言、要 500+ 主题或极强自动识语言,仍选 highlight.js;
  • 追求 IDE 级精度则上 Shiki。
如果你有魔法,你可以看到一个评论框~