zumerlab/snapdom
High-performance engine for capturing, modifying, and converting DOM elements into any format.
github.com · zumerlab/snapdom
zumerlab/snapdom
High-performance engine for capturing, modifying, and converting DOM elements into any format.
SnapDOM 是新一代 DOM 捕获引擎,可将任意 DOM 子树转换为自包含的图像表示,并导出为 SVG、PNG、JPG、WebP、Canvas 或 Blob。它基于标准 Web API 构建,无运行时依赖,在官方基准测试中显著快于 html2canvas 与 html-to-image,适合需要在前端生成分享图、海报或报表截图的场景。
::before/::after)与字体counter()/counters() 与 line-clamp传统方案(html2canvas、dom-to-image)在复杂节点上往往慢且样式还原不稳定。SnapDOM 通过「克隆 → 样式内联 → 图片/字体嵌入 → SVG foreignObject → 导出」的流水线,在保持高还原度的同时把捕获耗时压到毫秒级。对需要「页面内一键保存为图片」的产品(分享卡片、数据看板、设计稿导出)来说,集成成本低、包体小、API 直观。
useProxy;Safari 上 WebP 会回退 PNG,嵌入字体时性能受 WebKit 限制;自定义滚动条样式仅在未滚动时生效。useProxy。npm i @zumer/snapdom# 或yarn add @zumer/snapdomCDN 引入:
<script type="module"> import { snapdom } from "https://unpkg.com/@zumer/snapdom/dist/snapdom.mjs";</script>插件(可选):
npm install @zumer/snapdom-plugins一行代码将元素导出为 PNG:
import { snapdom } from '@zumer/snapdom';
const img = await snapdom.toPng(document.querySelector('#card'));document.body.appendChild(img);可复用捕获、多次导出:
const result = await snapdom(document.querySelector('#card'));await result.toPng();await result.download({ format: 'jpg', filename: 'card.jpg' });在目标页面上对已知 DOM 节点调用 snapdom.toPng(),检查生成的图片是否包含预期文字、背景图与伪元素样式。可在 snapdom.dev 在线 Demo 对比效果。
useProxy 选项。embedFonts)时捕获较慢,可通过 safariWarmupAttempts 调优。FontFace() 动态加载的字体需参考官方 issue #43 的 workaround。::-webkit-scrollbar 样式不会被捕获。@zumer/snapdom,@dev 标签含新特性但可能不够稳定。