メインコンテンツへ飛ぶ

Arm 版 Windows

アプリを Electron 6.0.8 以降で実行している場合、Arm 版 Windows 10 向けにビルドできます。 これによりパフォーマンスが大幅に向上しますが、アプリで使用されているネイティブモジュールを再コンパイルする必要があります。 また、ビルドおよびパッケージ化スクリプトの小さな修正が必要になる場合があります。

基本的なアプリの実行

アプリがネイティブモジュールを使用していない場合は、アプリの Arm 版は簡単に作成できます。

  1. アプリの node_modules ディレクトリが空であることを確認してください。
  2. コマンドプロンプト を使用して、set npm_config_arch = arm64 を実行してから、同じように npm install / yarn install を実行します。
  3. Electron を開発用の依存関係としてインストールしている場合、npm は arm64 版をダウンロードして解凍します。 その後、通常どおりアプリをパッケージ化して配布できます。

一般的な考慮事項

アーキテクチャ固有のコード

Windows 固有コードの多くには if... else ロジックが含まれています。これは、x64 アーキテクチャと x86 アーキテクチャのどちらかを選択するものです。

if (process.arch === 'x64') {
// 64 ビット固有の処理をする...
} else {
// 32 ビット固有の処理をする...
}

arm64 をターゲットにしたい場合、このようなロジックは通常間違ったアーキテクチャを選択するため、アプリケーションを慎重に確認したうえで、このような条件のスクリプトを作成してください。 カスタムビルドおよびパッケージスクリプトでは、現在の process.arch に依存するのではなく、環境内の 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 (いずれかのエディション) が必要です。 Visual Studio Community 2017 は、Microsoft の Visual Studio Dev Essentials プログラム からダウンロードできます。 インストール後、コマンドプロンプト から次のコマンドを実行して、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 標準の 開発者向けコマンドプロンプト for VS 2017 は x64 リンカーを使用します 。 これを修正するには以下のようにします。

  1. x64_x86 Cross Tools Command Prompt for VS 2017 ショートカットを複製します (たとえば、スタートメニューで見つけて、右クリックし、ファイルの場所を開く を選択して、コピーアンドペーストします)。
  2. 新しいショートカットで右クリックして、プロパティ を選びます。
  3. Target フィールドを、vcvarsamd64_x86.bat ではなく、最後のvcvarsamd64_arm64.bat を読み取るように変更します。

正常に完了すると、そのコマンドプロンプトは起動時に以下のようなものを出力するはずです。

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

Arm 版 Windows デバイスでアプリケーションを直接開発したい場合は、デバイスの x86 エミュレーションでクロスコンパイルが発生するように、Targetvcvarsx86_arm64.bat に置き換えます。

正しい node.lib に対してリンクする

デフォルトでは、node-gyp は Electron の node ヘッダーをアンパックし、node.lib の x86 および x64 バージョンを %APPDATA%\..\Local\node-gyp\Cache にダウンロードします。ただし、arm64 バージョンはダウンロードされません (この修正は開発中です)。 これを修正するには以下のようにします。

  1. https://electronjs.org/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. ターゲットのデバイスに接続するためには、デバッグ > プロセスにアタッチ... を選択し、デバイスの IP アドレスと Visual Studio Remote Debugger ツールに表示されているポート番号を入力します。
  4. 更新 をクリックしてから、割り当てるべき正しい Electron プロセス を選択します。
  5. アプリのネイティブモジュールのシンボルが正しくロードされていることを確認する必要がある場合があるでしょう。 これを構成するには、Visual Studio 2017 で デバッグ > オプション... に進み、デバッグ > シンボル 下で .pdb シンボルが含まれたフォルダーを追加します。
  6. 接続したら、適切なブレークポイントを設定し、Chrome の Node 向けリモートツール を使用して JavaScript の実行を再開します。

さらなるヘルプが必要な場合

このドキュメントで問題に遭遇した場合、または x86 向けにコンパイルされたアプリが動作しても arm64 向けにコンパイルされたアプリが動作しない場合は、タイトルに "Windows on Arm" と入れて Issue を提出 してください。