跳到主要内容

SnapDOM

概述

SnapDOM 是新一代的 DOM 捕获引擎(DOM Capture Engine)——超高速、模块化、可扩展。它可以将任意 DOM 子树转换为自包含的结构,并导出为 SVG、PNG、JPG、WebP、Canvas、Blob,或通过插件系统生成 任何自定义格式

SnapDOM 会保留样式、字体、背景图像、伪元素、Shadow DOM 等所有视觉特性,并通过可扩展的架构实现强大的灵活性和最高级别的捕获质量。

核心特性

  • 完整的 DOM 捕获 - 支持复杂 DOM 结构的完整捕获
  • 内嵌样式、伪元素和字体 - 完美保留视觉效果
  • 多格式导出 - SVG、PNG、JPG、WebP、Canvas 或 Blob
  • ⚡ 超快速度,无依赖 - 零依赖的高性能处理
  • 100% 基于标准 Web API - 无需外部库支持
  • 支持同源 iframe - 完整的页面捕获能力
  • 支持 CSS counter() 和 CSS counters() - CSS 计数器功能保留
  • 支持 ... 文本截断(line-clamp) - CSS 截断效果保留

安装

NPM / Yarn (稳定版)

npm i @zumer/snapdom
yarn add @zumer/snapdom

NPM / Yarn (开发版)

npm i @zumer/snapdom@dev
yarn add @zumer/snapdom@dev

CDN 使用

<!-- UMD 构建 -->
<script src="https://unpkg.com/@zumer/snapdom/dist/snapdom.js"></script>

<!-- ES 模块构建 -->
<script type="module">
import { snapdom } from "https://unpkg.com/@zumer/snapdom/dist/snapdom.mjs";
</script>

基本用法

可复用的捕获

import { snapdom } from '@zumer/snapdom';

const el = document.querySelector('#target');
const result = await snapdom(el);

// 转换为 PNG
const img = await result.toPng();
document.body.appendChild(img);

// 直接下载
await result.download({ format: 'jpg', filename: 'my-capture' });

一步式快捷方法

const el = document.querySelector('#target');

// 直接获取 PNG 图片
const png = await snapdom.toPng(el);
document.body.appendChild(png);

// 获取 Blob 对象
const blob = await snapdom.toBlob(el);

API 方法

快捷方法

方法描述
snapdom.toSvg(el, options?)返回 SVG 图片
snapdom.toCanvas(el, options?)返回 Canvas 对象
snapdom.toBlob(el, options?)返回 Blob 对象
snapdom.toPng(el, options?)返回 PNG 图片
snapdom.toJpg(el, options?)返回 JPG 图片
snapdom.toWebp(el, options?)返回 WebP 图片
snapdom.download(el, options?)直接触发下载

返回对象方法

const result = await snapdom(element);
// result 包含以下方法:
{
url: string;
toRaw(): string;
toSvg(): Promise<HTMLImageElement>;
toCanvas(): Promise<HTMLCanvasElement>;
toBlob(options?): Promise<Blob>;
toPng(options?): Promise<HTMLImageElement>;
toJpg(options?): Promise<HTMLImageElement>;
toWebp(options?): Promise<HTMLImageElement>;
download(options?): Promise<void>;
}

常用选项

await snapdom.toPng(element, {
scale: 2, // 输出缩放倍数
width: 800, // 输出宽度
height: 600, // 输出高度
backgroundColor: '#fff', // JPG/WebP 背景色
quality: 0.9, // JPG/WebP 质量 (0-1)
embedFonts: true, // 内嵌字体
exclude: ['.no-capture'], // 排除的选择器
filter: (el) => el.id !== 'exclude', // 过滤函数
useProxy: 'https://proxy.example.com/?' // CORS 代理
});

插件系统(测试版)

SnapDOM 提供强大的插件系统,支持自定义捕获和导出行为。

注册插件

import { snapdom } from '@zumer/snapdom';

// 全局注册
snapdom.plugins(myPlugin);

// 单次捕获注册
const result = await snapdom(element, {
plugins: [myPlugin]
});

示例:叠加滤镜插件

function overlayFilterPlugin(options = {}) {
const color = options.color ?? 'rgba(0,0,0,0.25)';

return {
name: 'overlay-filter',
async afterClone(context) {
const root = context.clone;
if (getComputedStyle(root).position === 'static') {
root.style.position = 'relative';
}

const overlay = document.createElement('div');
overlay.style.cssText = `
position: absolute;
left: 0; top: 0; right: 0; bottom: 0;
background: ${color};
pointer-events: none;
`;
root.appendChild(overlay);
}
};
}

性能基准测试

SnapDOM 在性能方面表现卓越:

场景SnapDOMhtml2canvashtml-to-image
小尺寸 (200×100)0.5 ms67.7 ms3.1 ms
页面视图 (1200×800)0.5 ms114.2 ms3.3 ms
大滚动 (2000×1500)0.5 ms735.2 ms984.2 ms

使用场景

  • 截图功能 - 网页元素截图、图表导出
  • 报告生成 - 将页面内容导出为图片格式
  • 数据可视化 - 图表、仪表板的图片导出
  • 文档生成 - 动态生成文档并导出
  • UI 测试 - 视觉回归测试的截图对比
  • 设计工具 - 在线设计工具的导出功能

资源链接

总结

SnapDOM 是一个极其强大的 DOM 捕获引擎,具有超快的处理速度和极高的灵活性。其模块化架构和插件系统使其能够适应各种复杂的捕获需求,同时保持零依赖和高性能的特点。无论是简单的元素截图还是复杂的页面导出,SnapDOM 都能提供优秀的解决方案。