Skip to content

40MB 的浏览器,凭什么敢和 Chrome 掰手腕?| 旋武社区 Rust 开源项目推荐

发表于:2026-09-16
Rust 新闻

摘要

Moli 是一款用 Rust 编写的开源命令行浏览器,整个程序只有 40MB,支持 Linux、macOS 和 Windows。它把网页加载、JavaScript 执行、数据提取、截图和自动化控制全部集成在一个二进制文件里——像 curl 或 jq 一样,直接接入你的脚本、管道和 AI Agent 工作流。

抓网页、跑脚本、做自动化,一定要先装一整套 Chrome 吗?旋武社区今天推荐的这个 Rust 项目,想给你一个新答案。

先想象一个场景

你只想从 Hacker News 上抓几条新闻标题,输出成 JSON,交给下游脚本处理。

为此,你启动了 Chrome,等它加载完一堆你用不到的 UI 组件、字体、渲染管线,然后才执行你的提取逻辑。任务完成了,但你的内存也被吃掉了一大块。

这件事,本不该这么重。

Moli 是一款用 Rust 编写的开源命令行浏览器,整个程序只有 40MB,支持 Linux、macOS 和 Windows。它把网页加载、JavaScript 执行、数据提取、截图和自动化控制全部集成在一个二进制文件里——像 curljq 一样,直接接入你的脚本、管道和 AI Agent 工作流。

moli-browser-banner

核心思路:结构优先,按需生成画面

传统浏览器是为人类交互设计的:滚动、动画、页面变化,都需要随时准备呈现。为了快速更新画面,渲染管线会保留大量布局和绘制的中间缓存。 但抓取程序和 AI Agent 的需求完全不同——

  1. 提取新闻标题时,并不需要知道每个字在屏幕上的坐标。
  2. 读取表单状态时,也不一定需要先生成一张截图。

Moli 因此把“运行网页”和“生成画面”分开处理:

  • 查询 DOM、执行脚本、提取文本时,不执行真实布局和绘制
  • 需要元素位置、坐标交互或截图时,再按需启动相应计算
  • 绘制用完后,不长期保留整套绘制状态

moli_ondemand_rendering_flow

chrome-moli-focus

效果如何?内存占用仅需 Chrome 的 1/7,CPU 占用仅需 Chrome 的 2/3。

lexbench-efficiency-map-light

来源:https://github.com/lexmount/Lexbench-Headless-Browser

轻,但不弱

一个浏览器再省资源,如果目标页面打不开、脚本跑不起来,终究无法完成任务。

Moli 内置 V8 JavaScript 引擎,实现了 DOM、CSS、网络和存储等浏览器能力,支持 iframe、Worker、Cookie、WebCrypto、IndexedDB 等特性。动态内容可以生成,自动化任务可以顺利操作页面。

在项目用于验证 Agent 浏览器能力的 WPT 选定测试集中,Moli 完整运行通过了约 161 万项测试

在公开的五引擎 CDP 任务能力对比中,按 1,308 项可比网页自动化任务统计,Moli 的任务通过率为 81.9%,高于 Kitesurf 的 62.1%、Lightpanda 的 53.3% 和 Obscura 的 44.9%;作为参照的 Chrome 为 99.8%。

lexbench-five-engine-caliber-b-light

来源:https://github.com/lexmount/Lexbench-Headless-Browser

保持较低资源开销的同时,尽可能覆盖真实网页与自动化工具所需的能力——这就是 Moli 的设计取舍。

三个例子,看它怎么走进命令行

例一:在终端里渲染 Hacker News

启用布局与资源加载后,Moli 可以生成网页截图,并通过终端图片工具直接显示:

moli fetch https://news.ycombinator.com/news \
  --layout --resource \
  --dump screenshot | kitten icat

hn-screenshot

这里,网页由 Moli 加载和渲染,kitten icat 负责显示输出的图片。去掉管道,改为 > hn.png,就可以把截图保存为文件。不需要打开一个浏览器窗口。

例二:直接把新闻提取成 JSON

只需要数据时,跳过截图,在加载完成的页面中执行 JavaScript:

moli fetch --wait-until done --eval '
(() => {
  return [...document.querySelectorAll("tr.athing")]
    .slice(0, 8).map((tr, i) => {
      const a = tr.querySelector(".titleline a");
      const sub = tr.nextElementSibling;
      return {
        rank: i + 1,
        title: a?.textContent,
        href: a?.href,
        site: tr.querySelector(".sitestr")?.textContent,
        score: sub?.querySelector(".score")?.textContent,
        user: sub?.querySelector(".hnuser")?.textContent
      };
    });
})()
' https://news.ycombinator.com/ | jq

hn-jq-extract

加载网页 → 执行提取逻辑 → 输出 JSON,结果直接交给 jq 继续处理。无需为这样一个提取任务,单独搭建自动化脚本工程。

例三:渲染 Canvas 并响应交互

Moli 还能运行 HTML5 格斗游戏,涉及 Canvas 绘制、动画回调和键盘输入,并可通过 Chrome DevTools 查看运行状态。

moli-game

Chrome DevTools 是调试前端,真正执行页面脚本、响应输入并生成画面的是 Moli。

接入你已有的自动化工具

除了直接执行命令,Moli 也能作为浏览器自动化服务运行:

moli serve --layout

同一个服务端点支持 CDP、WebDriver Classic 和 WebDriver BiDi,可供 Playwright、Puppeteer、Selenium 等工具连接,不需要再额外安装 ChromeDriver 或 geckodriver

对开发者而言,可以保留熟悉的自动化工具,在现有流程中评估和引入 Moli。 对 AI Agent 而言,既可以直接调用 CLI,也可以通过浏览器控制协议完成多步骤操作。

moli-devtools-rust-lang

用 Rust 构建,也受益于 Rust 生态

Moli 复用了多项成熟的基础组件:

  • HTML 解析:html5ever
  • CSS 处理:servo/stylo
  • 布局与文本排版:taffy、parley
  • 软件渲染:anyrender、vello_cpu
  • JavaScript:deno/rusty_v8 接入 V8

Rust 在这里不仅是实现语言,也提供了组织复杂浏览器状态、表达所有权和管理资源生命周期的工具。

对于 Rust 开发者,Moli 是一个贯穿网络、DOM、脚本、布局和绘制的工程实例——既可以看到成熟生态组件如何协同工作,也可以从具体的网页兼容性问题入手参与贡献。

快速开始

访问 https://xuanwu.openatom.org/articles/project/moli 获取 Moli 二进制。

项目还提供了 Agent skills,便于 AI 智能体安装和使用,涵盖:

  • 网页抓取
  • 文字图片搜索
  • 网页自动化

写在最后

Moli 的目标是让抓取程序、自动化工具和 AI Agent 以更低的成本使用互联网:

  • 需要内容,就提取内容
  • 需要画面,再生成画面
  • 需要自动化,则用已有工具直接接入

想了解更多设计和技术细节,可以查看: https://browser.lexmount.cn/blog/moli-ai-browser

欢迎从一个网页、一段提取脚本开始体验 Moli,提交兼容性问题,或参与代码与测试贡献。

项目仓库https://xuanwu.openatom.org/articles/project/moli

如果这个项目让你眼前一亮,欢迎转发给身边做爬虫、自动化或 AI Agent 的朋友。Rust 浏览器的更多可能,我们一起探索。


旋武开源社区https://xuanwu.openatom.org

致力于在中国普及和发展 Rust 编程语言,培育中国 Rust 专家,繁荣 Rust 生态