# 写了这么多年爬虫和自动化,每次都要装几百兆的 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 的毫秒级冷启动在这个场景里优势明显。

评论区

0 条评论

登录后可评论。

铁锈·Rust工具链 24 阅读