一个用 Rust + 原生 Win32 UI + WebView2 构建的极简内存多标签浏览器。 设计目标:以最小的内存占用,提供现代浏览器的核心能力(多标签、书签、账号同步、阅读模式)。
实测内存占用(Windows,Edge WebView2 Runtime 150,1280×860 窗口):
| 版本 | 进程数 | 总内存 |
|---|---|---|
| 初始版本(chrome UI 为独立 WebView2) | 8 | ~500 MB |
| 阶段一(原生 chrome UI + 共享环境) | 3 | ~290 MB |
| 阶段二(自定义环境 + 工作集压缩) | 2–3 | ~25 MB |
优化细节与测量方法见 docs/MEMORY_OPTIMIZATION.md。
- 多标签浏览:新建(Ctrl+T)、关闭(Ctrl+W)、点击切换
- 地址栏:Ctrl+L 聚焦,回车导航;自动补全
https://,纯文字走 Bing 搜索 - 导航:后退 / 前进 / 刷新(F5)/ 主页(Alt+←/→ 前进后退)
- 书签:星标添加/移除、书签栏快速打开与删除,服务端持久化(需登录)
- 账号:注册 / 登录,token 本地保存,下次启动自动恢复会话
- 阅读模式:服务端抓取页面并提取正文,无 JS、极简 DOM,省内存且护眼
- 深色 / 浅色主题一键切换
- 新标签页:时钟、问候语、搜索框、快捷链接(纯静态,无重特效)
- 浏览器 chrome(标签栏/导航栏/书签栏/登录栏)为原生 Win32 GDI 绘制,不占用任何 WebView 实例
┌────────────────────────── mini-browser.exe (Rust) ──────────────────────────┐
│ tao 事件循环 │
│ ┌─────────────────────────┐ ┌────────────────────────────────────────┐ │
│ │ src/ui.rs │ │ src/main.rs │ │
│ │ 原生 GDI chrome UI │ │ 标签管理 / 事件分发 / │ │
│ │ 标签栏·导航栏·书签·登录 │◄───┤ WebView2 环境创建 / 工作集压缩 │ │
│ └─────────────────────────┘ └──────────────┬─────────────────────────┘ │
│ │ wry (子 HWND) │
│ ┌─────────────────────────┐ ▼ │
│ │ src/api.rs │ 共享 ICoreWebView2Environment │
│ │ 阻塞式 HTTP 客户端 │ (--single-process,无 GPU/crashpad) │ │
│ └───────────┬─────────────┘ ▼ │
└──────────────┼─────────────────── msedgewebview2.exe(承载全部标签)────────┘
▼
Node 本地服务 (localhost:3210)
/api/login /api/register /api/bookmarks /read
关键设计:
- chrome UI 不是网页:标签栏、导航栏、书签栏、登录栏全部用 Win32 GDI 原生绘制(
src/ui.rs),相比"用网页做 UI"直接省掉一整个 WebView2 实例(约 100MB+)。 - 所有标签共享同一个 WebView2 环境,并以
--single-process运行:整个浏览器只有一个 browser 进程,无独立 renderer/GPU/crashpad 进程。 - 工作集压缩器:在页面加载完成、最小化、以及每 60 秒,把各进程工作集归还给操作系统(
EmptyWorkingSet),Task Manager 可见内存长期保持在 ~25MB。
mini_browser/
├─ src/
│ ├─ main.rs # 入口:事件循环、标签、WebView2 环境、工作集压缩
│ ├─ ui.rs # 原生 GDI chrome UI(标签栏/导航栏/书签栏/登录栏/主题)
│ ├─ api.rs # 本地服务 HTTP 客户端(登录/书签)
│ ├─ start.html # 新标签页(纯静态、无 blur 特效)
│ └─ chrome.html # 旧版网页 chrome UI(经 server /chrome 提供)
├─ server/
│ └─ server.js # Node.js 本地服务:账号/书签/阅读模式
├─ MiniBrowser/ # C# (WinForms + WebView2) 平行实现
├─ docs/
│ └─ MEMORY_OPTIMIZATION.md # 内存优化详解与实测数据
├─ Cargo.toml # 依赖与 release 极致瘦身配置
└─ .cargo/config.toml
- Rust toolchain(edition 2024)
- MSVC Build Tools(需要链接器与 Windows SDK 库)
- WebView2 Runtime(Windows 10/11 一般已自带)
- Node.js 18+(本地服务用到全局
fetch)
若不在 "Developer Prompt" 中,先为链接器设置 MSVC 环境(路径按本机版本调整):
$base = "C:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools\VC\Tools\MSVC\14.44.35207"
$sdk = "C:\Program Files (x86)\Windows Kits\10\Lib\10.0.26100.0"
$env:PATH = "$base\bin\Hostx64\x64;" + $env:PATH
$env:LIB = "$base\lib\x64;$sdk\ucrt\x64;$sdk\um\x64"
cargo build --release产物为 target\release\mini-browser.exe(约 0.6MB:opt-level=z + LTO + strip + panic=abort)。
构建报 "os error 5"(文件占用)时,先关闭正在运行的 mini-browser。
node server/server.js # → http://localhost:3210账号与书签数据保存在 server/data/db.json。
target\release\mini-browser.exe浏览器侧数据位于 %APPDATA%\MiniBrowser\(登录 token、WebView2 用户数据目录)。
| 操作 | 方式 |
|---|---|
| 新建标签 | Ctrl+T 或 "+" 按钮 |
| 关闭当前标签 | Ctrl+W 或标签上的 × |
| 聚焦地址栏 | Ctrl+L |
| 刷新 | F5 |
| 后退 / 前进 | Alt+← / Alt+→ |
| 书签栏 | 星标按钮 / 工具栏书签按钮 |
| 登录 / 注册 | 账号按钮(未登录点星标会弹出登录栏) |
| 阅读模式 | 导航栏阅读按钮(针对当前页 URL) |
| 主题切换 | 工具栏主题按钮 |
地址栏规则:含 . 且无空格 → 视为域名并补 https://;否则视为关键词走 Bing 搜索。
基地址 http://localhost:3210,客户端实现见 src/api.rs。
| 方法 | 路径 | 说明 |
|---|---|---|
| POST | /api/register |
注册 {username,password} → {token,username} |
| POST | /api/login |
登录,返回同上 |
| GET | /api/bookmarks |
获取书签列表(Bearer token) |
| POST | /api/bookmarks |
添加书签 {title,url} |
| DELETE | /api/bookmarks |
删除书签 {url} |
| PUT | /api/bookmarks |
更新书签 |
| GET | /read?url=... |
阅读模式:抓取并提取正文,返回精简 HTML |
| GET | /chrome |
旧版网页 chrome UI |
token 为 base64url 编码的 JSON(含过期时间 e 与用户名 u),客户端可离线解出用户名。
- docs/MEMORY_OPTIMIZATION.md — 内存优化完整记录:每项改动的原理、位置、实测收益与代价
MiniBrowser/— C# (WinForms + WebView2) 平行实现,可对照参考