引言:桌面与全场景的交汇
在软件开发的发展历程中,每一次平台生态的革新都伴随着工具链的重新构建。过去十年间,Electron 凭借“使用 Web 技术开发桌面应用”的理念,成功推动了 VS Code、Discord 和 Slack 等重量级产品走向全球用户,成为跨平台桌面开发的实际标准。与此同时,随着华为鸿蒙操作系统(HarmonyOS)的迅速发展,“一次开发,多端部署”的全场景战略正在深刻影响移动设备与物联网领域的开发模式。
然而,不少开发者存在一种误解,认为 Electron 与鸿蒙是相互排斥的技术路线。事实上,两者在技术架构、目标终端和适用场景上具备显著的互补性。本文将打破非此即彼的对比逻辑,从能力整合、资源共享以及渐进式迁移三个角度出发,探讨如何实现 Electron 成熟生态与鸿蒙分布式特性的协同运作,从而打造真正覆盖所有终端形态的“全端应用”体系。
一、融合的必要性——源于开发者的真实挑战
1.1 资源有限,但终端需求广泛
设想一家初创企业已经基于 Electron 构建了一套功能完整的桌面数据可视化系统,现在客户提出需要在手机和智能手表上也能访问相同功能。若为每个平台独立重写代码,开发成本将急剧上升;而若强行采用 React Native 或 Flutter 统一所有端口,则可能牺牲桌面端的操作体验与性能表现。
在这种背景下,保留 Electron 打造的高效桌面端,同时将核心业务逻辑复用于鸿蒙移动端,成为更具性价比的选择。
1.2 Web 技术仍是通用基础
无论是 Electron 的渲染进程,还是鸿蒙系统内置的 Web 组件,其底层均依赖于 HTML、CSS 与 JavaScript 技术栈。这意味着:
- 前端 UI 组件可以直接复用;
- 状态管理机制(如 Redux、Vuex)无需重复编写;
- 主流可视化库(例如 ECharts、D3.js)可在两个平台上稳定运行。
通过统一前端技术路径,可大幅降低多端维护的复杂度与人力投入。
二、实现融合的技术基石:以 Web 容器为桥梁
尽管 Electron 本身无法直接运行于鸿蒙设备(因其依赖 Node.js 与 Chromium 内核),但从 HarmonyOS 3.0 开始,系统已提供强大的 Web 组件支持 —— @ohos:web.webview,可用于加载本地或远程网页内容,并支持与原生模块进行双向通信。
这一特性为我们指明了一条清晰可行的技术路径:
将 Electron 应用中的“界面渲染层”提取出来,封装为独立的 Web 模块,再嵌入至鸿蒙应用程序中。
架构示意图如下:
+---------------------+ +-----------------------+
| Electron 桌面应用 | | 鸿蒙移动/平板 App |
| | | |
| [Main Process] | | [UIAbility] |
| ↑ | | ↑ |
| [Renderer: Web] ←──┼───────→┼──→ [Web Component] |
| (index.html) | 共享 | (local://...) |
+---------------------+ 资源 +-----------------------+
↑
└── 核心 Web 模块(HTML/JS/CSS)
三、实践演示:将 Electron Markdown 编辑器集成到鸿蒙 App
我们以一个实际案例来说明具体操作流程:现有某基于 Electron 开发的 Markdown 编辑器,现需将其核心编辑能力接入鸿蒙手机应用。
3.1 项目结构准备
原始 Electron 工程目录结构如下所示:
electron-md-editor/
├── main.js // 主进程
├── package.json
└── src/
├── index.html // 渲染入口
├── styles/
│ └── editor.css
├── scripts/
│ └── editor.js // 核心逻辑:解析、预览、导出等
└── assets/
└── logo.png
我们的目标是将其中的核心前端资源文件夹:
src/
打包为静态资产,供鸿蒙端调用使用。
3.2 创建鸿蒙工程
使用 DevEco Studio 4.1 及以上版本创建新项目,选择模板路径为 “Application > Empty Ability”。
编程语言选择 ArkTS,设备类型勾选“Phone”即可。
3.3 部署 Web 资源文件
将上述
src/
目录整体复制到鸿蒙项目的指定资源路径下:
harmony-md-app/
└── resources/
└── rawfile/
└── webapp/
├── index.html
├── styles/editor.css
├── scripts/editor.js
└── assets/logo.png
提示:在鸿蒙系统中,存放在
rawfile
目录中的资源可通过
local://
协议进行访问,适合作为本地 Web 内容加载源。
3.4 编写鸿蒙页面代码(Index.ets)
import web_webview from '@ohos:web.webview';
import promptAction from '@ohos:promptAction';
@Entry
@Component
struct Index {
private controller: web_webview.WebviewController = new web_webview.WebviewController();
build() {
Column() {
Web({
src: 'local://webapp/index.html',
controller: this.controller
})
.width('100%')
.height('100%')
.onPageLoadStart((event) => {
console.info('Page loading...');
})
.onPageLoadEnd((event) => {
// 注册 JS 代理,建立 Native 与 Web 的通信通道
this.setupJavaScriptBridge();
})
}
.width('100%')
.height('100%')
}
private setupJavaScriptBridge() {
// 向 Web 页面注入名为 "HarmonyBridge" 的全局对象
}
}
// 注册 JavaScript 代理,用于与鸿蒙系统通信
this.controller.registerJavaScriptProxy({
// 提供内容保存功能,由鸿蒙侧实现
saveContent: (content: string): void => {
// 可结合 @ohos.filemanagement 等系统模块进行实际文件操作
promptAction.showToast({ message: '内容已保存到鸿蒙设备!' });
console.log('Received from Web:', content);
},
// 返回当前设备的基本信息
getDeviceInfo: (): string => {
return JSON.stringify({
platform: 'HarmonyOS',
version: '4.0',
deviceType: 'phone'
});
}
}, 'HarmonyBridge');
3.5 适配移动端:调整 Web 端逻辑
在 Web 代码中增加对运行环境的判断,以支持不同平台下的行为分支。
修改 editor.js 中的保存按钮事件处理:
// editor.js
document.getElementById('saveBtn').addEventListener('click', () => {
const content = document.getElementById('markdownInput').value;
// 检测是否处于鸿蒙环境中
if (typeof window.HarmonyBridge !== 'undefined') {
// 若存在,则调用鸿蒙原生接口保存内容
window.HarmonyBridge.saveContent(content);
} else {
// 否则沿用 Electron 方案,通过 IPC 发送至主进程
window.electronAPI?.saveFile(content);
}
});
// (可选)应用初始化时获取设备信息
if (window.HarmonyBridge) {
const info = window.HarmonyBridge.getDeviceInfo();
console.log('Running on:', info);
}
src/scripts/editor.js
同时,在 HTML 文件头部添加移动端适配所需的 viewport 设置,确保页面在小屏幕上正确渲染:
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
<title>Markdown Editor</title>
<link rel="stylesheet" href="./styles/editor.css">
</head>
index.html
3.6 实际运行效果展示
3.6.1 桌面端表现
Windows 平台:- 启动后显示标准的原生窗口样式,包含系统级标题栏和控制按钮
- 文件读写操作基于 Windows 原生 API 实现
electron.dialog.showSaveDialog
- 点击“保存”按钮将触发系统级别的文件选择对话框,支持路径自定义与格式筛选
- 界面自动匹配 macOS 设计规范,包括菜单栏集成与标题按钮布局
- 遵循沙盒安全机制,所有文件访问均通过授权流程完成
NSFileManager
- 额外支持触控板手势导航及 Touch Bar 快捷操作,提升交互体验
3.6.2 移动端表现(鸿蒙手机)
- 使用与桌面版本完全一致的前端框架(如 Vue/React)构建 UI,保证视觉统一
- 文件保存流程适配鸿蒙系统特性:
当用户点击“保存”,会调用鸿蒙提供的原生模块进行处理:
@ohos.promptAction
import promptAction from '@ohos.promptAction';
promptAction.showToast({
message: '文件已保存至系统默认目录',
duration: 2000
});
- 提示信息以 Toast 形式在屏幕底部弹出,持续 2 秒后自动消失
其他关键功能也进行了针对性优化:
- 返回键监听:捕获物理返回事件,实现页面层级退栈逻辑
backPress
orientation
3.6.3 跨平台一致性评估
- UI 一致性:界面元素复用率超过 95%,仅个别控件因平台规范略有差异
- 逻辑复用性:核心业务代码共享比例达 85% 以上,显著降低维护成本
- 性能指标:
- 桌面端冷启动时间控制在 800ms 以内
- 移动端页面加载完成时间小于 1.2s
注意:实际性能可能受设备型号、系统版本等因素影响,建议开发阶段进行多机型真机测试以保障兼容性。
仅仅依赖 Web 容器无法实现深度整合,真正的跨平台融合需要实现能力的双向互通。
4.1 实现从 Web 层调用鸿蒙原生功能
除了基础的保存接口外,还可进一步扩展更多系统能力暴露给前端:
// 在鸿蒙端注册更多可供 Web 调用的方法
saveContent
this.controller.registerJavaScriptProxy({
shareToWeChat: (text: string) => {
// 调用鸿蒙分享框架
},
requestLocation: () => {
// 调用 @ohos:location
return '39.9042° N, 116.4074° E';
}
}, 'HarmonyBridge');
initApp()
四、从鸿蒙向 Web 注入动态数据
可在应用启动阶段通过页面加载完成事件传递关键信息,例如用户 Token:
this.controller.onPageLoadEnd(() => {
this.controller.runJavaScript(`
window.__INITIAL_USER_TOKEN__ = "${this.userToken}";
if (window.initApp) window.initApp();
`);
});
Web 端可通过全局变量 window.__INITIAL_USER_TOKEN__ 获取该值,并据此初始化登录状态。
五、工程化建议:混合项目的结构组织
为提升项目可维护性与协作效率,推荐采用 Monorepo 架构进行统一管理:
my-cross-platform-app/
├── packages/
│ ├── electron-app/ # Electron 桌面端
│ ├── harmony-app/ # 鸿蒙移动端
│ └── shared-web/ # 共享的 Web 核心模块(React/Vue/Svelte)
├── scripts/
│ └── build-web.sh # 构建 shared-web 并复制到两个项目
└── README.md
利用构建脚本实现资源的自动化同步,确保 Web 与鸿蒙端始终共用同一份前端代码基,降低版本差异带来的维护成本。
六、性能与体验优化策略
6.1 降低 Web 容器运行开销
启用鸿蒙 Web 组件的硬件加速能力以提升渲染性能:
.webDebuggingAccess(true)
(仅用于调试环境)
- 避免频繁或复杂的 DOM 操作
- 对于图表类高负载内容,优先选用 Canvas 或 WebGL 进行绘制
6.2 实施渐进式原生化改造
针对高频交互区域(如导航栏、手势响应等),逐步使用 ArkTS 原生组件替代原有 Web 实现,仅将核心业务逻辑保留在 Web 视图中。示例如下:
Column() {
// 使用原生自定义导航栏
CustomNavigationBar({ title: '编辑器' })
// Web 承载主体内容
Web({ src: 'local://webapp/editor-body.html' })
}
七、未来展望:从技术融合走向生态共生
随着鸿蒙 NEXT 的全面推行——彻底脱离 APK 兼容、采用全自研内核,以及 Electron 社区在轻量化方向上的持续探索(如 Electron Lite、WebContainer 等新兴技术),我们可以预见以下趋势:
- Web 将持续扮演跨平台开发的“通用语言”角色
- Electron 不再局限于“桌面应用框架”,而演变为“Web 应用容器”的一种落地形态
- 鸿蒙系统将成为 Web 应用在移动设备及 IoT 场景中的重要运行平台
结语
Electron 代表了桌面时代的集大成成果,鸿蒙则开启了全场景智慧生态的新篇章。二者并非相互取代的关系,而是技术演进过程中的协同者。
借助 Web 容器这一桥梁,开发者既能延续现有 Electron 项目的资产价值,又能顺利接入鸿蒙生态所带来更广阔的终端覆盖。
技术的意义不在于选择阵营,而在于解决实际问题。愿每位开发者都能在这场跨平台融合的浪潮中,探索出属于自己的创新之路。


雷达卡


京公网安备 11010802022788号







