Min Browser 是一个在 GitHub 上拥有 20,000+ Stars 的开源项目,以其快速、最小化的设计和强大的隐私保护功能而广受开发者喜爱。作为一个专注于隐私保护的浏览器,Min Browser 不仅是一个优秀的应用,更是学习 Electron 开发和浏览器架构的绝佳案例。
随着鸿蒙 PC 作为新一代操作系统的崛起,我们看到了将 Min Browser 迁移到鸿蒙平台的机会。这不仅是一次技术迁移,更是对跨平台开发理念的深入实践。
先来看一下效果
image-20251120135317755
Min Browser 是一个基于 Electron 构建的快速、最小化浏览器,专注于保护用户隐私。项目在 GitHub 上获得了大量关注:
鸿蒙 PC 作为华为推出的新一代操作系统,具有以下优势:
将成熟的 Electron 应用迁移到新平台,是一次深入理解跨平台开发的机会:
项目采用了清晰的双模块架构:
ohos_hap/
├── electron/ # Electron 应用主模块
│ ├── libs/ # 原生 C++ 库
│ │ ├── libelectron.so # Electron 核心库
│ │ ├── libadapter.so # 适配器桥接库
│ │ ├── libffmpeg.so # 多媒体支持
│ │ └── libc++_shared.so
│ └── src/main/ets/ # ArkTS 代码
│ ├── entryability/ # 各种 Ability 入口
│ └── pages/ # UI 页面
│
└── web_engine/ # Web 引擎适配层(HAR 库)
└── src/main/ets/
├── adapter/ # 40+ 系统适配器
├── jsbindings/ # JS 绑定层
├── components/ # UI 组件
└── ability/ # 基础 Ability 类
核心创新在于使用适配器模式来桥接 Electron API 和鸿蒙系统能力:
BaseAdapter应用启动后窗口正常打开,但内容为空白(白屏)。
dist/index.htmlnpm run build 生成dist/ 目录 → 白屏main.js 中的路径配置有误# 1. 确保构建产物存在
cd web_engine/src/main/resources/resfile/resources/app
npm run build
# 2. 检查 main.js 中的路径配置
# 确保路径相对于应用根目录正确
win.loadFile('dist/index.html') // ✅ 正确
win.loadFile('./dist/index.html') // ✅ 也可以
在鸿蒙 PC 上,某些 Electron 应用的窗口无法调整大小。
缺少 webPreferences 配置:
// ❌ 问题代码:缺少 webPreferences
const win = new BrowserWindow({
width: 800,
height: 600,
});
// ✅ 正确代码:包含 webPreferences
const win = new BrowserWindow({
width: 800,
height: 600,
webPreferences: {
preload: path.join(__dirname, 'preload.js'),
contextIsolation: true,
nodeIntegration: false
}
});
libadapter.so 通过检查 webPreferences 来决定窗口特性**始终配置 webPreferences**:
const { BrowserWindow } = require('electron');
const path = require('path');
function createWindow() {
const win = new BrowserWindow({
width: 800,
height: 600,
webPreferences: {
preload: path.join(__dirname, 'preload.js'),
contextIsolation: true,
nodeIntegration: false,
enableRemoteModule: false
}
});
win.loadFile('index.html');
}
在鸿蒙 PC 的 dock 栏右键菜单中,会显示"打开新窗口"选项,对于单实例应用来说是不期望的行为。
launchType 自动生成菜单项shortcuts_config.json 中定义的快捷方式多层配置 + 代码拦截:
应用级别配置(AppScope/app.json5):
{
"multiAppMode": {
"multiAppModeType": "appClone",
"maxCount": 1
}
}
Ability 级别配置(electron/src/main/module.json5):
{
"launchType": "singleton"
}
清空快捷方式配置(shortcuts_config.json):
{
"shortcuts": []
}
代码层面拦截:
WebAbilityStage.onAcceptWant() - 拦截窗口创建请求WebAbility.onNewWant() - 拦截新启动请求WebBaseAbility.onCreate() - 拦截创建请求不同平台(macOS、Windows、Linux、鸿蒙)的菜单栏显示不一致,代码中大量平台判断逻辑。
菜单栏重构:
模块化设计:
menu.js # 主入口
menuConfig.js # 配置集中管理
menuBuilder.js # 构建逻辑
统一菜单结构:
role 属性或 click 处理器实现平台差异配置与逻辑分离:
重构效果:
构建的 HAP 包体积过大(超过 600MB),影响安装和分发。
自动化清理脚本:
#!/bin/bash
# cleanup.sh
# 1. 删除 node_modules(最大问题)
rm -rf node_modules
# 2. 删除源代码目录
rm -rf src
# 3. 删除缓存文件
rm -rf .cache .parcel-cache
# 4. 删除测试文件
rm -rf test
# 5. 删除文档文件
rm -rf README.md CONTRIBUTING.md
**配置 .hvigorignore**:
# 排除不需要的文件
node_modules/
app/src/
app/package-lock.json
.cache/
.parcel-cache/
test/
优化效果:
在某些鸿蒙设备上,应用可能出现渲染问题或性能问题。
在 main.js 中禁用硬件加速:
const { app } = require('electron');
// 禁用硬件加速
app.disableHardwareAcceleration();
// 在 Chromium 层面追加命令行开关
app.commandLine.appendSwitch('disable-gpu');
libadapter.so 负责 ArkTS/ETS 代码与 C++ Electron 引擎之间的通信:
// JsBindingUtils.ets
import adapter from'libadapter.so';
exportdefaultclass JsBindingUtils {
static getNativeContext(contextType: number): NativeContext {
return adapter.getNativeContext(contextType);
}
static bindFunction(name: string, func: Function) {
this.currentContext.JSBind.bindFunction(name, func);
}
}
Electron 的渲染输出通过鸿蒙的 XComponent 组件实现:
this.xComponent.initialize({
id: this.config.moduleName,
type: XComponentType.SURFACE,
libraryname: "adapter" // 关联 libadapter.so
});
实现类似 Electron 的多进程模型:
{
"abilities": [
{
"name": "EntryAbility",
"launchType": "specified" // 主进程
},
{
"name": "BrowserAbility",
"process": ":browser" // 浏览器进程
}
]
}
功能模块 | 完成度 | 说明 |
|---|---|---|
基础浏览功能 | ✅ 100% | 页面加载、导航、历史记录 |
标签管理 | ✅ 100% | 新建、关闭、切换标签 |
任务管理 | ✅ 100% | 标签分组功能 |
书签系统 | ✅ 100% | 书签添加、管理、标签 |
搜索功能 | ✅ 100% | 全文搜索、历史搜索 |
广告拦截 | ✅ 100% | 内置广告和追踪器拦截 |
阅读模式 | ✅ 100% | 自动识别并启用阅读视图 |
深色主题 | ✅ 100% | 支持系统主题切换 |
菜单栏 | ✅ 100% | 跨平台统一菜单栏 |
单实例模式 | ✅ 100% | Dock 栏优化 |
hdc hilog 查看系统日志# 1. 克隆项目
git clone https://gitcode.com/nutpi/min_ohos.git
cd min_ohos
# 2. 安装依赖
cd web_engine/src/main/resources/resfile/resources/app
npm install
# 3. 构建应用
npm run build
# 4. 构建 HAP 包
cd ../../../../../../..
hvigor assembleHap --mode module -p module=electron@default
git checkout -b feature/AmazingFeature)git commit -m 'Add some AmazingFeature')git push origin feature/AmazingFeature)如果遇到问题或有建议,欢迎:
将 Min Browser 迁移到鸿蒙 PC 平台是一次充满挑战和收获的技术探索。在这个过程中,我们:
这个项目不仅是一个应用迁移,更是对跨平台开发理念的深入实践。它证明了通过合理的架构设计和技术选型,可以在保持应用原有特性的同时,让其在全新的平台上焕发生机。
对于想要进入鸿蒙生态的开发者,这个项目提供了一个极好的参考案例,展示了如何系统性地解决平台差异问题,实现真正的跨平台兼容。
Made with ❤️ for HarmonyOS PC
如果本教程对你有帮助,欢迎 Star ⭐ 本项目!
参考资料
[1]
https://github.com/minbrowser/min: https://github.com/minbrowser/min
[2]
https://minbrowser.org/: https://minbrowser.org/
[3]
https://gitcode.com/nutpi/min_ohos: https://gitcode.com/nutpi/min_ohos
[4]
https://github.com/minbrowser/min: https://github.com/minbrowser/min
[5]
Issue: https://gitcode.com/nutpi/min_ohos/issues