Electron Windows on ARM

2023-02-16 17:16 更新

如果您的應(yīng)用使用Electron 6.0.8及之后的版本,您現(xiàn)在可以在基于ARM的Windows10上構(gòu)建它。 這大大提高了性能,但需要重新編譯應(yīng)用中使用的任何原生模塊。 它還可能需要對(duì)生成和打包腳本進(jìn)行小的修改。

運(yùn)行基本應(yīng)用?

如果您的應(yīng)用不使用任何原生模塊,那么創(chuàng)建應(yīng)用的 Arm 版本非常簡(jiǎn)單。

  1. 確保應(yīng)用的 node_modules 目錄為空。
  2. 使用 命令提示符,運(yùn)行 set npm_config_arch=arm64,然后像往常一樣運(yùn)行 npm install/yarn install。
  3. 如果您已將 Electron 安裝為開(kāi)發(fā)依賴項(xiàng),npm 將下載并解壓縮 arm64 版本。 然后,您可以像往常一樣打包和分發(fā)你的應(yīng)用。

一般考慮因素?

特定于體系結(jié)構(gòu)的代碼?

許多特定于 Windows 的代碼包含在 x64 或 x86 體系結(jié)構(gòu)之間進(jìn)行選擇的 if... else 邏輯。

if (process.arch === 'x64') {
  // 在64位體系結(jié)構(gòu)上執(zhí)行的代碼...
} else {
  // 在32位體系結(jié)構(gòu)上執(zhí)行的代碼...
}

如果您希望以 arm64 為目標(biāo),像這樣的邏輯通常會(huì)選擇錯(cuò)誤的體系結(jié)構(gòu),所以仔細(xì)檢查您的應(yīng)用程序并為這樣的情況編寫(xiě)腳本。 在自定義生成和打包腳本中,應(yīng)始終檢查環(huán)境中 npm_config_arch 的值,而不是依賴于當(dāng)前的 process.arch。

Native modules(原生模塊)

如果您使用原生模塊,則必須確保它們使用 v142 的 MSVC 編譯器(在 Visual Studio 2017 中提供)進(jìn)行編譯。 您還必須檢查 native module 提供或引用的 .dll 或 .lib 文件是否可用于 Arm 上的 Windows。

測(cè)試應(yīng)用程序?

若要測(cè)試您的應(yīng)用,請(qǐng)使用運(yùn)行 Windows 10(1903 或更高版本)的 Arm 架構(gòu)的 Windows 設(shè)備。 確保您將應(yīng)用程序復(fù)制到了目標(biāo)設(shè)備——從網(wǎng)絡(luò)位置加載應(yīng)用程序資源時(shí),Chromium 的沙盒將無(wú)法正常工作。

開(kāi)發(fā)先決條件?

Node.js/node-gyp?

建議使用 Node.js v12.9.0 或更高版本。 如果您不希望更新到新版本的 Node,則可以 手動(dòng)更新 npm 的 node-gyp 副本 到 5.0.2 或更高版本,其中包含編譯 Arm 原生模塊所必需的更改。

Visual Studio 2017?

交叉編譯本機(jī)模塊需要 Visual Studio 2017(任何版本)。您可以通過(guò) Microsoft 的 Visual Studio Dev Essentials 程序下載 Visual Studio Community 2017。安裝后,您可以通過(guò)從命令提示符運(yùn)行以下命令來(lái)添加特定于 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

創(chuàng)建交叉編譯命令提示符

在環(huán)境中設(shè)置 ?npm_config_arch=arm64? 會(huì)創(chuàng)建正確的 arm64 .obj 文件,但 VS 2017 的標(biāo)準(zhǔn)開(kāi)發(fā)人員命令提示將使用 x64 鏈接器。要解決此問(wèn)題:

  1. 將 x64_x86 Cross Tools Command Prompt for VS 2017 快捷方式(例如,將其定位在開(kāi)始菜單中,右鍵單擊,選擇“打開(kāi)文件位置”,復(fù)制并粘貼)復(fù)制到方便的位置。

  2. 右鍵單擊新的快捷方式并選擇屬性。

  3. 將目標(biāo)字段更改為最后讀取 vcvarsamd64_arm64.bat 而不是 vcvarsamd64_x86.bat。

如果成功完成,命令提示符應(yīng)在啟動(dòng)時(shí)打印類似于此的內(nèi)容:

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

如果您想直接在 Windows on Arm 設(shè)備上開(kāi)發(fā)您的應(yīng)用程序,請(qǐng)?jiān)?nbsp;Target 中替換 vcvarsx86_arm64.bat,以便可以使用設(shè)備的 x86 仿真進(jìn)行交叉編譯。

與正確的 node.lib 連接

默認(rèn)情況下,node-gyp 解壓 Electron 的節(jié)點(diǎn)頭并將 x86 和 x64 版本的 node.lib 下載到 %APPDATA%\..\Local\node-gyp\Cache,但它不會(huì)下載 arm64 版本(對(duì)此的修復(fù)正在開(kāi)發(fā)中)要解決此問(wèn)題:

  1. 從 https://electronjs.org/headers/v6.0.9/win-arm64/node.lib 下載 arm64 node.lib

  2. 將它移動(dòng)到 %APPDATA%\..\Local\node-gyp\Cache\6.0.9\arm64\node.lib

將 6.0.9 替換為您正在使用的版本。

交叉編譯本地模塊

完成上述所有操作后,打開(kāi)交叉編譯命令提示符并運(yùn)行 set npm_config_arch=arm64。然后使用 npm install 正常構(gòu)建項(xiàng)目。與交叉編譯 x86 模塊一樣,您可能需要?jiǎng)h除 node_modules 以強(qiáng)制重新編譯本機(jī)模塊(如果它們之前是為另一種體系結(jié)構(gòu)編譯的)。

調(diào)試本地模塊?

調(diào)試原生模塊可以使用 Visual Studio 2017(運(yùn)行在開(kāi)發(fā)計(jì)算機(jī)上)和運(yùn)行在目標(biāo)設(shè)備上的對(duì)應(yīng)的 Visual Studio 遠(yuǎn)程調(diào)試器 來(lái)完成。 調(diào)試步驟:

  1. 在目標(biāo)設(shè)備上通過(guò)命令提示符啟動(dòng) .exe 應(yīng)用(傳遞 --inspect-brk 參數(shù)可以在加載任何 native modules 之前暫停應(yīng)用)。
  2. 在開(kāi)發(fā)計(jì)算機(jī)上啟動(dòng) Visual Studio 2017。
  3. 通過(guò)選擇 調(diào)試 > 訪問(wèn)并輸入設(shè)備的 IP 地址和 Visual Studio 遠(yuǎn)程調(diào)試器工具顯示的端口號(hào),連接到目標(biāo)設(shè)備。
  4. 單擊 刷新,然后選擇 相應(yīng)的 Electron 進(jìn)程以附加。
  5. 您可能需要確保應(yīng)用中原生模塊的所有符號(hào)都已經(jīng)正確加載。 要配置此內(nèi)容,請(qǐng)進(jìn)入 Visual Studio 2017Debug > Options...,and add the folders containing your .pdb symbols under Debugging > Symbols.
  6. 附加后,設(shè)置適當(dāng)?shù)臄帱c(diǎn)并使用 Chrome 的 用于Node的遠(yuǎn)程工具 恢復(fù)JavaScript的執(zhí)行。

獲取其他幫助?

如果您在本文檔中遇到問(wèn)題,或者您的應(yīng)用在 x86 版本中工作正常,但在 arm64 版本中工作不正常,請(qǐng) 提交問(wèn)題 并在標(biāo)題中注明“Windows on Arm”。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)