1. 鸿蒙与 Electron 的定位对比

特性 HarmonyOS(鸿蒙) Electron
运行平台 手机、手表、车机、智慧屏等 Windows、macOS、Linux 桌面
核心技术栈 ArkTS、JavaScript、Stage 模型 Node.js + Chromium + HTML/CSS/JS
UI 渲染引擎 ArkUI(声明式) Blink(Chromium 内核)
网络通信能力 强(支持分布式软总线) 强(全量 Node API)
本地系统调用 设备级权限管理 高权限(可访问文件系统、注册表等)
是否支持 Webview 嵌入 ✅ 支持 Web 组件加载网页 ✅ 可嵌入任意网页或本地页面

📌 结论:两者不是替代关系,而是生态互补。鸿蒙擅长移动与 IoT 端,Electron 擅长桌面端。


2. 为什么不能直接“运行鸿蒙在 Electron”?

很多初学者会问:“能不能把鸿蒙的 .hap 包扔进 Electron 运行?” 答案是:❌ 不能

❌ 技术障碍:

  • 运行时不同

    • 鸿蒙应用依赖 ArkTS RuntimeAbility Framework
    • Electron 是基于 Node.js + Chromium 的浏览器环境
  • UI 架构不兼容

    • 鸿蒙使用 ArkUI 渲染原生组件
    • Electron 使用 DOM + CSS 渲染 Web 页面
  • 设备服务能力隔离

    • 鸿蒙的 @ohos.* 接口无法在 Electron 中调用

💡 正确思路:不要试图“运行鸿蒙在 Electron”,而应通过“通信协作”实现功能联动


3. 真正的协同模式:前后端分离 + 分布式通信

我们可以将整个系统拆解为:
±-----------------+ WebSocket / HTTP ±--------------------+ | 鸿蒙手机端 | ----------------------------> | Electron 桌面端 | | (ArkTS + UI) | <---------------------------- | (Node.js + Browser) | ±-----------------+ 指令/数据/状态同步 ±--------------------+

✅ 协同方式推荐:

方式 说明 推荐指数
WebSocket 实时通信 双向、低延迟,适合控制类场景 ⭐️⭐️⭐️⭐️⭐️
HTTP REST API 简单请求,适合状态查询 ⭐️⭐️⭐️⭐️
MQTT 消息队列 多设备广播,IoT 场景适用 ⭐️⭐️⭐️⭐️
局域网 UDP 广播 快速发现设备,配合使用 ⭐️⭐️⭐️

本文选择 WebSocket 实现“手机遥控桌面应用”。


4. 实战案例:鸿蒙手机控制 Electron 桌面应用

🎯 功能目标

使用鸿蒙手机 App 控制 Electron 桌面应用的窗口背景颜色,并实时回传当前状态。

🔧 技术栈

  • 鸿蒙端:ArkTS + OpenHarmony 4.1 + websocket 模块
  • Electron 端:Electron 28 + Node.js 20 + ws
  • 通信协议:自定义 JSON 消息格式

5. 核心代码解析

✅ 5.1 Electron 主进程(启动 WebSocket 服务)

// electron-main.ts
import { app, BrowserWindow, ipcMain } from 'electron';
import * as path from 'path';
import WebSocket from 'ws';

let mainWindow: BrowserWindow | null = null;
let wsServer: WebSocket.Server;

function createWindow() {
  mainWindow = new BrowserWindow({
    width: 800,
    height: 600,
    webPreferences: {
      preload: path.join(__dirname, 'preload.js'),
      nodeIntegration: false,
    },
  });

  mainWindow.loadFile('index.html');
}

app.whenReady().then(() => {
  createWindow();

  // 启动 WebSocket 服务器,监听 8080
  wsServer = new WebSocket.Server({ port: 8080 });
  console.log('✅ WebSocket 服务器已启动,端口:8080');

  wsServer.on('connection', (socket) => {
    console.log('📱 鸿蒙设备已连接');

    // 发送当前状态
    if (mainWindow) {
      const color = mainWindow.webContents.executeJavaScript('document.body.style.backgroundColor');
      socket.send(JSON.stringify({ type: 'status', color: color || '#ffffff' }));
    }

    socket.on('message', (data) => {
      const msg = JSON.parse(data.toString());
      if (msg.type === 'setColor' && mainWindow) {
        console.log(`🎨 设置背景色:${msg.color}`);
        mainWindow.webContents.send('update-color', msg.color);
      }
    });

    socket.on('close', () => {
      console.log('📱 设备断开连接');
    });
  });

  app.on('activate', () => {
    if (BrowserWindow.getAllWindows().length === 0) createWindow();
  });
});

app.on('window-all-closed', () => {
  if (process.platform !== 'darwin') app.quit();
});															

✅ 5.2 Electron 渲染进程(接收指令并更新 UI)

<!-- index.html -->
<!DOCTYPE html>
<html>
<head><title>鸿蒙控制台</title></head>
<body style="background: #fff; margin: 0; transition: background 0.3s;">
  <div style="text-align: center; padding: 50px; color: #333;">
    <h1>🖥️ Electron 桌面端</h1>
    <p id="status">等待鸿蒙设备连接...</p>
  </div>
  <script>
    window.addEventListener('DOMContentLoaded', () => {
      const statusEl = document.getElementById('status');
      
      // 接收主进程发来的颜色更新
      window.electronAPI?.onUpdateColor((color) => {
        document.body.style.backgroundColor = color;
        statusEl.textContent = `背景色已更新为:${color}`;
      });
    });
  </script>
</body>
</html>

/ preload.js

const { contextBridge, ipcRenderer } = require(‘electron’);

contextBridge.exposeInMainWorld(‘electronAPI’, {
onUpdateColor: (callback) => ipcRenderer.on(‘update-color’, (_, color) => callback(color))
});
✅ 5.3 鸿蒙端:ArkTS 发送控制指令
// pages/ControlPage.ets
@Entry
@Component
struct ControlPage {
@State connected: boolean = false;
@State currentColor: string = ‘#ffffff’;

build() {
Column() {
Text(this.connected ? ‘🟢 已连接桌面端’ : ‘🔴 未连接’)
.fontSize(18)
.margin(20)

  Row() {
    ForEach(['#ff0000', '#00ff00', '#0000ff', '#ffff00'], (color) => {
      Rect()
        .width(60).height(60)
        .fill(color)
        .onClick(() => this.setColor(color))
        .margin(10)
    })
  }

  Button('刷新状态')
    .onClick(() => this.queryStatus())
    .margin(20)
}
.padding(20)

}

aboutToAppear(): void {
this.connectWebSocket();
}

private socketTask: WebsocketTask | null = null;

private connectWebSocket() {
this.socketTask = webSocket.createSocketTask({
url: ‘ws://192.168.31.100:8080’, // 修改为你的电脑局域网IP
});

this.socketTask.onOpen(() => {
  console.info('WebSocket connected');
  this.connected = true;
});

this.socketTask.onMessage((msg) => {
  const data = JSON.parse(msg.data as string);
  if (data.type === 'status') {
    this.currentColor = data.color;
    promptAction.showToast({ message: `当前颜色:${data.color}` });
  }
});

this.socketTask.onError((err) => {
  console.error('WebSocket error:', err);
  this.connected = false;
});

this.socketTask.onClose(() => {
  this.connected = false;
});

}

private setColor(color: string) {
if (this.socketTask && this.connected) {
this.socketTask.send({
data: JSON.stringify({
type: ‘setColor’,
color: color
})
});
}
}

private queryStatus() {
// 可扩展:发送 status 请求
}
}
6. 效果展示与运行截图
🖼️ 图1:Electron 桌面端初始界面
https://example.com/images/electron-init.png

白色背景,提示“等待连接”

🖼️ 图2:鸿蒙手机端操作界面
https://example.com/images/harmony-control.png

四个颜色按钮,支持点击切换

🖼️ 图3:手机点击红色后,桌面端变红
https://example.com/images/electron-red.png

背景平滑过渡为红色,状态更新

🎥 视频演示(GIF)
https://example.com/images/demo.gif

手机点击 → WebSocket 发送 → Electron 接收 → 页面变色

  1. 总结与展望
    ✅ 本文收获
    ✅ 理清了鸿蒙与 Electron 的技术边界
    ✅ 掌握了跨端通信的最佳实践模式
    ✅ 完成了一个可运行的“鸿蒙控制 Electron”原型
    ✅ 学会了在 OpenHarmony 中使用 WebSocket
    🔮 未来扩展方向
    方向 说明
    双向控制 Electron 也可反向控制鸿蒙设备(如震动、通知)
    加密通信 使用 TLS/WSS 提升安全性
    设备自动发现 UDP 广播扫描局域网内服务
    鸿蒙 Service Ability 对接 通过 HTTP 暴露微服务接口
    打包为 HMS 应用 发布到华为应用市场
    💬 金句总结:
    “不是所有融合都要打破边界,优雅的协作往往比强行整合更强大。”

  2. GitHub 源码地址
    🎉 项目已开源,欢迎 Star & Fork!

👉 https://github.com/yourname/harmony-electron-demo
添加链接描述

📁 项目结构:

harmony-electron-demo/
├── electron-app/ # Electron 桌面端
├── harmony-app/ # 鸿蒙手机端(ArkTS)
├── docs/ # 设计文档
└── README.md # 详细部署指南
🔧 支持一键启动:

启动 Electron

cd electron-app && npm install && npm start

鸿蒙端使用 DevEco Studio 打开并运行

🙏 写在最后
鸿蒙的崛起不是为了取代 Web 技术,而是为万物互联提供新的基础设施。Electron 也不会过时,它依然是桌面端最高效的开发方案之一。

当两个强大的生态相遇,我们不该问“谁替代谁”,而应思考“如何协同”。

如果你也在探索跨端开发的新路径,欢迎在评论区留言交流!👇

❤️ 觉得有帮助?点赞 + 收藏 + 关注,不错过每一篇硬核技术文!

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐