Electron Windows on ARM
如果您的应用使用Electron 6.0.8及之后的版本,您现在可以在基于ARM的Windows10上构建它。 这大大提高了性能,但需要重新编译应用中使用的任何原生模块。 它还可能需要对生成和打包脚本进行小的修改。
运行基本应用
如果您的应用不使用任何原生模块,那么创建应用的 Arm 版本非常简单。
- 确保应用的
node_modules
目录为空。 - 使用 命令提示符,运行
set npm_config_arch=arm64
,然后像往常一样运行npm install
/yarn install
。 - 如果您已将 Electron 安装为开发依赖项,npm 将下载并解压缩 arm64 版本。 然后,您可以像往常一样打包和分发你的应用。
一般考虑因素
特定于体系结构的代码
许多特定于 Windows 的代码包含在 x64 或 x86 体系结构之间进行选择的 if... else 逻辑。
if (process.arch === 'x64') {
// 在64位体系结构上执行的代码...
} else {
// 在32位体系结构上执行的代码...
}
如果您希望以 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 的组件:
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 链接器。要解决此问题:
-
将 x64_x86 Cross Tools Command Prompt 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 设备上开发您的应用程序,请在 Target 中替换 vcvarsx86_arm64.bat,以便可以使用设备的 x86 仿真进行交叉编译。
与正确的 node.lib 连接
默认情况下,node-gyp 解压 Electron 的节点头并将 x86 和 x64 版本的 node.lib 下载到 %APPDATA%\..\Local\node-gyp\Cache,但它不会下载 arm64 版本(对此的修复正在开发中)要解决此问题:
-
从 https://electronjs.org/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
参数可以在加载任何 native modules 之前暂停应用)。 - 在开发计算机上启动 Visual Studio 2017。
- 通过选择 调试 > 访问并输入设备的 IP 地址和 Visual Studio 远程调试器工具显示的端口号,连接到目标设备。
- 单击 刷新,然后选择 相应的 Electron 进程以附加。
- 您可能需要确保应用中原生模块的所有符号都已经正确加载。 要配置此内容,请进入 Visual Studio 2017Debug > Options...,and add the folders containing your
.pdb
symbols under Debugging > Symbols. - 附加后,设置适当的断点并使用 Chrome 的 用于Node的远程工具 恢复JavaScript的执行。
获取其他帮助
如果您在本文档中遇到问题,或者您的应用在 x86 版本中工作正常,但在 arm64 版本中工作不正常,请 提交问题 并在标题中注明“Windows on Arm”。
更多建议: