全部版块 我的主页
论坛 数据科学与人工智能 人工智能
110 0
2025-11-27

引言:桌面与全场景的交汇

在软件开发的发展历程中,每一次平台生态的革新都伴随着工具链的重新构建。过去十年间,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 平台:
  • 界面自动匹配 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
  • 屏幕旋转响应:利用系统 API 动态调整布局,确保横竖屏切换流畅
  • 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 项目的资产价值,又能顺利接入鸿蒙生态所带来更广阔的终端覆盖。

技术的意义不在于选择阵营,而在于解决实际问题。愿每位开发者都能在这场跨平台融合的浪潮中,探索出属于自己的创新之路。

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群