# 写了这么多年爬虫和自动化,每次都要装几百兆的 Puppeteer——今天 Bun 把这件事彻底原生化了
Bun v1.3.12(2026-04)内置了 Bun.WebView,一个零外部依赖的无头浏览器自动化 API。在 macOS 上不需要安装任何东西,在 Linux/Windows 上只需要系统里有 Chrome。
Puppeteer 和 Playwright 解决的问题,和没解决的成本
Puppeteer 和 Playwright 解决了”浏览器自动化”的问题——在服务器端控制一个无头浏览器,完成爬虫、截图、端到端测试。它们解决得好,但带来三个实际成本:
1. 安装体积
一个完整的 Playwright + Chromium 环境,首次安装需要下载 300~400MB 的浏览器二进制。即使用了阿里云等国内镜像,每次在新机器上初始化 CI 都要等很久。
2. 冷启动延迟
Node.js 进程里第一次 await puppeteer.launch(),即使是无头模式,也要 2~5 秒启动浏览器进程。这在需要并发跑大量小任务的场景里会成为瓶颈。
3. isTrusted 的问题
在 Puppeteer/Playwright 里用 page.click() 模拟点击,浏览器收到的事件 event.isTrusted 为 false。有些网站(尤其是银行、政务类)会检测这个标志,拒绝来自自动化工具的操作。
Bun.WebView 怎么把这件事原生化了
import { Bun } from "bun";
await using view = new Bun.WebView({ width: 800, height: 600 });
await view.navigate("https://example.com");
await view.click("a[href='/docs']"); // 自动等待元素可点击(Playwright 风格)
const title = await view.evaluate("document.title");
await Bun.write("page.png", await view.screenshot());
这四行代码完成:导航 → 点击 → 取标题 → 截图。没有任何 npm install playwright,没有任何下载浏览器二进制。
三个核心差异:
① macOS 零安装:macOS 上 Bun.WebView 默认使用系统内置的 WKWebView,不需要装 Chrome,不需要装任何依赖。一个 bun install 装好 Bun 之后立刻就能跑。
② 真实 isTrusted 输入:view.click() 和 view.scroll() 分发的是操作系统级别的真实用户输入事件,页面收到 event.isTrusted: true,和真实用户在浏览器里操作完全一致。
③ 自动等待 actionability:在点击一个元素之前,API 会等待元素已 attached、可见、stable 且未被遮挡——这是 Playwright 在 2020 年推出的最佳实践,现在成了 Bun.WebView 的内置行为,不需要手写 waitForSelector。
跨平台支持
| 平台 | 使用的后端 | 额外依赖 |
|---|---|---|
| macOS | WKWebView(系统内置) | 无 |
| Linux | Chrome DevTools Protocol | 需安装 Chrome/Chromium |
| Windows | Chrome DevTools Protocol | 预装 Edge 即可 |
在 Linux CI 环境中,如果是 Ubuntu 等常见发行版,通常已经装了 Chromium(或者一行 apt install chromium-browser 即可)。比 Playwright 下载 300MB 还是轻很多。
// 跨平台写法:传入自定义 Chrome 路径
await using view = new Bun.WebView({
executablePath: "/usr/bin/chromium-browser", // Linux 自定义路径
width: 1280,
height: 720
});
真实对比
Playwright(Node.js):
import { chromium } from 'playwright';
const browser = await chromium.launch(); // ~2-5 秒冷启动
const page = await browser.newPage();
await page.goto('https://example.com');
await page.click('a[href]'); // isTrusted = false
await page.screenshot({ path: 'screenshot.png' });
await browser.close();
Bun.WebView:
import { Bun } from "bun";
await using view = new Bun.WebView(); // 毫秒级初始化
await view.navigate('https://example.com');
await view.click('a[href]'); // isTrusted = true
await Bun.write('screenshot.png', await view.screenshot());
初始化时间从秒级降到毫秒级,isTrusted 从 false 变成 true,不需要装任何浏览器二进制。
适合的场景
Bun.WebView 不是为了替代 Playwright 的全部能力——Playwright 有 WebDriver BiDi、有移动设备模拟、有录制功能。对于这些复杂场景,Playwright 仍然是首选。
但对于这些场景,Bun.WebView 已经是更轻量的选择:
- 简单爬虫:需要登录后截图、提取页面内容
- 后台监控:定时跑页面健康检查,截图留存
- CI 里的轻量端到端:不需要完整的 Playwright 工具链,只需要验证某个按钮跳转、某个表单提交
- AI Agent 浏览器操作:Claude Code 等 Agent 直接控制浏览器做页面调试
下一步
在已安装 Bun 的环境里,跑一下上面的示例代码感受一下初始化速度。如果你的 CI 已经在跑 Bun(很多团队在用 Bun 做包管理和测试 runner),加入 Bun.WebView 做轻量浏览器自动化,不需要再装 Playwright 了。
如果你的爬虫或自动化目前依赖 Puppeteer,可以对比一下初始化时间——Bun.WebView 的毫秒级冷启动在这个场景里优势明显。
评论区
登录后可评论。