Electron Windows on ARM

2023-02-16 17:16 更新

如果您的应用使用Electron 6.0.8及之后的版本,您现在可以在基于ARM的Windows10上构建它。 这大大提高了性能,但需要重新编译应用中使用的任何原生模块。 它还可能需要对生成和打包脚本进行小的修改。

运行基本应用

如果您的应用不使用任何原生模块,那么创建应用的 Arm 版本非常简单。

  1. 确保应用的 node_modules 目录为空。
  2. 使用 命令提示符,运行 set npm_config_arch=arm64,然后像往常一样运行 npm install/yarn install
  3. 如果您已将 Electron 安装为开发依赖项,npm 将下载并解压缩 arm64 版本。 然后,您可以像往常一样打包和分发你的应用。

一般考虑因素

特定于体系结构的代码

许多特定于 Windows 的代码包含在 x64 或 x86 体系结构之间进行选择的 if... else 逻辑。

if (process.arch === 'x64') {
  // 在64位体系结构上执行的代码...
} else {
  // 在32位体系结构上执行的代码...
}

如果您希望以 arm64 为目标,像这样的逻辑通常会选择错误的体系结构,所以仔细检查您的应用程序并为这样的情况编写脚本。 在自定义生成和打包脚本中,应始终检查环境中 npm_config_arch 的值,而不是依赖于当前的 process.arch。

Native modules(原生模块)

如果您使用原生模块,则必须确保它们使用 v142 的 MSVC 编译器(在 Visual Studio 2017 中提供)进行编译。 您还必须检查 native module 提供或引用的 .dll 或 .lib 文件是否可用于 Arm 上的 Windows。

测试应用程序

若要测试您的应用,请使用运行 Windows 10(1903 或更高版本)的 Arm 架构的 Windows 设备。 确保您将应用程序复制到了目标设备——从网络位置加载应用程序资源时,Chromium 的沙盒将无法正常工作。

开发先决条件

Node.js/node-gyp

建议使用 Node.js v12.9.0 或更高版本。 如果您不希望更新到新版本的 Node,则可以 手动更新 npm 的 node-gyp 副本 到 5.0.2 或更高版本,其中包含编译 Arm 原生模块所必需的更改。

Visual Studio 2017

交叉编译本机模块需要 Visual Studio 2017(任何版本)。您可以通过 Microsoft 的 Visual Studio Dev Essentials 程序下载 Visual Studio Community 2017。安装后,您可以通过从命令提示符运行以下命令来添加特定于 Arm 的组件:

vs_installer.exe ^
--add Microsoft.VisualStudio.Workload.NativeDesktop ^
--add Microsoft.VisualStudio.Component.VC.ATLMFC ^
--add Microsoft.VisualStudio.Component.VC.Tools.ARM64 ^
--add Microsoft.VisualStudio.Component.VC.MFC.ARM64 ^
--includeRecommended

创建交叉编译命令提示符

在环境中设置 ​npm_config_arch=arm64​ 会创建正确的 arm64 .obj 文件,但 VS 2017 的标准开发人员命令提示将使用 x64 链接器。要解决此问题:

  1. 将 x64_x86 Cross Tools Command Prompt for VS 2017 快捷方式(例如,将其定位在开始菜单中,右键单击,选择“打开文件位置”,复制并粘贴)复制到方便的位置。

  2. 右键单击新的快捷方式并选择属性。

  3. 将目标字段更改为最后读取 vcvarsamd64_arm64.bat 而不是 vcvarsamd64_x86.bat。

如果成功完成,命令提示符应在启动时打印类似于此的内容:

**********************************************************************
** Visual Studio 2017 Developer Command Prompt v15.9.15
** Copyright (c) 2017 Microsoft Corporation
**********************************************************************
[vcvarsall.bat] Environment initialized for: 'x64_arm64'

如果您想直接在 Windows on Arm 设备上开发您的应用程序,请在 Target 中替换 vcvarsx86_arm64.bat,以便可以使用设备的 x86 仿真进行交叉编译。

与正确的 node.lib 连接

默认情况下,node-gyp 解压 Electron 的节点头并将 x86 和 x64 版本的 node.lib 下载到 %APPDATA%\..\Local\node-gyp\Cache,但它不会下载 arm64 版本(对此的修复正在开发中)要解决此问题:

  1. 从 https://electronjs.org/headers/v6.0.9/win-arm64/node.lib 下载 arm64 node.lib

  2. 将它移动到 %APPDATA%\..\Local\node-gyp\Cache\6.0.9\arm64\node.lib

将 6.0.9 替换为您正在使用的版本。

交叉编译本地模块

完成上述所有操作后,打开交叉编译命令提示符并运行 set npm_config_arch=arm64。然后使用 npm install 正常构建项目。与交叉编译 x86 模块一样,您可能需要删除 node_modules 以强制重新编译本机模块(如果它们之前是为另一种体系结构编译的)。

调试本地模块

调试原生模块可以使用 Visual Studio 2017(运行在开发计算机上)和运行在目标设备上的对应的 Visual Studio 远程调试器 来完成。 调试步骤:

  1. 在目标设备上通过命令提示符启动 .exe 应用(传递 --inspect-brk 参数可以在加载任何 native modules 之前暂停应用)。
  2. 在开发计算机上启动 Visual Studio 2017。
  3. 通过选择 调试 > 访问并输入设备的 IP 地址和 Visual Studio 远程调试器工具显示的端口号,连接到目标设备。
  4. 单击 刷新,然后选择 相应的 Electron 进程以附加
  5. 您可能需要确保应用中原生模块的所有符号都已经正确加载。 要配置此内容,请进入 Visual Studio 2017Debug > Options...,and add the folders containing your .pdb symbols under Debugging > Symbols.
  6. 附加后,设置适当的断点并使用 Chrome 的 用于Node的远程工具 恢复JavaScript的执行。

获取其他帮助

如果您在本文档中遇到问题,或者您的应用在 x86 版本中工作正常,但在 arm64 版本中工作不正常,请 提交问题 并在标题中注明“Windows on Arm”。


以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号