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. --includeRecommended

创建交叉编译命令提示符

Setting npm_config_arch=arm64 in the environment creates the correct arm64 .obj files, but the standard Developer Command Prompt for VS 2017 will use the x64 linker. To fix this:

  1. Duplicate the x64_x86 Cross Tools Command Prompt for VS 2017 shortcut (e.g. by locating it in the start menu, right clicking, selecting Open File Location, copying and pasting) to somewhere convenient.
  2. Right click the new shortcut and choose Properties.
  3. Change the Target field to read vcvarsamd64_arm64.bat at the end instead of vcvarsamd64_x86.bat.

If done successfully, the command prompt should print something similar to this on startup:

  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'

If you want to develop your application directly on a Windows on Arm device, substitute vcvarsx86_arm64.bat in Target so that cross-compilation can happen with the device’s x86 emulation.

与正确的 node.lib 连接

By default, node-gyp unpacks Electron’s node headers and downloads the x86 and x64 versions of node.lib into %APPDATA%\..\Local\node-gyp\Cache, but it does not download the arm64 version (a fix for this is in development.) To fix this:

  1. Download the arm64 node.lib from https://electronjs.org/headers/v6.0.9/win-arm64/node.lib
  2. Move it to %APPDATA%\..\Local\node-gyp\Cache\6.0.9\arm64\node.lib

Substitute 6.0.9 for the version you’re using.

交叉编译本地模块

After completing all of the above, open your cross-compilation command prompt and run set npm_config_arch=arm64. Then use npm install to build your project as normal. As with cross-compiling x86 modules, you may need to remove node_modules to force recompilation of native modules if they were previously compiled for another architecture.

调试本地模块

调试原生模块可以使用 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”。