跳到主内容

Windows on ARM

如果你的应用运行在 Electron 6.0.8 或更高版本上,你现在可以为 Windows 10 on Arm 构建应用。这能显著提升性能,但需要重新编译你的应用中使用的任何原生模块。它还可能需要对你的构建和打包脚本进行一些小修改。

运行一个基本应用

如果你的应用没有使用任何原生模块,那么创建你的应用的 Arm 版本就非常容易。

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

一般注意事项

架构特定的代码

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

if (process.arch === 'x64') {
// Do 64-bit thing...
} else {
// Do 32-bit thing...
}

如果你想 targeting arm64,这样的逻辑通常会选择错误的架构,因此请仔细检查你的应用和构建脚本中是否存在此类条件。在自定义构建和打包脚本中,你应该始终检查环境变量中 npm_config_arch 的值,而不是依赖当前进程的架构。

原生模块

如果你使用原生模块,必须确保它们是针对 MSVC 编译器 v142 版本(Visual Studio 2017 中提供)编译的。你还必须检查原生模块提供或引用的任何预构建的 .dll.lib 文件是否可用于 Windows on Arm。

测试你的应用

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

开发前置条件

Node.js/node-gyp

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

Visual Studio 2017

交叉编译原生模块需要 Visual Studio 2017(任何版本)。你可以通过微软的 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_x86.bat 更改为 vcvarsamd64_arm64.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 设备上开发你的应用,请在*目标*字段中替换为 vcvarsx86_arm64.bat,以便可以使用设备的 x86 模拟进行交叉编译。

链接正确的 node.lib

默认情况下,node-gyp 会解压 Electron 的 node 头文件并将 x86 和 x64 版本的 node.lib 下载到 %APPDATA%\..\Local\node-gyp\Cache 中,但它不会下载 arm64 版本(正在开发修复程序)。为了解决这个问题

  1. https://electron.js.cn/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 参数可以在加载任何原生模块之前暂停它)。
  2. 在你的开发机上启动 Visual Studio 2017。
  3. 通过选择*调试 > 附加到进程...* 连接到目标设备,并输入设备的 IP 地址和 Visual Studio 远程调试器工具显示的端口号。
  4. 点击*刷新*并选择要附加的相应 Electron 进程
  5. 你可能需要确保应用中原生模块的符号正确加载。要配置此项,请在 Visual Studio 2017 中前往*调试 > 选项...*,并在*调试 > 符号*下添加包含 .pdb 符号的文件夹。
  6. 附加后,设置合适的断点,并使用 Chrome 的适用于 Node 的远程工具恢复 JavaScript 执行。

获取更多帮助

如果你遇到本文档的问题,或者你的应用编译为 x86 时可以工作但编译为 arm64 时不行,请提交一个 issue,并在标题中包含“Windows on Arm”字样。