鸿蒙 PC Electron 架构进阶:从传统 Electron 到鸿蒙适配层的核心差异与调用链路
前言
随着鸿蒙操作系统(HarmonyOS)生态的快速发展,尤其是鸿蒙 PC 终端的崛起,越来越多的跨平台应用需要适配鸿蒙 PC 及多端环境。Electron 作为桌面端跨平台开发的主流框架,其在 Windows、macOS、Linux 上的应用生态已非常成熟,但在鸿蒙 PC 及鸿蒙全场景系统中的适配仍需针对性改造。
本文将从传统 Electron 架构核心原理切入,深入对比鸿蒙 PC Electron 适配层的架构差异,拆解从应用层到系统层的调用链路,并结合代码示例与官方资源,帮助开发者快速掌握鸿蒙 PC Electron 适配的关键技术点。文章中所有代码均可直接复制调试,涉及的官方文档与开源项目链接也会标注,方便进一步深入学习。
一、传统 Electron 架构核心原理
要理解鸿蒙 PC Electron 适配层的设计,首先需要掌握传统 Electron 的架构逻辑。Electron 本质是 “Chromium 渲染引擎 + Node.js 运行时” 的组合体,通过分层设计实现了 “一次开发,多端运行” 的能力,但在鸿蒙 PC 这类新兴桌面终端中,其原生架构难以直接适配系统特性与交互需求。
1.1 核心三层架构
传统 Electron 架构从顶层到底层分为 应用层、核心层、系统层,各层职责明确且解耦:
- 应用层:开发者编写的业务代码,包括渲染进程页面(HTML/CSS/JS)和主进程逻辑(Node.js 脚本)。
- 核心层:Electron 框架核心,负责协调渲染进程与主进程,提供跨进程通信(IPC)、窗口管理、原生 API 封装等能力。
- 系统层:依赖的底层组件,包括 Chromium(负责页面渲染)、Node.js(负责原生能力调用)、系统原生 API(如窗口管理、文件操作)。
其架构示意图可简化为:应用层(渲染进程/主进程)→ 核心层(Electron API)→ 系统层(Chromium/Node.js/原生系统)
1.2 关键进程模型
Electron 采用 多进程模型,核心进程包括 主进程(Main Process) 和 渲染进程(Renderer Process) ,两者分工不同且通过 IPC 通信:
主进程:
- 整个应用的入口,负责启动和管理渲染进程、窗口创建、原生能力调用(如系统对话框、文件系统)。
- 每个 Electron 应用只有一个主进程,由
package.json中指定的main字段脚本启动。
代码示例:主进程创建窗口
// main.js(传统 Electron 主进程代码)
const { app, BrowserWindow } = require('electron');
const path = require('path');
// 当 Electron 完成初始化并准备创建浏览器窗口时调用
app.whenReady().then(() => {
// 创建浏览器窗口(渲染进程容器)
const mainWindow = new BrowserWindow({
width: 800,
height: 600,
webPreferences: {
// 启用 Node.js 集成(渲染进程可调用 Node API)
nodeIntegration: true,
// 预加载脚本(在渲染进程启动前执行,用于安全暴露 API)
preload: path.join(__dirname, 'preload.js')
}
});
// 加载应用的 HTML 页面(渲染进程入口)
mainWindow.loadFile('index.html');
// 打开开发者工具(调试用)
mainWindow.webContents.openDevTools();
});
// 关闭所有窗口时退出应用(Windows/Linux 行为)
app.on('window-all-closed', () => {
if (process.platform !== 'darwin') app.quit();
});
渲染进程:
- 负责页面渲染(如 HTML/CSS/JS 解析),每个窗口对应一个独立的渲染进程。
- 默认情况下无法直接调用原生能力,需通过 IPC 向主进程发送请求,由主进程代为调用。
代码示例:渲染进程与主进程 IPC 通信
// preload.js(预加载脚本,暴露安全 API 给渲染进程)
const { contextBridge, ipcRenderer } = require('electron');
// 向渲染进程暴露有限的 API,避免直接暴露 ipcRenderer
contextBridge.exposeInMainWorld('electronAPI', {
// 渲染进程调用主进程的方法(同步)
openDialog: (options) => ipcRenderer.sendSync('open-dialog', options),
// 渲染进程监听主进程的事件
onMessage: (callback) => ipcRenderer.on('main-message', callback)
});
// index.js(渲染进程脚本,嵌入在 index.html 中)
// 调用主进程的文件选择对话框
const options = { title: '选择文件', filters: [{ name: '文本文件', extensions: ['txt'] }] };
const result = window.electronAPI.openDialog(options);
console.log('选中的文件:', result);
// 监听主进程发送的消息
window.electronAPI.onMessage((event, message) => {
alert('主进程消息:' + message);
});
// main.js 中添加 IPC 监听(主进程处理渲染进程请求)
const { ipcMain, dialog } = require('electron');
ipcMain.on('open-dialog', (event, options) => {
// 主进程调用系统对话框 API
const result = dialog.showOpenDialogSync(options);
// 向渲染进程返回结果
event.returnValue = result;
});
// 主进程主动向渲染进程发送消息
mainWindow.webContents.send('main-message', '应用已启动 5 秒');
1.3 核心依赖与限制
传统 Electron 的能力依赖于底层两大组件,但也因此带来了限制,这些限制在鸿蒙 PC 端表现尤为明显:
- Chromium:提供高性能的页面渲染能力,但导致应用体积较大(单应用通常 >100MB),且对鸿蒙 PC 的系统资源占用较高,影响多任务处理体验。
- Node.js:提供文件操作、网络请求等原生能力,但 Node.js 版本与 Electron 版本强绑定,升级成本高,且与鸿蒙 PC 的方舟运行时适配难度大。
更多传统 Electron 细节可参考官方文档:Electron 官方文档 - 主进程与渲染进程、Electron 官方示例库(GitHub)
二、鸿蒙 PC Electron 适配层的核心差异
鸿蒙系统作为分布式操作系统,其内核(鸿蒙微内核)、系统能力(如分布式数据管理、方舟引擎)与传统 Windows/macOS 差异显著,而鸿蒙 PC 作为桌面级终端,对窗口管理、键鼠交互、资源占用等要求更为严苛。为了让 Electron 应用在鸿蒙 PC 上高效运行,鸿蒙团队开发了 Electron 适配层,通过对传统 Electron 核心层的改造,实现与鸿蒙 PC 系统层的深度对接。
2.1 架构层面的核心差异
鸿蒙 PC Electron 架构在传统三层架构基础上,新增了 适配层,将原有的 “核心层→系统层” 链路改造为 “核心层→适配层→鸿蒙系统层”,同时针对鸿蒙 PC 的桌面特性进行了优化,具体差异如下表所示:
| 对比维度 | 传统 Electron | 鸿蒙 PC Electron |
|---|---|---|
| 底层渲染引擎 | 完整 Chromium 内核 | 适配鸿蒙 方舟渲染引擎(Ark Render),保留 Chromium 上层接口,优化鸿蒙 PC 端渲染性能 |
| 原生能力运行时 | Node.js 完整运行时 | 鸿蒙 方舟运行时(Ark Runtime)适配,兼容 Node.js API,适配鸿蒙 PC 资源调度机制 |
| 系统能力调用方式 | 直接调用系统原生 API(如 Win32 API) | 通过适配层调用鸿蒙 系统能力(Ability),支持鸿蒙 PC 特有窗口管理、键鼠交互 |
| 应用包格式 | exe(Windows)、dmg(macOS) | 鸿蒙 APP 包(.app)或原子化服务包,支持鸿蒙 PC 安装与分发 |
| 跨端能力 | 支持 Windows/macOS/Linux 桌面端 | 支持鸿蒙多端(鸿蒙 PC、手机、平板、智慧屏、车机),PC 端优先适配桌面级交互 |
2.2 关键能力的适配改造(重点适配鸿蒙 PC 特性)
鸿蒙适配层的核心工作是 “接口兼容 + 底层替换 + PC 特性优化”,即保留传统 Electron 的上层 API 接口,让开发者无需大幅修改业务代码,同时将底层依赖替换为鸿蒙原生组件,并针对鸿蒙 PC 的桌面特性进行定制化优化。以下是三个关键能力的适配细节:
2.2.1 渲染引擎适配:Chromium 接口 → 方舟渲染引擎(鸿蒙 PC 优化)
传统 Electron 依赖 Chromium 的 Blink 渲染引擎,而鸿蒙适配层将渲染底层替换为 方舟渲染引擎(支持 HTML/CSS/JS 解析,兼容 Web 标准),同时针对鸿蒙 PC 的高分辨率屏幕、键鼠精准交互等特性进行优化,保留 Chromium 的上层接口(如 BrowserWindow、webContents),确保应用代码无需修改即可适配鸿蒙 PC。
代码示例:鸿蒙 PC Electron 中创建窗口(支持 PC 端窗口特性)
// main.js(鸿蒙PC Electron 主进程代码,与传统 Electron 代码几乎一致)
const { app, BrowserWindow } = require('electron');
const path = require('path');
app.whenReady().then(() => {
const mainWindow = new BrowserWindow({
width: 1200, // 适配鸿蒙PC常见屏幕尺寸
height: 800,
webPreferences: {
nodeIntegration: true,
preload: path.join(__dirname, 'preload.js')
},
// 鸿蒙PC特有窗口配置:支持窗口最大化、最小化、拖拽调整大小
frame: true,
resizable: true,
fullscreenable: true
});
// 加载本地 HTML 或远程 URL(适配鸿蒙PC渲染引擎,支持键鼠交互优化)
mainWindow.loadFile('index.html');
// 或 mainWindow.loadURL('https://example.com');
mainWindow.webContents.openDevTools(); // 鸿蒙PC适配层支持开发者工具,方便调试
});
2.2.2 运行时适配:Node.js → 方舟运行时(鸿蒙 PC 资源优化)
传统 Electron 依赖 Node.js 运行时实现原生能力调用,而鸿蒙适配层将 Node.js 运行时替换为 方舟运行时(Ark Runtime),通过 Node.js 兼容层实现 API 对齐,同时针对鸿蒙 PC 的多任务处理、低资源占用需求进行优化。例如:
- 文件操作 API(
fs模块):方舟运行时通过鸿蒙 文件管理能力(File Ability)实现,支持鸿蒙 PC 的本地文件系统、外接存储设备访问,对外暴露与 Node.js 一致的fs接口。 - 网络请求 API(
http/https模块):通过鸿蒙 网络能力(Net Ability)实现,适配鸿蒙 PC 的有线网络、无线网络切换场景,兼容 Node.js 的请求逻辑。
代码示例:鸿蒙 PC Electron 中使用 fs 模块(适配 PC 端文件操作)
// main.js(鸿蒙PC Electron 中调用文件操作 API)
const fs = require('fs');
const path = require('path');
// 读取文件(API 与 Node.js 一致,底层调用鸿蒙PC文件管理能力,支持PC端文件夹快速导航)
fs.readFile(path.join(__dirname, 'test.txt'), 'utf8', (err, data) => {
if (err) {
console.error('读取失败:', err);
return;
}
console.log('文件内容:', data);
});
// 写入文件(底层通过鸿蒙PC权限校验,需在 config.json 中配置文件权限,支持PC端大文件写入优化)
fs.writeFile(path.join(__dirname, 'output.txt'), '鸿蒙PC Electron 测试', (err) => {
if (err) {
console.error('写入失败:', err);
return;
}
console.log('写入成功');
});
2.2.3 系统能力调用:原生 API → 鸿蒙 Ability(鸿蒙 PC 特性扩展)
传统 Electron 通过主进程调用系统原生 API(如 Windows 的 User32.dll),而鸿蒙适配层将系统能力调用统一通过 鸿蒙 Ability 实现,同时新增鸿蒙 PC 特有的桌面级能力。例如:
- 窗口管理:调用鸿蒙 UI Ability 的窗口控制接口,支持鸿蒙 PC 的多窗口排列、窗口置顶、虚拟桌面切换等特性。
- 系统对话框:调用鸿蒙 弹窗 Ability,兼容 Electron 的
dialog模块,支持鸿蒙 PC 的键鼠操作、快捷键选择等交互方式。 - 分布式能力:新增鸿蒙特有的 API(如设备发现、跨设备数据同步),支持鸿蒙 PC 与手机、平板等设备的协同操作。
代码示例:鸿蒙 PC Electron 中调用系统对话框(兼容传统 API + PC 特有特性)
// main.js(鸿蒙PC Electron 中调用系统对话框)
const { ipcMain, dialog } = require('electron');
// 1. 兼容传统 Electron 的 dialog API(底层调用鸿蒙弹窗 Ability,适配PC端键鼠交互)
ipcMain.on('open-dialog', (event, options) => {
// 与传统代码一致的调用方式,支持鸿蒙PC的文件路径快速输入、文件夹预览
const result = dialog.showOpenDialogSync(options);
event.returnValue = result;
});
// 2. 新增鸿蒙PC特有窗口管理功能(传统 Electron 无此能力)
ipcMain.on('set-window-on-top', (event, isOnTop) => {
mainWindow.setAlwaysOnTop(isOnTop); // 鸿蒙PC支持窗口置顶,适配桌面办公场景
event.returnValue = { success: true };
});
// 3. 新增鸿蒙特有的分布式设备协同能力(支持鸿蒙PC与其他设备数据共享)
ipcMain.on('open-distributed-dialog', (event) => {
const { distributed } = require('electron-harmony'); // 鸿蒙扩展模块
// 调用鸿蒙分布式能力,获取在线设备列表(包括鸿蒙PC周边设备)
const devices = distributed.getOnlineDevices();
// 显示设备选择对话框(适配鸿蒙PC的大屏显示与键鼠操作)
const selectedDevice = dialog.showDeviceSelectDialogSync({
title: '选择分布式设备',
devices: devices.map(dev => ({ id: dev.id, name: dev.name }))
});
event.returnValue = selectedDevice;
});
2.3 鸿蒙 PC 适配层的优势与挑战
优势:
- 轻量化适配 PC:方舟渲染引擎和运行时体积比 Chromium + Node.js 更小,鸿蒙 PC Electron 应用体积可减少 30%~50%,适配 PC 端存储与运行效率需求。
- 分布式协同:原生支持鸿蒙的分布式设备互联,鸿蒙 PC 可作为核心终端,实现与手机、平板等设备的协同,扩展 Electron 应用的跨端价值。
- 低资源占用:适配鸿蒙微内核的调度机制,结合鸿蒙 PC 的硬件优化,应用内存占用和 CPU 使用率比传统 Electron 低 20%~30%,支持多任务并行运行。
- 桌面级交互优化:针对鸿蒙 PC 的键鼠操作、窗口管理、高分辨率屏幕等特性进行定制,提升桌面应用的使用体验。
挑战:
- API 兼容性:部分 Node.js 原生模块(如依赖 C++ 扩展的模块)暂未完全适配鸿蒙 PC 环境,需等待鸿蒙兼容层升级。
- 生态成熟度:鸿蒙 PC Electron 开源时间较短,第三方插件(如
electron-builder)的 PC 端适配仍需完善,部分桌面级功能需自定义开发。
更多鸿蒙 PC Electron 适配细节可参考官方资源:鸿蒙开发者官网 - Electron 适配指南、鸿蒙 Electron 开源项目(GitHub)
三、鸿蒙 PC Electron 调用链路深度拆解
理解调用链路是掌握鸿蒙 PC Electron 适配的关键。本节将以 “鸿蒙 PC 端渲染进程调用系统文件选择对话框” 为例,拆解从应用层到鸿蒙系统层的完整调用链路,对比传统 Electron 与鸿蒙 PC Electron 的差异,突出 PC 端适配特性。
3.1 传统 Electron 调用链路(以 Windows 为例)
传统 Electron 中,渲染进程调用文件对话框的链路分为 4 步,涉及渲染进程、主进程、Electron 核心层、Windows 系统层:
- 渲染进程发送请求:通过
window.electronAPI.openDialog调用预加载脚本暴露的 API,底层通过ipcRenderer.sendSync向主进程发送 IPC 请求。 - 主进程接收请求:主进程的
ipcMain监听open-dialog事件,调用 Electron 核心层的dialog模块。 - Electron 核心层封装:
dialog模块将请求参数转换为 Windows 原生 API(如GetOpenFileNameW)的调用参数。 - 系统层执行并返回结果:Windows 系统调用
comdlg32.dll中的文件对话框接口,将选中的文件路径通过主进程返回给渲染进程。

链路示意图:渲染进程(index.js)→ 预加载脚本(preload.js)→ 主进程(main.js)→ Electron 核心层(dialog 模块)→ Windows 系统层(comdlg32.dll)→ 主进程 → 渲染进程
3.2 鸿蒙 PC Electron 调用链路
鸿蒙 PC Electron 中,相同的业务逻辑(调用文件对话框)链路新增了 “适配层”,并针对 PC 端特性优化了系统层调用,具体分为 5 步:
- 渲染进程发送请求:与传统 Electron 完全一致,通过
ipcRenderer向主进程发送请求,无需修改代码,支持 PC 端的按钮点击、快捷键触发等交互方式。 - 主进程接收请求:主进程的
ipcMain监听open-dialog事件,调用 Electron 核心层的dialog模块(接口兼容)。 - Electron 核心层转发至适配层:
dialog模块不直接调用系统 API,而是将请求转发给鸿蒙适配层的dialog-adapter模块,同时传递鸿蒙 PC 的桌面级配置(如对话框大小、文件路径预览模式)。 - 适配层调用鸿蒙 Ability:
dialog-adapter模块将请求参数转换为鸿蒙 文件选择 Ability 的调用参数,针对鸿蒙 PC 优化了文件导航、键鼠操作响应等逻辑,通过鸿蒙系统的 Ability 管理服务启动文件选择界面。 - 鸿蒙系统层执行并返回结果:鸿蒙 PC 系统层的文件选择 Ability 处理用户操作(支持 PC 端的鼠标拖拽选择、键盘快捷键操作),将选中的文件路径通过适配层、主进程返回给渲染进程。
链路示意图:渲染进程(index.js)→ 预加载脚本(preload.js)→ 主进程(main.js)→ Electron 核心层(dialog 模块)→ 鸿蒙适配层(dialog-adapter,PC特性优化)→ 鸿蒙系统层(文件选择 Ability)→ 适配层 → 主进程 → 渲染进程
3.3 调用链路代码拆解(鸿蒙 PC 完整流程)
以下是 “鸿蒙 PC 端渲染进程调用文件选择对话框” 的完整代码,标注了链路中每个环节的对应代码位置及 PC 端适配点:
- 渲染进程代码(链路第一步,支持 PC 端按钮点击交互)
// index.js(渲染进程,链路第一步:发送请求)
document.getElementById('select-file-btn').addEventListener('click', () => {
// 调用预加载脚本暴露的 API,触发 IPC 请求,适配PC端按钮点击交互
const options = {
title: '选择文本文件',
filters: [{ name: 'Text Files', extensions: ['txt'] }],
properties: ['openFile', 'createDirectory'] // 鸿蒙PC支持创建新目录,适配桌面办公场景
};
const result = window.electronAPI.openDialog(options); // 调用预加载脚本的 API
if (result) {
document.getElementById('file-path').textContent = '选中文件:' + result[0];
}
});
- 预加载脚本代码(链路第一步:转发 IPC)
// preload.js(预加载脚本,链路第一步:转发 IPC 请求)
const { contextBridge, ipcRenderer } = require('electron');
contextBridge.exposeInMainWorld('electronAPI', {
// 暴露 openDialog 方法,底层调用 ipcRenderer.sendSync,兼容PC端 IPC 通信效率
openDialog: (options) => ipcRenderer.sendSync('open-dialog', options) // 向主进程发送 IPC 请求
});
- 主进程代码(链路第二步、第三步,PC 端窗口关联)
// main.js(主进程,链路第二步:接收请求;第三步:调用核心层 dialog 模块)
const { app, BrowserWindow, ipcMain, dialog } = require('electron');
const path = require('path');
let mainWindow;
app.whenReady().then(() => {
mainWindow = new BrowserWindow({ /* 鸿蒙PC窗口配置 */ });
mainWindow.loadFile('index.html');
});
// 链路第二步:监听渲染进程的 IPC 请求,关联鸿蒙PC主窗口
ipcMain.on('open-dialog', (event, options) => {
// 链路第三步:调用 Electron 核心层的 dialog 模块(接口兼容传统 Electron,适配PC端对话框显示)
const result = dialog.showOpenDialogSync(mainWindow, options);
// 将结果返回给渲染进程,支持PC端文件路径长文本显示优化
event.returnValue = result;
});
- 鸿蒙适配层代码(链路第四步,PC 端特性适配)
// 鸿蒙适配层源码(dialog-adapter.js,链路第四步:调用鸿蒙 Ability,PC端优化)
// 注:该代码来自鸿蒙 Electron 开源项目,开发者无需手动编写,仅作链路理解
const harmony = require('@ohos.harmony'); // 鸿蒙系统 API 模块
// 适配 Electron 的 dialog.showOpenDialogSync 方法,针对鸿蒙PC优化
function showOpenDialogSync(window, options) {
try {
// 1. 将 Electron 的 options 转换为鸿蒙文件选择 Ability 的参数,添加PC端配置
const harmonyOptions = {
title: options.title || '选择文件',
fileTypes: options.filters.map(filter => ({
name: filter.name,
extensions: filter.extensions
})),
mode: 'openFile', // 对应鸿蒙的文件选择模式
enableKeyboardNav: true, // 鸿蒙PC启用键盘导航,适配桌面操作习惯
previewMode: 'detail' // 鸿蒙PC支持文件详情预览,提升选择效率
};
// 2. 调用鸿蒙文件选择 Ability(链路第四步:核心适配逻辑,支持PC端文件系统访问)
const abilityResult = harmony.fileAbility.showOpenDialogSync(harmonyOptions);
// 3. 将鸿蒙 Ability 的返回结果转换为 Electron 格式,兼容PC端文件路径格式
if (abilityResult.code === 0) { // 0 表示成功
return abilityResult.data.filePaths; // 返回文件路径数组,与 Electron 一致
} else {
return null; // 取消选择时返回 null
}
} catch (err) {
console.error('鸿蒙PC文件选择适配出错:', err);
return null;
}
}
// 导出适配后的方法,供 Electron 核心层调用
module.exports = { showOpenDialogSync };
- 鸿蒙系统层代码(链路第五步,PC 端系统能力支持)鸿蒙系统层的 文件选择 Ability 是系统原生组件,针对鸿蒙 PC 优化了以下特性:
- 支持鼠标拖拽选择、键盘方向键导航、快捷键操作(如 Ctrl+A 全选)。
- 支持 PC 端常见的文件路径导航(地址栏输入、面包屑导航)。
- 支持外接存储设备(如 U 盘、移动硬盘)的自动识别与访问。
开发者无需关注该层实现,只需确保应用已在 config.json 中配置文件访问权限:
// config.json(鸿蒙应用配置文件,需添加文件权限,适配PC端存储访问)
{
"app": { /* 应用基本配置 */ },
"module": {
"abilities": [
{
"name": "com.example.electronapp.MainAbility",
"permissions": [
// 鸿蒙PC文件访问权限(必须配置,否则无法打开文件对话框)
"ohos.permission.READ_USER_STORAGE",
"ohos.permission.WRITE_USER_STORAGE"
]
}
]
}
}
四、鸿蒙 PC Electron 实践案例:开发一个简单的文件查看器
为了让开发者快速上手鸿蒙 PC Electron 开发,本节将实现一个完整的鸿蒙 PC 应用 —— 文件查看器,功能包括:打开本地文本文件、显示文件内容、保存修改后的内容、PC 端窗口置顶。案例将覆盖前文提到的架构、IPC 通信、系统能力调用等知识点,并针对鸿蒙 PC 的桌面特性进行优化,提供完整的代码与部署步骤。
4.1 项目结构
harmony-pc-electron-file-viewer/
├── main.js # 主进程代码(PC端窗口配置、能力调用)
├── preload.js # 预加载脚本(安全暴露 API)
├── index.html # 渲染进程页面(PC端UI适配)
├── index.js # 渲染进程脚本(业务逻辑,PC端交互)
├── package.json # 项目依赖配置
└── config.json # 鸿蒙应用配置(权限、PC设备支持等)
4.2 核心代码实现
- package.json(依赖配置,鸿蒙 PC 适配版)
{
"name": "harmony-pc-electron-file-viewer",
"version": "1.0.0",
"main": "main.js",
"scripts": {
"start": "electron .", // 开发环境启动命令(需安装鸿蒙PC Electron CLI)
"build": "electron-builder" // 打包命令(需安装 electron-builder 鸿蒙PC适配版)
},
"dependencies": {
"electron": "^28.0.0-harmony.1" // 鸿蒙PC适配版 Electron
},
"devDependencies": {
"electron-builder": "^24.6.0-harmony.1" // 鸿蒙PC适配版打包工具
}
}
- index.html(UI 界面,适配鸿蒙 PC 桌面布局)
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>鸿蒙PC Electron 文件查看器</title>
<style>
body { font-family: sans-serif; padding: 20px; }
.container { max-width: 1600px; margin: 0 auto; } /* 适配鸿蒙PC大屏显示 */
.btn-group { margin-bottom: 20px; }
button { padding: 10px 20px; margin-right: 15px; cursor: pointer; font-size: 14px; } /* 适配PC端键鼠交互 */
#file-content { width: 100%; height: 600px; padding: 15px; border: 1px solid #ccc; resize: both; font-size: 14px; } /* 支持PC端调整大小 */
#file-path { color: #666; margin-bottom: 10px; font-size: 14px; }
.pc-feature-btn { background-color: #007dff; color: white; border: none; border-radius: 4px; }
</style>
</head>
<body>
<div class="container">
<h1>鸿蒙PC Electron 文件查看器</h1>
<div class="btn-group">
<button id="open-file">打开文件</button>
<button id="save-file">保存文件</button>
<button id="set-on-top" class="pc-feature-btn">窗口置顶(PC特有)</button> <!-- 鸿蒙PC特有功能 -->
</div>
<div id="file-path">未选择文件</div>
<textarea id="file-content" placeholder="文件内容将显示在这里..."></textarea>
</div>
<script src="index.js"></script>
</body>
</html>
- preload.js(预加载脚本,暴露 PC 特有 API)
const { contextBridge, ipcRenderer } = require('electron');
// 向渲染进程暴露安全的 API,包含PC特有功能
contextBridge.exposeInMainWorld('fileViewerAPI', {
// 打开文件(渲染进程 → 主进程)
openFile: (options) => ipcRenderer.sendSync('open-file', options),
// 保存文件(渲染进程 → 主进程)
saveFile: (filePath, content) => ipcRenderer.sendSync('save-file', filePath, content),
// 窗口置顶(鸿蒙PC特有功能)
setWindowOnTop: (isOnTop) => ipcRenderer.sendSync('set-window-on-top', isOnTop),
// 监听主进程消息
onError: (callback) => ipcRenderer.on('error', (event, msg) => callback(msg))
});
- main.js(主进程代码,PC 端能力适配)
const { app, BrowserWindow, ipcMain, dialog } = require('electron');
const fs = require('fs');
const path = require('path');
let mainWindow;
// 创建窗口(适配鸿蒙PC大屏、键鼠交互)
function createWindow() {
mainWindow = new BrowserWindow({
width: 1600, // 适配鸿蒙PC常见屏幕尺寸
height: 1000,
webPreferences: {
nodeIntegration: true,
contextIsolation: true, // 启用上下文隔离(安全最佳实践)
preload: path.join(__dirname, 'preload.js')
},
// 鸿蒙PC窗口配置:支持最小化、最大化、关闭按钮,适配桌面操作
frame: true,
resizable: true,
fullscreenable: true,
titleBarStyle: 'default'
});
mainWindow.loadFile('index.html');
mainWindow.webContents.openDevTools(); // 开发阶段启用开发者工具
}
// 初始化应用
app.whenReady().then(createWindow);
// 监听渲染进程的“打开文件”请求(适配PC端文件选择)
ipcMain.on('open-file', (event, options) => {
try {
// 调用鸿蒙PC适配层的文件选择对话框,支持PC端文件导航
const result = dialog.showOpenDialogSync(mainWindow, {
title: '选择文本文件',
filters: [{ name: 'Text Files', extensions: ['txt', 'md', 'js', 'html'] }],
properties: ['openFile', 'createDirectory'] // 鸿蒙PC支持创建新目录
});
if (!result) {
event.returnValue = { success: false, message: '用户取消选择' };
return;
}
const filePath = result[0];
// 读取文件内容(底层调用鸿蒙PC文件管理能力,支持大文件读取优化)
const content = fs.readFileSync(filePath, 'utf8');
// 返回文件路径和内容给渲染进程
event.returnValue = {
success: true,
data: { filePath, content }
};
} catch (err) {
// 发送错误信息给渲染进程
mainWindow.webContents.send('error', '打开文件失败:' + err.message);
event.returnValue = { success: false, message: err.message };
}
});
// 监听渲染进程的“保存文件”请求(适配PC端文件写入)
ipcMain.on('save-file', (event, filePath, content) => {
try {
// 如果未指定文件路径,弹出“另存为”对话框(适配PC端路径选择)
let targetPath = filePath;
if (!targetPath) {
const result = dialog.showSaveDialogSync(mainWindow, {
title: '保存文件',
filters: [{ name: 'Text Files', extensions: ['txt'] }]
});
if (!result) {
event.returnValue = { success: false, message: '用户取消保存' };
return;
}
targetPath = result;
}
// 写入文件内容(底层调用鸿蒙PC文件管理能力,支持大文件写入)
fs.writeFileSync(targetPath, content, 'utf8');
event.returnValue = {
success: true,
data: { filePath: targetPath }
};
} catch (err) {
mainWindow.webContents.send('error', '保存文件失败:' + err.message);
event.returnValue = { success: false, message: err.message };
}
});
// 监听渲染进程的“窗口置顶”请求(鸿蒙PC特有功能)
ipcMain.on('set-window-on-top', (event, isOnTop) => {
try {
mainWindow.setAlwaysOnTop(isOnTop); // 调用鸿蒙PC窗口置顶能力
event.returnValue = { success: true, isOnTop: isOnTop };
} catch (err) {
mainWindow.webContents.send('error', '窗口置顶操作失败:' + err.message);
event.returnValue = { success: false, message: err.message };
}
});
// 窗口关闭逻辑(适配鸿蒙PC退出行为)
app.on('window-all-closed', () => {
if (process.platform !== 'darwin') app.quit();
});
app.on('activate', () => {
if (BrowserWindow.getAllWindows().length === 0) createWindow();
});
- index.js(渲染进程业务逻辑,PC 端交互实现)
// 获取 DOM 元素
const openFileBtn = document.getElementById('open-file');
const saveFileBtn = document.getElementById('save-file');
const setOnTopBtn = document.getElementById('set-on-top');
const filePathEl = document.getElementById('file-path');
const fileContentEl = document.getElementById('file-content');
let currentFilePath = null;
let isWindowOnTop = false; // 记录窗口置顶状态
// 打开文件按钮点击事件(适配PC端交互)
openFileBtn.addEventListener('click', () => {
const result = window.fileViewerAPI.openFile();
if (result.success) {
const { filePath, content } = result.data;
currentFilePath = filePath;
filePathEl.textContent = '当前文件:' + filePath;
fileContentEl.value = content;
} else {
alert(result.message);
}
});
// 保存文件按钮点击事件(适配PC端交互)
saveFileBtn.addEventListener('click', () => {
const content = fileContentEl.value;
if (!content) {
alert('文件内容不能为空');
return;
}
const result = window.fileViewerAPI.saveFile(currentFilePath, content);
if (result.success) {
currentFilePath = result.data.filePath;
filePathEl.textContent = '当前文件:' + currentFilePath;
alert('保存成功!');
} else {
alert(result.message);
}
});
// 窗口置顶按钮点击事件(鸿蒙PC特有功能)
setOnTopBtn.addEventListener('click', () => {
isWindowOnTop = !isWindowOnTop;
const result = window.fileViewerAPI.setWindowOnTop(isWindowOnTop);
if (result.success) {
setOnTopBtn.textContent = isWindowOnTop ? '取消置顶(PC特有)' : '窗口置顶(PC特有)';
alert(isWindowOnTop ? '窗口已置顶' : '已取消窗口置顶');
} else {
alert(result.message);
}
});
// 监听主进程发送的错误信息
window.fileViewerAPI.onError((msg) => {
alert('错误:' + msg);
});
- config.json(鸿蒙应用配置,支持 PC 设备)
{
"app": {
"bundleName": "com.example.fileviewer",
"vendor": "example",
"version": {
"code": 1000000,
"name": "1.0.0"
}
},
"module": {
"package": "com.example.fileviewer",
"name": ".FileViewerModule",
"mainAbility": "com.example.fileviewer.MainAbility",
"deviceType": ["pc", "phone", "tablet", "tv"], // 明确支持鸿蒙PC设备
"abilities": [
{
"name": "com.example.fileviewer.MainAbility",
"type": "page",
"visible": true,
"permissions": [
"ohos.permission.READ_USER_STORAGE",
"ohos.permission.WRITE_USER_STORAGE"
],
"skills": [
{
"entities": ["entity.system.home"],
"actions": ["action.system.home"]
}
]
}
]
}
}
4.3 项目运行与打包(鸿蒙 PC 端)
-
环境准备
- 安装 鸿蒙 DevEco Studio(3.0 及以上版本):DevEco Studio 下载地址
- 安装鸿蒙 PC 适配版 Electron CLI:
npm install -g electron@harmony - 配置鸿蒙 PC 设备(实体鸿蒙 PC 或 PC 模拟器):鸿蒙 PC 设备调试指南
- 安装鸿蒙 PC 适配版打包工具:
npm install -g electron-builder@harmony
-
运行项目
- 进入项目目录,安装依赖:
npm install - 启动开发服务器:
npm start - 在鸿蒙 PC 设备上查看应用,测试 “打开文件”“保存文件”“窗口置顶” 等 PC 特有功能。
- 进入项目目录,安装依赖:
-
打包项目
- 执行打包命令:
npm run build - 打包完成后,在
dist目录下生成鸿蒙 PC APP 包(.app 格式),可安装到鸿蒙 PC 设备上运行。
- 执行打包命令:

五、总结与展望
5.1 核心知识点总结
本文从传统 Electron 架构入手,聚焦鸿蒙 PC 终端,深入分析了鸿蒙 PC Electron 适配层的核心差异与调用链路,可总结为三个关键点:
- 架构适配 PC 化:鸿蒙通过新增 “适配层”,实现了 Electron API 与鸿蒙系统能力的对接,同时针对鸿蒙 PC 的桌面特性进行优化,开发者无需大幅修改业务代码即可适配 PC 端。
- 底层替换轻量化:将传统 Electron 的 Chromium 渲染引擎、Node.js 运行时,替换为鸿蒙的方舟渲染引擎、方舟运行时,显著降低应用体积与资源占用,适配鸿蒙 PC 的桌面级运行需求。
- 能力扩展多端化:在兼容传统 API 的基础上,新增鸿蒙 PC 特有功能(如窗口置顶、文件导航优化)与分布式能力,支持 “一次开发,多端部署”(鸿蒙 PC、手机、平板、智慧屏等)。
5.2 未来发展方向
- API 兼容性完善:鸿蒙团队将持续优化 Node.js 原生模块的鸿蒙 PC 适配,支持更多第三方 Electron 插件(如
electron-store、electron-updater),丰富 PC 端开发生态。 - 性能优化桌面化:进一步优化方舟渲染引擎在鸿蒙 PC 端的 Web 标准兼容性与渲染性能,提升复杂桌面应用(如编辑器、设计工具)的运行流畅度。
- 生态建设聚焦 PC:推动更多开源 Electron 桌面应用(如 VS Code、Postman)适配鸿蒙 PC,完善 PC 端插件市场与开发工具链,构建成熟的鸿蒙 PC 应用生态。
5.3 学习资源推荐
- 官方文档:鸿蒙 Electron 适配指南、Electron 官方文档
- 开源项目:鸿蒙 Electron 适配层源码(GitHub)、鸿蒙 Electron 示例库(GitHub)
- 社区交流:欢迎加入开源鸿蒙 PC 社区,与众多开发者共同探讨鸿蒙 PC 应用开发技巧、分享适配经验,社区地址:https://harmonypc.csdn.net/
通过本文的学习,相信开发者已掌握鸿蒙 PC Electron 适配的核心技术点。建议结合实践案例动手调试,进一步熟悉 PC 端调用链路与代码逻辑,为后续开发鸿蒙 PC 桌面应用打下基础。欢迎加入开源鸿蒙 PC 社区:https://harmonypc.csdn.net/,一起共建鸿蒙 PC 生态!
更多推荐


所有评论(0)