lexmount/moli · 上手攻略
- 仓库:lexmount/moli
- 链接:https://github.com/lexmount/moli
- 分类:ai
- 作者:Jay
- 更新:2026-08-12
是什么
Moli 是一个用 Rust 从零构建的浏览器引擎,专为 AI Agent 场景设计。它不依赖 Chromium,却又完整实现了 V8 JavaScript 引擎、原生 DOM、CSS 渲染、网络请求(Fetch/XHR/WebSocket)、Cookie、localStorage/IndexedDB/OPFS 等 Web 运行时。与传统浏览器自动化工具最大的区别在于:按需渲染(Layout on Demand)—— 只有当你真正需要像素或几何坐标时,才触发布局和光栅化;大多数时候,它直接读取 DOM 结构作为答案。
Moli 既是一个可独立运行的 CLI 工具,也是一个 CDP/WebDriver 自动化服务端。它的定位介于"爬虫工具"和"无头浏览器"之间,但更偏向 Agent 专用 —— 官方称之为"browser kernel"而非"Chromium wrapper",强调它是一个独立的 Rust 运行时,而非在 Chromium 外套一层壳。
底层技术栈:HTML 解析用 html5ever,JS 执行用 rusty_v8/V8,CSS 级联用 Servo/Stylo,布局用 Taffy + Parley,文字 shaping 用 Parley,软件渲染用 AnyRender/Vello + usvg,网络传输用 libcurl。官方称这套架构为"原生 DOM + Stylo integration 是唯一的 document/style owner"——每次刷新都从 DOM 重建布局状态,不存在增量布局树、damage graph 或 retained display list。
解决什么问题
主流浏览器自动化方案(如 Puppeteer、Playwright)基于 Chromium,每次实例都携带 300+ MB 的内存占用和大量进程/线程开销。而 AI Agent 的高频诉求其实是:提取页面结构、查询 DOM、执行 JavaScript、追踪网络——这些都不需要持续的视觉渲染。Moli 正是为这个场景优化:
- 提取为主:Markdown、HTML、JSON、语义文本树(semantic tree)输出,无需渲染像素
- 低资源占用:实测峰值 RSS 约 73 MiB,对比 Chromium Headless 的 773 MiB(差距约 10×)
- 快速启动:中位响应时间 33.40 ms(CDP ready),Chromium 对应 169.37 ms
- 单进程单线程:Moli = 1 process / 24 threads;Chromium = 11 processes / 123 threads
- 未来兼容:AUTO 模式自动探测 nvidia-smi 可用字段,无需硬编码字段名
快速安装
从源码构建(需要 Rust 工具链)
⚠️ 需要 Rust stable 工具链;nightly 版本偶有兼容性问题,建议
rustup default stable后再构建。
# 安装 Rust(如果还没有)
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source ~/.cargo/env
# 构建
git clone https://github.com/lexmount/moli.git
cd moli
cargo build --release -p moli
# 验证
./target/release/moli --version # (如支持,参见 --help)
下载预编译二进制
前往 Releases 页面 下载对应平台压缩包,解压后将 moli 二进制移入 PATH 即可。
⚠️ 当前最新版本请以 Releases 页为准,本攻略不硬编码版本号以避免过时引用。
Docker
# 基础版本(需 nvidia-smi 在容器内可见)
docker run -d --name moli \
-p 9222:9222 \
lexmount/moli:latest serve
# 带 GPU + 布局模式
docker run -d --name moli \
--gpus all \
-p 9222:9222 \
lexmount/moli:latest serve --layout
⚠️ Docker 运行需要 nvidia-container-toolkit 已正确安装,否则
--gpus all会失败。
核心用法
1. CLI 抓取页面(最常用)
# 提取为 Markdown(默认完成策略)
./moli fetch \
--dump markdown \
--wait-until done \
https://example.com
# 提取为语义文本树(AI 模型友好,最小 token 消耗)
./moli fetch \
--dump semantic_tree_text \
--wait-selector "#main-content" \
https://example.com
# 输出 HTML
./moli fetch \
--dump html \
--wait-until networkidle \
https://example.com
# 输出 JSON(结构化数据)
./moli fetch \
--dump json \
https://example.com
# 查看所有 dump 格式和 wait 选项
./moli fetch --help
--wait-until 支持:domcontentloaded(DOMContentLoaded 事件后即返回)/ networkidle(网络空闲后)/ done(完全加载,包括 JavaScript 执行完毕)。--wait-selector 等待特定 CSS 选择器出现再返回,比固定超时更可靠。
2. 启动自动化服务器(CDP + WebDriver)
# 基础服务(默认无几何/像素)
./moli serve
# 开启几何、坐标输入、截图、DevTools screencast
./moli serve --layout
# 同时拉取图片/字体/音视频资源(网络 IO 显著增加)
./moli serve --layout --resource
# 指定监听地址(默认 :9222)
./moli serve --listen [::1]:9222
服务启动后,同时暴露 CDP(Chrome DevTools Protocol)、WebDriver Classic 和 WebDriver BiDi 三个协议入口。Playwright 可直接通过 CDP 连接:
import { chromium } from "playwright";
const browser = await chromium.connectOverCDP("http://127.0.0.1:9222");
const context = browser.contexts()[0];
const page = context.pages()[0] ?? await context.newPage();
await page.goto("https://example.com");
// 等待元素出现再提取内容
await page.waitForSelector("article", { timeout: 10000 });
const content = await page.locator("article").innerText();
console.log(content);
// 也可以直接执行 JavaScript
const title = await page.evaluate(() => document.title);
console.log("Page title:", title);
await browser.close();
⚠️
chromium.connectOverCDP()在 Playwright 1.40+ 支持较好;老版本请先npm install playwright@latest。
3. 代理与操作控制
# 指定 HTTP/HTTPS 代理
./moli serve --proxy http://127.0.0.1:7890
# 指定 User-Agent(绕过简单的 UA 检测)
./moli serve --user-agent "Mozilla/5.0 (compatible; MyBot/1.0)"
# 开启网络追踪(抓包分析)
./moli serve --trace
# 指定 Cookie 文件(维持登录状态)
./moli serve --cookie-file ./cookies.json
# 指定 Profile 目录(隔离会话)
./moli serve --profile-dir ./moli-profile
4. 按需渲染工作流(理解 Moli 核心理念)
理解 Moli 的三层渲染策略,是用好它的关键:
| 模式 | 触发条件 | 用途 |
|---|---|---|
| 默认(Mock 几何) | 始终 | DOM 查询、JS 执行、网络追踪 |
--layout(OnDemand 几何) |
显式开启 | 坐标输入、截图、hit-testing |
--resource(全量资源) |
配合 --layout |
截图含图片/字体/视频 |
Agent 请求 → Moli 默认行为
─────────────────────────────────
DOM 查询 / JS 执行 / 网络追踪 → 直接读浏览器运行时(无布局/绘制)
读元素几何(box) → 触发单次 layout pass,保留最新快照
截屏 / screencast → 从当前 DOM/style 重建一帧,渲染后丢弃
典型适用场景
| 场景 | 推荐用法 |
|---|---|
| AI Agent 网页内容提取(喂 LLM) | moli fetch --dump semantic_tree_text --wait-until done |
| 浏览器自动化脚本(替代 Puppeteer) | moli serve + Playwright CDP 连接 |
| 低资源爬虫(内存受限环境) | moli fetch --dump markdown 批量 |
| Agent 评测环境(需 DOM + 几何信息) | moli serve --layout + CDP |
| 需要 JavaScript 渲染后才可读内容的页面 | --wait-selector 等待或 --wait-until done |
| 游戏/视觉类 Agent(需要截图) | moli serve --layout --resource |
坑与注意
- 不支持 GUI:Moli 没有可视界面,无法用于需要人眼确认的调试。
--layout模式的截图/DevTools 用于程序化读取,不做持续渲染保留。 - WPT 测试范围有限:官方 WPT 1.612M 测试通过,但覆盖范围限于"Agent 浏览器核心功能"。对复杂 CSS3 动画、CSP 严格站点(如银行/政务)、非标准 Web API 等兼容性可能弱于 Chromium。建议在高要求的站点上先做真实环境测试。
- Playwright 版本兼容性:
chromium.connectOverCDP()在 Playwright 1.40+ 稳定;老版本建议升级后再使用。 - Windows 支持状态:README 未明确标注 Windows 兼容性验证,Docker 部署在 Linux/macOS 更稳妥;如在 Windows 上直接运行二进制,遇到问题建议优先通过 Docker 绕行。
- GPU 加速(弱点):Moli 使用纯 CPU 软件渲染(AnyRender/Vello + usvg),不支持 GPU 加速光栅化。复杂页面截图性能显著弱于 Chromium。对于需要高频截图的 Agent 场景(如 UI 自动化评测),Chromium 生态仍是首选。
- 不提供 GPU 指标导出:Moli 不调用 nvidia-smi,不提供 GPU 利用率/显存监控。如需该功能请搭配
utkuozdemir/nvidia_gpu_exporter。 - 当前最新版本请以 Releases 页为准:本攻略不硬编码版本号以避免过时引用。
与同类对比
| 项目 | 语言 | 内存峰值 | 进程/线程 | JS 引擎 | GPU 加速 | 主要用途 |
|---|---|---|---|---|---|---|
| Moli | Rust | ~73 MiB | 1/24 | V8(内置) | ❌ | Agent 专用浏览器 |
| Chromium Headless | C++ | ~773 MiB | 11/123 | V8 | ✅ | 通用自动化 |
| Playwright(Chromium) | TypeScript | ~500-800 MiB | 多进程 | V8 | ✅ | Web 测试/爬虫 |
| Puppeteer | Node.js | ~300-600 MiB | 多进程 | V8 | ✅ | Web 爬虫/截图 |
| Selenium | 多语言 | ~200-400 MiB | 多进程 | V8(CDP) | ✅ | 跨浏览器测试 |
| Lightpanda | Rust | ~40 MiB | — | — | — | 轻量浏览器(已停更) |
Moli 的核心优势是资源效率 + Agent 友好的结构化输出,劣势是生态(Playwright 有丰富配套库)和全量 Web 兼容性。在资源受限或大规模并发的 Agent 场景中,Moli 优势明显;在需要精确像素级截图或复杂 CSS 兼容的场景,Chromium 生态更稳。
一句话推荐结论
如果你在构建 AI Agent 需要频繁操作网页(抓取内容、填写表单、执行 JavaScript),Moli 是目前资源效率最高的专用方案,Rust 实现带来了远低于 Chromium 的内存占用;在对全量 Web 兼容性或高频截图有强需求的场景,继续用 Chromium 生态更稳妥。
原始 commit/PR:https://github.com/lexmount/moli/commits/main · Releases · ⚠️ NVML 后端为 experimental;WPT 测试覆盖 Agent 核心范围,复杂 CSS3 / 严格 CSP 站点兼容性建议实测后使用