Windows on ARM

如果您的应用使用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 逻辑。

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

如果您希望以 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 组件:

  1. vs_installer.exe ^
  2. --add Microsoft.VisualStudio.Workload.NativeDesktop ^
  3. --add Microsoft.VisualStudio.Component.VC.ATLMFC ^
  4. --add Microsoft.VisualStudio.Component.VC.Tools.ARM64
  5. --add Microsoft.VisualStudio.Component.VC.MFC.ARM64 ^
  6. --inclusdeRecommendation

创建交叉编译命令提示符

在环境中设置 npm_config_arch=arm64 以创建正确的 arm64 .obj 文件, 但是VS 2017 的Developer Command Prompt 将使用x64链接器。 要解决这个问题:

  1. 请将位于开始菜单中的 x64_x86 Cross Tools Command Prompt for VS 2017 快捷方式复制一份到方便的位置(例如,通过定位到快捷方式,右键单击,选择 打开文件位置,然后复制并粘贴)。
  2. 右键单击新快捷方式并选择 属性
  3. Target 字段改为在结尾处读取 vcvarsamd64_arm64.bat ,而不是 vcvarsamd64_x86.bat

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

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

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

与正确的 node.lib 连接

默认情况下, node-gyp 解包了Electron的Node Headers,并将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”。