鸿蒙Electron:用Web技术构建OpenHarmony与鸿蒙PC应用的桥梁
在万物互联的时代,跨平台开发已成为开发者追求高效开发的核心诉求。OpenHarmony作为开源的分布式操作系统,凭借其"一次开发,多端部署"的特性,为物联网、智能终端及鸿蒙PC等领域提供了统一的技术底座。而鸿蒙Electron(Electron for OpenHarmony)的出现,为Web开发者提供了一条低成本迁移至OpenHarmony生态的捷径。本文将从技术原理、环境搭建、核心代码解析到实战案例,全方位解析鸿蒙Electron的开发流程,助力开发者快速上手。
一、鸿蒙Electron:技术融合的桥梁
1.1 什么是鸿蒙Electron?
鸿蒙Electron并非简单的"Electron套壳",而是基于Electron技术栈深度改造的跨平台开发方案。它去除了Electron中与Chromium和Node.js紧密绑定的部分,转而适配OpenHarmony的系统API(如分布式文件、设备互联、通知推送等),同时优化了渲染引擎以支持OpenHarmony的窗口管理、分屏、全局菜单等原生特性,特别针对鸿蒙PC进行了桌面级优化。这种设计使得开发者能够复用现有的Web技术栈(HTML/CSS/JavaScript),快速开发出兼容OpenHarmony手机、平板、PC及智慧屏等设备的应用,实现"一次开发,多端部署"。
1.2 为什么选择鸿蒙Electron?
-
技术复用:Web开发者无需学习新的编程语言或框架,即可快速上手OpenHarmony开发。
-
跨端兼容:一套代码可同时运行于OpenHarmony手机、平板、鸿蒙PC及智慧屏等设备,降低适配成本。
-
生态融合:支持调用OpenHarmony的分布式能力,实现跨设备文件访问、多端协同等高级功能。
-
性能优化:相比标准Electron,鸿蒙Electron通过去除Node.js运行时和优化渲染引擎,显著降低了内存占用和启动时间。
二、环境搭建:三步快速上手
2.1 开发环境要求
-
操作系统:Windows 10/11 64位或macOS 12及以上。
-
开发工具:DevEco Studio 5.0 Beta2及以上(OpenHarmony官方IDE)。
-
依赖工具:Node.js 16.x LTS版本、Git。
-
硬件设备:搭载OpenHarmony 4.0及以上版本的设备,包括鸿蒙PC(推荐使用OpenHarmony开发板、模拟器或真实鸿蒙PC进行调试)。
2.2 详细搭建步骤
步骤1:安装DevEco Studio并配置OpenHarmony SDK
-
访问OpenHarmony开发者官网,下载并安装DevEco Studio。
-
启动DevEco Studio,进入"SDK Manager"(工具栏→Tools→SDK Manager),勾选"OpenHarmony SDK Platform 4.0"(API Version 10)及"Electron Adapter"(鸿蒙Electron适配插件),点击"Apply"完成安装。
-
新增系统变量
OPENHARMONY_ELECTRON_SDK,值为SDK中Electron Adapter的路径(如D:\Huawei\Sdk\electron-adapter\1.0.0)。将Node.js路径(如C:\Program Files\nodejs)添加至Path变量。
步骤2:验证环境配置
打开终端(Windows用CMD,macOS用Terminal),执行以下命令验证环境配置:
检查Node.js版本(需为16.x) node -v 检查鸿蒙Electron适配器版本 hpm electron -v 若输出“OpenHarmony Electron Adapter 1.0.0”,则环境配置成功
步骤3:安装鸿蒙Electron脚手架
通过npm全局安装鸿蒙Electron官方脚手架,用于快速创建项目:
安装脚手架 npm install -g @openharmony/electron-cli 验证脚手架安装 harmony-electron -v # 输出“1.0.0”即安装成功
三、核心代码解析:从Hello World到分布式能力
3.1 项目结构解析
使用脚手架创建项目后,目录结构如下:
openharmony-electron-demo/ ├── main/ # 主进程代码(控制应用生命周期) │ └── index.js # 主进程入口文件 ├── renderer/ # 渲染进程代码(UI界面) │ ├── index.html # 界面入口 │ ├── css/ # 样式文件 │ └── js/ # 前端逻辑 ├── package.json # 项目配置(依赖、脚本) └── openharmony.json # OpenHarmony应用配置(权限、设备类型)
3.2 主进程代码:控制应用生命周期
主进程负责应用启动、窗口管理与调用OpenHarmony系统能力。修改main/index.js文件:
const { app, BrowserWindow } = require('@openharmony/electron'); // 引入鸿蒙Electron模块
const path = require('path');
let mainWindow; // 存储窗口实例
// 创建应用窗口
function createWindow() {
mainWindow = new BrowserWindow({
width: 800,
height: 600,
// 鸿蒙PC特有配置
pcConfig: {
nativeFrame: true, // 使用原生窗口框架
systemMenu: true, // 启用系统菜单
taskbar: true, // 显示在任务栏
acrylic: false, // 亚克力效果(鸿蒙PC特性)
shadow: true // 窗口阴影
},
webPreferences: {
nodeIntegration: false, // 禁用Node.js集成(安全规范)
contextIsolation: true, // 开启上下文隔离
preload: path.join(__dirname, '../renderer/js/preload.js') // 预加载脚本路径
}
});
mainWindow.loadFile(path.join(__dirname, '../renderer/index.html')); // 加载HTML页面
mainWindow.on('closed', () => { mainWindow = null; }); // 窗口关闭时释放资源
// 鸿蒙PC开发:打开开发者工具(开发环境)
if (process.env.NODE_ENV === 'development') {
mainWindow.webContents.openDevTools();
}
}
// 应用生命周期管理
app.whenReady().then(createWindow); // 应用就绪后创建窗口
app.on('activate', () => {
if (BrowserWindow.getAllWindows().length === 0) createWindow();
}); // 激活应用时创建窗口(macOS适配)
// 鸿蒙PC适配:所有窗口关闭时不退出,保持后台运行
app.on('window-all-closed', () => {
if (process.platform !== 'harmony-pc') app.quit();
});
代码解释:
-
app:控制应用生命周期的模块,如启动、退出。 -
BrowserWindow:创建和管理应用窗口,支持鸿蒙PC原生窗口特性。 -
webPreferences:配置窗口的Web环境,如禁用Node.js集成以增强安全性。 -
preload:指定预加载脚本路径,用于安全地暴露API给渲染进程。
3.3 预加载脚本:安全暴露API
预加载脚本用于在渲染进程和主进程之间建立安全的通信桥梁。修改renderer/js/preload.js文件:
const { contextBridge, ipcRenderer } = require('@openharmony/electron');
// 暴露API给渲染进程
contextBridge.exposeInMainWorld('electronAPI', {
getAppVersion: () => ipcRenderer.invoke('get-app-version'), // 示例:获取应用版本
// 鸿蒙PC特有功能
minimizeWindow: () => ipcRenderer.send('window:minimize'),
maximizeWindow: () => ipcRenderer.send('window:maximize'),
closeWindow: () => ipcRenderer.send('window:close'),
// 系统集成
showInFolder: (path) => ipcRenderer.send('pc:show-in-folder', path),
openExternal: (url) => ipcRenderer.send('pc:open-external', url),
// 文件操作(沙盒内)
readFile: (filePath) => ipcRenderer.invoke('file:read', filePath),
saveFile: (data, options) => ipcRenderer.invoke('file:save', data, options)
});
// 环境检测
window.isHarmonyPC = process.platform === 'harmony-pc';
代码解释:
-
contextBridge.exposeInMainWorld:将API暴露给渲染进程的全局对象(window)。 -
ipcRenderer.invoke:通过IPC(进程间通信)调用主进程的API。 -
针对鸿蒙PC添加了窗口控制、文件操作等桌面应用常用功能。
3.4 渲染进程代码:实现交互逻辑
修改renderer/index.html和renderer/js/renderer.js文件,实现一个简单的"Hello World"界面:
<!-- renderer/index.html -->
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>Hello World - 鸿蒙PC</title>
<link rel="stylesheet" href="css/style.css">
<style>
.pc-badge {
display: inline-block;
background: #007dff;
color: white;
padding: 4px 12px;
border-radius: 20px;
font-size: 14px;
margin-left: 10px;
}
.window-controls {
position: absolute;
top: 20px;
right: 20px;
display: flex;
gap: 10px;
}
.control-btn {
width: 32px;
height: 32px;
border-radius: 8px;
border: 1px solid #e0e0e0;
background: white;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
}
.control-btn:hover {
background: #f5f5f5;
}
</style>
</head>
<body>
<div class="window-controls" id="windowControls">
<button class="control-btn" οnclick="minimizeWindow()">-</button>
<button class="control-btn" οnclick="maximizeWindow()">□</button>
<button class="control-btn" οnclick="closeWindow()">×</button>
</div>
<h1>Hello OpenHarmony! <span class="pc-badge">鸿蒙PC版</span></h1>
<p id="platformInfo">正在检测运行平台...</p>
<button id="versionBtn">获取应用版本</button>
<button id="pcFeatureBtn">测试鸿蒙PC功能</button>
<script src="js/renderer.js"></script>
</body>
</html>
// renderer/js/renderer.js
document.addEventListener('DOMContentLoaded', () => {
// 检测运行平台
const platformInfo = document.getElementById('platformInfo');
if (window.isHarmonyPC) {
platformInfo.textContent = '运行环境:鸿蒙PC桌面系统';
platformInfo.style.color = '#007dff';
} else {
platformInfo.textContent = '运行环境:OpenHarmony移动设备';
}
// 获取应用版本
document.getElementById('versionBtn').addEventListener('click', async () => {
const version = await window.electronAPI.getAppVersion(); // 调用预加载脚本暴露的API
alert(`当前应用版本:${version}`);
});
// 测试鸿蒙PC功能
document.getElementById('pcFeatureBtn').addEventListener('click', async () => {
if (window.isHarmonyPC) {
// 测试文件读取
try {
const content = await window.electronAPI.readFile('/etc/hostname');
alert(`文件读取成功(示例):${content.substring(0, 50)}...`);
} catch (error) {
alert('文件读取测试(沙盒限制正常)');
}
} else {
alert('此功能仅限鸿蒙PC平台');
}
});
});
// 窗口控制函数
function minimizeWindow() {
if (window.electronAPI.minimizeWindow) {
window.electronAPI.minimizeWindow();
}
}
function maximizeWindow() {
if (window.electronAPI.maximizeWindow) {
window.electronAPI.maximizeWindow();
}
}
function closeWindow() {
if (window.electronAPI.closeWindow) {
window.electronAPI.closeWindow();
}
}
代码解释:
-
渲染进程通过
window.electronAPI调用主进程的API。 -
使用
async/await处理异步通信,避免回调地狱。 -
针对鸿蒙PC平台添加了窗口控制和平台检测功能。
3.5 扩展功能:调用OpenHarmony分布式能力
鸿蒙Electron支持调用OpenHarmony的分布式能力,如跨设备文件访问。修改main/index.js,添加分布式文件管理代码:
const { app, BrowserWindow, ipcMain } = require('@openharmony/electron');
const { DistributedFile } = require('@openharmony/electron/distributed'); // 引入分布式文件模块
const path = require('path');
// 初始化分布式文件管理器
const fileManager = new DistributedFile({
bundleName: 'com.example.demo', // 应用包名(需与openharmony.json一致)
storeName: 'sharedFiles' // 共享文件存储名称
});
// IPC通信:获取共享文件列表
ipcMain.handle('get-shared-files', async () => {
try {
const files = await fileManager.listFiles(); // 列出共享文件
return files;
} catch (error) {
console.error('获取共享文件失败:', error);
return [];
}
});
// IPC通信:保存笔记(鸿蒙PC优化版)
ipcMain.handle('save-note', async (event, content, options = {}) => {
try {
// 如果是鸿蒙PC,提供额外的桌面集成功能
if (process.platform === 'harmony-pc') {
// 在鸿蒙PC上,可以将笔记保存到用户选择的目录
if (options.saveToDesktop) {
const desktopPath = require('@openharmony/electron').app.getPath('desktop');
const fs = require('@openharmony/electron').fs;
const filePath = path.join(desktopPath, `note_${Date.now()}.txt`);
await fs.promises.writeFile(filePath, content, 'utf-8');
// 鸿蒙PC特有:显示保存成功的系统通知
const { Notification } = require('@openharmony/electron');
new Notification({
title: '笔记保存成功',
body: `已保存到桌面:${path.basename(filePath)}`,
icon: path.join(__dirname, '../resources/icon.png')
}).show();
return {
success: true,
platform: 'harmony-pc',
filePath
};
}
}
// 通用保存逻辑(分布式存储)
await fileManager.put('currentNote', content);
return { success: true };
} catch (error) {
console.error('保存笔记失败:', error);
return { success: false, error: error.message };
}
});
代码解释:
-
DistributedFile:OpenHarmony的分布式文件管理模块,支持跨设备文件访问。 -
ipcMain.handle:定义主进程的IPC处理器,供渲染进程调用。 -
鸿蒙PC优化:添加了桌面集成功能,如保存到桌面、系统通知等。
四、实战案例:构建一个跨设备记事本
4.1 功能需求
-
用户可以输入笔记内容并保存。
-
笔记内容支持跨设备同步(通过OpenHarmony分布式能力)。
-
鸿蒙PC版特有功能:支持保存到桌面、系统托盘、任务栏进度显示。
-
界面简洁,支持响应式布局。
4.2 核心代码实现
修改main/index.js(添加分布式数据管理与鸿蒙PC特性)
const { app, BrowserWindow, ipcMain, systemTray, Menu } = require('@openharmony/electron');
const { DistributedDataManager } = require('@openharmony/electron/distributed');
const path = require('path');
// 初始化分布式数据管理器
const dataManager = new DistributedDataManager({
bundleName: 'com.example.notepad',
storeName: 'noteStore'
});
let tray = null;
// 创建系统托盘(仅鸿蒙PC)
function createSystemTray() {
if (process.platform === 'harmony-pc') {
tray = new systemTray.Tray(
path.join(__dirname, '../resources/tray-icon.png')
);
const contextMenu = Menu.buildFromTemplate([
{ label: '打开记事本', click: () => mainWindow.show() },
{ label: '新建笔记', click: () => mainWindow.webContents.send('new-note') },
{ type: 'separator' },
{ label: '退出', click: () => app.quit() }
]);
tray.setToolTip('鸿蒙记事本');
tray.setContextMenu(contextMenu);
}
}
// IPC通信:保存笔记
ipcMain.handle('save-note', async (event, content) => {
try {
await dataManager.put('currentNote', content); // 保存笔记内容
// 鸿蒙PC特有:更新任务栏进度
if (process.platform === 'harmony-pc' && mainWindow) {
mainWindow.setProgressBar(1.0); // 100%进度
setTimeout(() => mainWindow.setProgressBar(-1), 1000); // 1秒后清除
}
return { success: true };
} catch (error) {
console.error('保存笔记失败:', error);
return { success: false, error: error.message };
}
});
// IPC通信:获取笔记
ipcMain.handle('get-note', async () => {
try {
const content = await dataManager.get('currentNote'); // 获取笔记内容
return content || ''; // 若不存在则返回空字符串
} catch (error) {
console.error('获取笔记失败:', error);
return '';
}
});
修改renderer/js/renderer.js(实现笔记保存与加载)
// 页面加载时获取笔记
window.addEventListener('DOMContentLoaded', async () => {
const noteContent = await window.electronAPI.getNote(); // 调用主进程API获取笔记
document.getElementById('noteContent').value = noteContent; // 填充到文本框
// 鸿蒙PC特有:监听新建笔记事件
if (window.isHarmonyPC) {
window.electronAPI.onNewNote(() => {
document.getElementById('noteContent').value = '';
document.getElementById('noteContent').focus();
});
}
});
// 保存按钮点击事件
document.getElementById('saveBtn').addEventListener('click', async () => {
const content = document.getElementById('noteContent').value;
// 鸿蒙PC特有:添加保存选项
const options = {};
if (window.isHarmonyPC && document.getElementById('saveToDesktop').checked) {
options.saveToDesktop = true;
}
const result = await window.electronAPI.saveNote(content, options); // 调用主进程API保存笔记
if (result.success) {
if (window.isHarmonyPC && result.filePath) {
alert(`笔记已保存到桌面:${result.filePath}`);
} else {
alert('笔记保存成功!已同步到所有设备。');
}
} else {
alert(`保存失败:${result.error}`);
}
});
// 鸿蒙PC特有:添加键盘快捷键
if (window.isHarmonyPC) {
document.addEventListener('keydown', (e) => {
if (e.ctrlKey && e.key === 's') {
e.preventDefault();
document.getElementById('saveBtn').click();
}
});
}
修改preload.js(暴露笔记相关API)
const { contextBridge, ipcRenderer } = require('@openharmony/electron');
contextBridge.exposeInMainWorld('electronAPI', {
getNote: () => ipcRenderer.invoke('get-note'),
saveNote: (content, options) => ipcRenderer.invoke('save-note', content, options),
// 鸿蒙PC特有功能
minimizeWindow: () => ipcRenderer.send('window:minimize'),
maximizeWindow: () => ipcRenderer.send('window:maximize'),
closeWindow: () => ipcRenderer.send('window:close'),
// 事件监听
onNewNote: (callback) => {
ipcRenderer.on('new-note', () => callback());
}
});
五、总结与展望
鸿蒙Electron为Web开发者提供了一条高效迁移至OpenHarmony生态的路径,通过API桥接层解决了Electron与OpenHarmony的核心差异,实现了技术复用与跨端兼容。本文通过"Hello World"和跨设备记事本两个案例,详细解析了鸿蒙Electron的核心开发流程,包括主进程管理、IPC通信、分布式能力调用等,特别针对鸿蒙PC平台进行了桌面级优化。
随着OpenHarmony生态的持续完善,未来鸿蒙Electron有望实现更深度的集成,如官方原生支持Node.js运行时、更高效的渲染性能优化等。对于开发者而言,掌握鸿蒙Electron开发技能,将能够更好地把握万物互联时代的技术机遇,特别是在鸿蒙PC生态快速发展的大背景下。
欢迎加入开源鸿蒙PC社区
无论您是OpenHarmony的初学者,还是经验丰富的开发者,都欢迎加入我们的开源鸿蒙PC社区!在这里,您可以:
-
📚 获取最新的鸿蒙PC开发资料和教程
-
💬 与其他开发者交流技术问题和经验
-
🔧 参与开源项目,共同完善鸿蒙PC生态
-
🚀 获取技术支持和开发指导
社区地址:https://harmonypc.csdn.net/
让我们一起推动鸿蒙PC生态的发展,构建更美好的万物互联世界!
更多推荐



所有评论(0)