从 html-to-image 分叉而来,部分嵌入资源可能因 CORS 失败;Web Worker 用法需配合 Vite 的 ?url 导入 workerUrl;暂不支持克隆 CSS counters(content: counter())
modern-screenshot
qq15725MIT更新放缓用 HTML5 canvas 和 SVG 把任意 DOM 节点快速导出成图片,适合前端做网页截图、生成分享图或海报。
📸 Quickly generate image from DOM node using HTML5 canvas and SVG.
npm i modern-screenshotREADME 未说明,属于浏览器端库,无需 GPU 或显存
用 HTML5 canvas 和 SVG 把 DOM 节点快速转成图片的浏览器端截图库
用 HTML5 canvas 和 SVG 把任意 DOM 节点快速导出成图片,适合前端做网页截图、生成分享图或海报。
核心能力
- 基于 canvas 与 SVG 将 DOM 节点渲染为图片
- 提供 domToPng、domToSvg、domToJpeg、domToWebp 等多种导出格式
- 支持导出 dataURL、Blob、Pixel、Canvas 与 HTMLElement
- 通过 createContext 复用上下文和 Web Worker 实现高频截图
- 支持 CDN 引入,可直接在浏览器控制台调用
容易踩的坑
- v4.7.0最新正式版2026-04-16 · 2026-04-16 07:25 UTC
Please refer to CHANGELOG.md for details.
- v4.6.82026-01-26 · 2026-01-26 01:42 UTC
查看更新说明
Please refer to CHANGELOG.md for details.
- v4.6.72025-11-18 · 2025-11-18 10:04 UTC
查看更新说明
Please refer to CHANGELOG.md for details.
- v4.6.62025-08-19 · 2025-08-19 15:54 UTC
查看更新说明
Please refer to CHANGELOG.md for details.
- v4.6.52025-07-05 · 2025-07-05 01:32 UTC
查看更新说明
Please refer to CHANGELOG.md for details.
用户点评
登录用户的真实使用记录,可按版本和硬件筛选还没有人点评。第一个说出真实体验的人最有价值。
📦 Install
npm i modern-screenshot
🦄 Usage
import { domToPng } from 'modern-screenshot'
domToPng(document.querySelector('#app')).then((dataUrl) => {
const link = document.createElement('a')
link.download = 'screenshot.png'
link.href = dataUrl
link.click()
})
<script src="https://unpkg.com/modern-screenshot"></script>
<script>
modernScreenshot.domToPng(document.querySelector('body')).then(dataUrl => {
const link = document.createElement('a')
link.download = 'screenshot.png'
link.href = dataUrl
link.click()
})
</script>
⚠️ Partial embedding will fail due to CORS
const script = document.createElement('script')
script.src = 'https://unpkg.com/modern-screenshot/dist/index.js'
document.getElementsByTagName('head')[0].appendChild(script)
script.onload = () => {
modernScreenshot
.domToImage(document.querySelector('body'), {
debug: true,
progress: (current, total) => {
console.log(`${current}/${total}`)
}
})
.then((img) => {
const width = 600
const height = img.height * (width / img.width)
console.log('%c ', [
`padding: 0 ${width / 2}px;`,
`line-height: ${height}px;`,
`background-image: url('${img.src}');`,
`background-size: 100% 100%;`,
].join(''))
})
}
Methods
method(node: Node, options?: Options)
DOM to dataURL
DOM to data
DOM to HTMLElement
Options
See the options.ts
Singleton context and web worker
Quick screenshots per second by reusing context and web worker
import { createContext, destroyContext, domToPng } from 'modern-screenshot'
// use vite
import workerUrl from 'modern-screenshot/worker?url'
async function screenshotsPerSecond() {
const context = await createContext(document.querySelector('#app'), {
workerUrl,
workerNumber: 1,
})
for (let i = 0; i < 10; i++) {
domToPng(context).then((dataUrl) => {
const link = document.createElement('a')
link.download = `screenshot-${i + 1}.png`
link.href = dataUrl
link.click()
if (i + 1 === 10) {
destroyContext(context)
}
})
await new Promise(resolve => setTimeout(resolve, 1000))
}
}
screenshotsPerSecond()
See the context.ts
TODO
-
unable to clone css counters
content: counter(step);