UNPKG

@karinjs/plugin-puppeteer

Version:

karin的 puppeteer截图、渲染插件

70 lines (68 loc) 2.92 kB
import { getConfig, HMR_KEY, pluginVersion, pluginName } from './chunk-PIY2AHNK.js'; import path from 'node:path'; import { snapka } from '@snapka/puppeteer'; export * from '@snapka/puppeteer'; import { karin, registerRender, renderTpl, logger } from 'node-karin'; var formatBytes = (bytes) => { const units = ["B", "KB", "MB", "GB", "TB"]; if (!bytes || bytes < 0) return "0 B"; const i = Math.floor(Math.log(bytes) / Math.log(1024)); const value = bytes / Math.pow(1024, i); return `${i === 0 ? Math.round(value) : value.toFixed(2)} ${units[i]}`; }; var getScreenshotByteSize = (payload, encoding) => { try { if (payload == null) return null; const enc = (encoding || "").toLowerCase(); if (Array.isArray(payload)) { let total = 0; for (const item of payload) { const size = getScreenshotByteSize(item, enc); if (typeof size === "number") total += size; } return total; } if (typeof payload === "string") { return enc === "base64" ? Buffer.from(payload, "base64").length : Buffer.byteLength(payload); } if (Buffer.isBuffer(payload)) return payload.length; if (payload instanceof Uint8Array) return payload.byteLength; if (payload instanceof ArrayBuffer) return payload.byteLength; const anyPayload = payload; if (typeof anyPayload.data === "string") { return enc === "base64" ? Buffer.from(anyPayload.data, "base64").length : Buffer.byteLength(anyPayload.data); } if (Buffer.isBuffer(anyPayload.buffer)) return anyPayload.buffer.length; if (anyPayload.buffer instanceof ArrayBuffer) return anyPayload.buffer.byteLength; if (typeof anyPayload.byteLength === "number") return anyPayload.byteLength; if (typeof anyPayload.length === "number") return anyPayload.length; return null; } catch { return null; } }; var main = async () => { const config = getConfig(); const browser = await snapka.launch(config); karin.on(HMR_KEY, async () => { await browser.restart(); }); const name = "@karinjs/plugin-puppeteer"; registerRender(name, async (options) => { options.encoding = "base64"; const data = renderTpl(options); data.encoding = options.encoding; const time = Date.now(); const { run } = await browser.screenshot(data); const result = await run(); const fileName = typeof data?.file === "string" ? path.basename(data.file) : "unknown"; const sizeBytes = getScreenshotByteSize(result, options.encoding); const sizeStr = typeof sizeBytes === "number" ? `\u5927\u5C0F: ${logger.green(formatBytes(sizeBytes))} ` : ""; logger.info( `[${name}][${fileName}] \u622A\u56FE\u5B8C\u6210 ${sizeStr}\u8017\u65F6: ${logger.green(Date.now() - time + "")} ms` ); return result; }); logger.info(`${logger.violet(`[\u63D2\u4EF6:${pluginVersion}]`)} ${logger.green(pluginName)} \u521D\u59CB\u5316\u5B8C\u6210~`); }; main();