【鸿蒙PC】在 HarmonyOS 上跑 Electron?手把手教你搞定桌面欢迎页!(Mac版)

🚀 在 HarmonyOS 上跑 Electron?手把手教你搞定桌面欢迎页!

欢迎加入开源鸿蒙PC社区:https://harmonypc.csdn.net/

项目地址:https://atomgit.com/VON-/electron-oh-pc/tree/project01

一句话总结:Electron 不只能做 Windows/macOS 应用!在华为 HarmonyOS PC 端也能运行。本文带你从零拉取官方仓库、解决白屏问题、配置签名,并成功运行一个炫酷的欢迎界面!

大家好,我是 VON。最近在研究 HarmonyOS 的桌面端能力,发现华为居然提供了 Electron 定制版!这意味着我们可以用熟悉的 HTML/CSS/JS 技术,在 HarmonyOS PC 上开发桌面应用了!

但过程并不完全顺利------白屏、报错、签名缺失......踩了一堆坑后,终于跑通了!今天就把完整流程分享出来,帮你少走弯路!


🔧 一、准备工作:环境 & 项目拉取

1. 环境要求

  • DevEco Studio :6.0.2(建议使用最新版)
  • Node.js :24.14.0(必须 ≥ 18)

2. 拉取官方 Electron 项目

华为已将适配后的 Electron 托管在 CodeHub:

🔗 项目地址:https://devcloud.cn-north-4.huaweicloud.com/codehub/project/b19f5ea8ffd4492ea8c06ca2ebf3f858/codehub/2821214/home?ref=electron34-release

✅ 建议选择 最新 release 分支 (我用的是 electron34-release,对应 Electron 34.8.0)

点击"克隆/下载"即可:


⚙️ 二、项目配置与签名

  1. 用 DevEco Studio 打开项目中的 ohos_hap 文件夹;
  2. 检查是否生成了 arm 架构的编译产物(路径通常为 build/default/outputs/default/);
  3. 必须配置签名文件! 否则无法安装运行。
    Project Structure → Signing Configs 中添加你的调试证书或正式证书:

💡 小贴士:可使用 DevEco 自动生成的调试证书,仅用于本地测试。


🖥️ 三、首次运行:白屏?别慌!

第一次点击运行,大概率会看到一个纯白窗口👇

这是因为在某些 HarmonyOS PC 设备上,硬件加速与 Chromium 渲染存在兼容性问题

✅ 解决方案:禁用硬件加速!

main.js 的最顶部(必须在 app.whenReady() 之前)添加:

js 复制代码
const { app } = require('electron');

// ✅ 关键修复:禁用硬件加速
app.disableHardwareAcceleration();

// ...后续创建窗口逻辑

📌 注意:一定要加括号调用 (),否则无效!

保存后重新运行,恭喜你!页面终于显示出来了👇


📂 四、代码存放位置(重要!)

所有你的 Electron 应用代码(HTML/CSS/JS)必须放在以下目录

复制代码
src/main/resources/resfile/resources/app/

在这个 app 文件夹里,你可以像开发普通 Electron 应用一样,放置 index.htmlmain.jspreload.js 等文件。

例如我的项目结构:

复制代码
app/
├── index.html
├── main.js
└── preload.js

🛑 五、踩坑指南:这些雷千万别踩!

❌ 坑 1:试图在手机上运行 Electron

Electron 是桌面框架!不支持手机!

如果你在真机(手机/平板)上运行,会直接报错:

复制代码
Error code: 801
Error message: Capability not supported. Failed to call the API due to limited device capabilities.

正确做法 :仅在 HarmonyOS PC 模拟器或真机 上运行。

❌ 坑 2:忘记禁用硬件加速

后果就是------白屏!永远白屏!

记住口诀app.disableHardwareAcceleration(); 放最前,加括号,保平安!


💻 六、源码展示:一个炫酷的欢迎页

最后附上我实现的欢迎界面核心代码,带系统信息显示和交互反馈:

index.html

html 复制代码
<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8" />
  <title>Electron 欢迎页面</title>
  <style>
    body {
      background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
      height: 100vh;
      display: flex;
      justify-content: center;
      align-items: center;
      color: white;
      font-family: 'Segoe UI', sans-serif;
    }
    .card {
      background: rgba(255,255,255,0.15);
      padding: 2rem;
      border-radius: 12px;
      backdrop-filter: blur(10px);
      text-align: center;
    }
    button {
      background: white;
      color: #667eea;
      border: none;
      padding: 0.8rem 2rem;
      border-radius: 50px;
      cursor: pointer;
      margin-top: 1rem;
    }
  </style>
</head>
<body>
  <div class="card">
    <h1>欢迎使用 Electron</h1>
    <p>Node: <span id="node"></span></p>
    <p>Electron: <span id="electron"></span></p>
    <button onclick="test()">点击测试</button>
  </div>

  <script>
    window.addEventListener('DOMContentLoaded', () => {
      const info = window.electronAPI.getSystemInfo();
      document.getElementById('node').textContent = info.nodeVersion;
      document.getElementById('electron').textContent = info.electronVersion;
    });

    function test() {
      window.electronAPI.showAlert('🎉 运行成功!');
    }
  </script>
</body>
</html>

main.js(关键部分)

js 复制代码
const { app, BrowserWindow } = require('electron');
const path = require('path');

// ✅ 必须放最前面!
app.disableHardwareAcceleration();

function createWindow() {
  const win = new BrowserWindow({
    width: 800,
    height: 600,
    webPreferences: {
      nodeIntegration: false,
      contextIsolation: true,
      preload: path.join(__dirname, 'preload.js')
    }
  });
  win.loadFile('index.html');
  win.webContents.openDevTools(); // 方便调试
}
// ...其余生命周期代码

preload.js

js 复制代码
const { contextBridge } = require('electron');

contextBridge.exposeInMainWorld('electronAPI', {
  getSystemInfo: () => ({
    nodeVersion: process.versions.node,
    electronVersion: process.versions.electron,
    os: `${process.platform} (${process.arch})`
  }),
  showAlert: (msg) => alert(msg)
});

✅ 总结

  • ✅ Electron 可在 HarmonyOS PC 端运行;
  • ✅ 必须 禁用硬件加速,否则白屏;
  • ✅ 代码放在 resources/app/ 目录下;
  • 不能在手机上运行,会报错 801;
  • ✅ 需要正确配置 签名文件

虽然目前生态还在早期,但能用 Web 技术开发 HarmonyOS 桌面应用,对前端开发者来说是个巨大利好!

相关推荐
ada0_ada19 小时前
qt模块学习记录
开发语言·qt·学习
liulilittle9 小时前
C++ 无锁编程:单停多发送场景高性能方案
服务器·开发语言·c++·高性能·无锁·原子
飞Link9 小时前
大模型时代的“语言编程”:Prompt Engineering (提示词工程) 深度解析与实战指南
开发语言·python·prompt
无限进步_9 小时前
【C++】巧用静态变量与构造函数:一种非常规的求和实现
开发语言·c++·git·算法·leetcode·github·visual studio
Advancer-9 小时前
RedisTemplate 两种序列化实践方案
java·开发语言·redis
郝学胜-神的一滴9 小时前
Socket实战:从单端聊天到多用户连接的实现秘籍
服务器·开发语言·python·网络协议·pycharm
小超超爱学习99379 小时前
大数乘法,超级简单模板
开发语言·c++·算法
java1234_小锋9 小时前
Java高频面试题:MyBatis如何实现动态数据源切换?
java·开发语言·mybatis
knighthood20019 小时前
Qt5.15+VTK9.3.0实现点云点选功能
开发语言·qt
墨神谕10 小时前
Java中,为什么要将.java文件编译成,class文件,而不是直接将.java编译成机器码
java·开发语言