Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

4 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

MiniBrowser

一个用 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 搜索。

本地服务 API

基地址 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) 平行实现,可对照参考

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages