跳到主要内容

Windows on ARM

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

运行基本应用程序

如果您的应用程序不使用任何原生模块,那么创建 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...
}

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

原生模块

如果您使用原生模块,您必须确保它们针对 MSVC 编译器的 v142 版本(在 Visual Studio 2017 中提供)进行编译。 您还必须检查原生模块提供或引用的任何预构建的 .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 program 下载 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 文件,但标准的 Developer Command Prompt for VS 2017 将使用 x64 链接器。 要解决此问题

  1. 复制 x64_x86 Cross Tools Command Prompt for VS 2017 快捷方式(例如,通过在开始菜单中找到它,右键单击,选择 Open File Location,复制并粘贴)到方便的位置。
  2. 右键单击新的快捷方式并选择 Properties
  3. 更改 Target 字段,使其在末尾读取 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'

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

链接到正确的 node.lib

默认情况下,node-gyp 解压缩 Electron 的 node 标头并将 node.lib 的 x86 和 x64 版本下载到 %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 Remote Debugger 来调试原生模块。 要调试

  1. 通过命令提示符在目标设备上启动您的应用程序 .exe(传递 --inspect-brk 以在加载任何原生模块之前暂停它)。
  2. 在您的开发机器上启动 Visual Studio 2017。
  3. 通过选择Debug > Attach to Process... 连接到目标设备,并输入设备的 IP 地址和 Visual Studio Remote Debugger 工具显示的端口号。
  4. 单击 Refresh 并选择要附加的相应 Electron 进程
  5. 您可能需要确保正确加载应用程序中原生模块的任何符号。 要配置此设置,请转到 Visual Studio 2017 中的 Debug > Options...,并在 Debugging > Symbols 下添加包含您的 .pdb 符号的文件夹。
  6. 连接后,设置任何适当的断点,并使用 Chrome 的 Node 远程工具恢复 JavaScript 执行。

获取更多帮助

如果您遇到本文档的问题,或者您的应用程序在编译为 x86 时有效但在编译为 arm64 时无效,请提交问题,并在标题中包含“Windows on Arm”。