【无标题】
Web📌:两者不是替代关系,而是。鸿蒙擅长移动与 IoT 端,Electron 擅长桌面端。
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 Runtime 和 Ability 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 接收 → 页面变色
-
总结与展望
✅ 本文收获
✅ 理清了鸿蒙与 Electron 的技术边界
✅ 掌握了跨端通信的最佳实践模式
✅ 完成了一个可运行的“鸿蒙控制 Electron”原型
✅ 学会了在 OpenHarmony 中使用 WebSocket
🔮 未来扩展方向
方向 说明
双向控制 Electron 也可反向控制鸿蒙设备(如震动、通知)
加密通信 使用 TLS/WSS 提升安全性
设备自动发现 UDP 广播扫描局域网内服务
鸿蒙 Service Ability 对接 通过 HTTP 暴露微服务接口
打包为 HMS 应用 发布到华为应用市场
💬 金句总结:
“不是所有融合都要打破边界,优雅的协作往往比强行整合更强大。” -
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 也不会过时,它依然是桌面端最高效的开发方案之一。
当两个强大的生态相遇,我们不该问“谁替代谁”,而应思考“如何协同”。
如果你也在探索跨端开发的新路径,欢迎在评论区留言交流!👇
❤️ 觉得有帮助?点赞 + 收藏 + 关注,不错过每一篇硬核技术文!
更多推荐



所有评论(0)