如何使用 Bun Webview 实现图片生成

传统的网页截图方案通常依赖 Puppeteer 或 Playwright 这样的无头浏览器,但这些工具包体积庞大、启动慢、内存占用高。Bun Webview 提供了一个更轻量的选择,它基于系统原生的 WebView 组件,可以在服务端渲染网页并生成图片。

Bun Webview 的核心 API 设计简洁直观。创建 webview 实例时指定宽高,加载 URL 或 HTML 字符串,等待页面完成后调用 screenshot 方法生成图片,最后关闭 webview 释放资源。整个流程代码量很少,比传统的浏览器自动化方案简单很多。

const webview = new Bun.WebView({
  width: 1200,
  height: 630,
});

await webview.loadHTML("<h1>Hello, World!</h1>");
await webview.waitForLoad();

const image = await webview.screenshot({ format: "png" });
await Bun.write("output.png", image);

webview.close();

动态内容生成是 Bun Webview 的强项。我们可以构建包含渐变背景、毛玻璃效果和响应式布局的 HTML 模板,通过 loadHTML 方法直接渲染。这种方式特别适合生成社交媒体分享卡片、OG 图标和个性化推荐图。由于在服务端完成渲染,客户端可以直接使用生成的图片,无需等待浏览器渲染过程。

实际使用中需要掌握几个关键技巧。字体加载很重要,建议使用系统字体栈确保渲染一致性,比如 -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto 这样的组合。渲染时机控制也很关键,某些动态内容如图表或动画可能需要额外等待时间,可以通过 setTimeout 配合 waitForLoad 确保内容完全渲染。错误处理不能忽略,网络请求可能失败或超时,应该使用 try-catch 包裹并设置合理的超时时间。

Bun Webview 最适合处理轻量级的截图需求。如果需要生成社交媒体卡片、创建数据可视化图表或实现网页缩略图功能,它比启动完整的浏览器实例效率高很多。但对于需要复杂交互、Cookie 管理或多步骤操作的场景,传统的浏览器自动化工具可能更合适。

参考来源

相关文章