ARM 上的 Windows
如果您的应用使用 Electron 6.0.8 或更高版本,现在您可以将其构建为 Windows 10 on Arm 平台。 这将大大提高性能,但需要重新编译应用中使用的任何原生模块。 此外,可能需要对您的构建和打包脚本进行一些小的修改。
运行一个基本应用
如果您的应用不使用任何原生模块,那么创建该应用的 Arm 版本将非常容易。
- 请确保您的应用的
node_modules目录为空。 - 使用命令提示符,在运行
npm install/yarn install之前,先运行set npm_config_arch=arm64。 - 如果您将 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 文件是否适用于 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(任何版本)是交叉编译原生模块所必需的。 您可以通过 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 文件,但标准的Visual Studio 2017 开发人员命令提示符 将使用 x64 链接器。 要解决此问题
- 复制x64_x86 交叉工具命令提示符 for VS 2017 快捷方式(例如,在开始菜单中找到它,右键单击,选择打开文件位置,复制并粘贴)到方便的位置。
- 右键单击新的快捷方式并选择属性。
- 将目标字段更改为
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 设备上开发您的应用程序,请在目标中替换 vcvarsx86_arm64.bat,以便可以使用设备的 x86 模拟进行交叉编译。
链接到正确的 node.lib
默认情况下,node-gyp 解包 Electron 的节点头文件,并将 x86 和 x64 版本的 node.lib 下载到 %APPDATA%\..\Local\node-gyp\Cache 中,但它不会下载 arm64 版本(对此的修复正在开发中)。 要解决此问题
- 从 https://electron.js.cn/headers/v6.0.9/win-arm64/node.lib 下载 arm64
node.lib - 将其移动到
%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 远程调试器(在目标设备上运行)来调试原生模块。 要调试
- 通过命令提示符在目标设备上启动您的应用
.exe(传递--inspect-brk以在加载任何原生模块之前暂停它)。 - 在您的开发机器上启动 Visual Studio 2017。
- 通过选择调试 > 附加到进程... 并输入目标设备的 IP 地址和 Visual Studio 远程调试器工具显示的端口号来连接到目标设备。
- 单击刷新并选择 适当的 Electron 进程以附加。
- 您可能需要确保正确加载了应用中原生模块的任何符号。 要配置此操作,请在 Visual Studio 2017 中转到调试 > 选项...,并在调试 > 符号下添加包含您的
.pdb符号的文件夹。 - 连接后,设置任何适当的断点,并使用 Chrome 的 Node 远程工具 恢复 JavaScript 执行。
获取更多帮助
如果您遇到此文档的问题,或者您的应用在编译为 x86 时有效,但编译为 arm64 时无效,请 提交问题,标题中包含“Windows on Arm”。