引言:桌面与全场景的交汇
在软件开发的发展历程中,每一次平台生态的革新都伴随着工具链的重新构建。过去十年间,Electron 凭借“使用 Web 技术开发桌面应用”的理念,成功推动了 VS Code、Discord 和 Slack 等重量级产品走向全球用户,成为跨平台桌面开发的实际标准。与此同时,随着华为鸿蒙操作系统(HarmonyOS)的迅速发展,“一次开发,多端部署”的全场景战略正在深刻影响移动设备与物联网领域的开发模式。
然而,不少开发者存在一种误解,认为 Electron 与鸿蒙是相互排斥的技术路线。事实上,两者在技术架构、目标终端和适用场景上具备显著的互补性。本文将打破非此即彼的对比逻辑,从能力整合、资源共享以及渐进式迁移三个角度出发,探讨如何实现 Electron 成熟生态与鸿蒙分布式特性的协同运作,从而打造真正覆盖所有终端形态的“全端应用”体系。
设想一家初创企业已经基于 Electron 构建了一套功能完整的桌面数据可视化系统,现在客户提出需要在手机和智能手表上也能访问相同功能。若为每个平台独立重写代码,开发成本将急剧上升;而若强行采用 React Native 或 Flutter 统一所有端口,则可能牺牲桌面端的操作体验与性能表现。
在这种背景下,保留 Electron 打造的高效桌面端,同时将核心业务逻辑复用于鸿蒙移动端,成为更具性价比的选择。
无论是 Electron 的渲染进程,还是鸿蒙系统内置的 Web 组件,其底层均依赖于 HTML、CSS 与 JavaScript 技术栈。这意味着:
通过统一前端技术路径,可大幅降低多端维护的复杂度与人力投入。
尽管 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 编辑器,现需将其核心编辑能力接入鸿蒙手机应用。
原始 Electron 工程目录结构如下所示:
electron-md-editor/
├── main.js // 主进程
├── package.json
└── src/
├── index.html // 渲染入口
├── styles/
│ └── editor.css
├── scripts/
│ └── editor.js // 核心逻辑:解析、预览、导出等
└── assets/
└── logo.png
我们的目标是将其中的核心前端资源文件夹:
src/
打包为静态资产,供鸿蒙端调用使用。
使用 DevEco Studio 4.1 及以上版本创建新项目,选择模板路径为 “Application > Empty Ability”。
编程语言选择 ArkTS,设备类型勾选“Phone”即可。
将上述
src/
目录整体复制到鸿蒙项目的指定资源路径下:
harmony-md-app/
└── resources/
└── rawfile/
└── webapp/
├── index.html
├── styles/editor.css
├── scripts/editor.js
└── assets/logo.png
提示:在鸿蒙系统中,存放在
rawfile
目录中的资源可通过
local://
协议进行访问,适合作为本地 Web 内容加载源。
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');
在 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
electron.dialog.showSaveDialog
NSFileManager
当用户点击“保存”,会调用鸿蒙提供的原生模块进行处理:
@ohos.promptAction
import promptAction from '@ohos.promptAction';
promptAction.showToast({
message: '文件已保存至系统默认目录',
duration: 2000
});
其他关键功能也进行了针对性优化:
backPress
orientation
注意:实际性能可能受设备型号、系统版本等因素影响,建议开发阶段进行多机型真机测试以保障兼容性。
仅仅依赖 Web 容器无法实现深度整合,真正的跨平台融合需要实现能力的双向互通。
除了基础的保存接口外,还可进一步扩展更多系统能力暴露给前端:
// 在鸿蒙端注册更多可供 Web 调用的方法
saveContent
this.controller.registerJavaScriptProxy({
shareToWeChat: (text: string) => {
// 调用鸿蒙分享框架
},
requestLocation: () => {
// 调用 @ohos:location
return '39.9042° N, 116.4074° E';
}
}, 'HarmonyBridge');
initApp()
可在应用启动阶段通过页面加载完成事件传递关键信息,例如用户 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 与鸿蒙端始终共用同一份前端代码基,降低版本差异带来的维护成本。
启用鸿蒙 Web 组件的硬件加速能力以提升渲染性能:
.webDebuggingAccess(true)
(仅用于调试环境)
针对高频交互区域(如导航栏、手势响应等),逐步使用 ArkTS 原生组件替代原有 Web 实现,仅将核心业务逻辑保留在 Web 视图中。示例如下:
Column() {
// 使用原生自定义导航栏
CustomNavigationBar({ title: '编辑器' })
// Web 承载主体内容
Web({ src: 'local://webapp/editor-body.html' })
}
随着鸿蒙 NEXT 的全面推行——彻底脱离 APK 兼容、采用全自研内核,以及 Electron 社区在轻量化方向上的持续探索(如 Electron Lite、WebContainer 等新兴技术),我们可以预见以下趋势:
Electron 代表了桌面时代的集大成成果,鸿蒙则开启了全场景智慧生态的新篇章。二者并非相互取代的关系,而是技术演进过程中的协同者。
借助 Web 容器这一桥梁,开发者既能延续现有 Electron 项目的资产价值,又能顺利接入鸿蒙生态所带来更广阔的终端覆盖。
技术的意义不在于选择阵营,而在于解决实际问题。愿每位开发者都能在这场跨平台融合的浪潮中,探索出属于自己的创新之路。
扫码加好友,拉您进群



收藏
