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

坑与注意

  1. 不支持 GUI:Moli 没有可视界面,无法用于需要人眼确认的调试。--layout 模式的截图/DevTools 用于程序化读取,不做持续渲染保留。
  2. WPT 测试范围有限:官方 WPT 1.612M 测试通过,但覆盖范围限于"Agent 浏览器核心功能"。对复杂 CSS3 动画、CSP 严格站点(如银行/政务)、非标准 Web API 等兼容性可能弱于 Chromium。建议在高要求的站点上先做真实环境测试。
  3. Playwright 版本兼容性chromium.connectOverCDP() 在 Playwright 1.40+ 稳定;老版本建议升级后再使用。
  4. Windows 支持状态:README 未明确标注 Windows 兼容性验证,Docker 部署在 Linux/macOS 更稳妥;如在 Windows 上直接运行二进制,遇到问题建议优先通过 Docker 绕行。
  5. GPU 加速(弱点):Moli 使用纯 CPU 软件渲染(AnyRender/Vello + usvg),不支持 GPU 加速光栅化。复杂页面截图性能显著弱于 Chromium。对于需要高频截图的 Agent 场景(如 UI 自动化评测),Chromium 生态仍是首选。
  6. 不提供 GPU 指标导出:Moli 不调用 nvidia-smi,不提供 GPU 利用率/显存监控。如需该功能请搭配 utkuozdemir/nvidia_gpu_exporter
  7. 当前最新版本请以 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 站点兼容性建议实测后使用