Windows en ARM
Si tu aplicación funciona con Electron 6.0.8 o posterior, ahora puedes construirla para Windows 10 en Arm. Esto aumenta considerablemente el rendimiento, pero necesitará recopilar cualquier módulo nativo usado en tu app. Podría requerir también pequeñas correcciones en tus scripts de construcción y empaquetado.
Ejecutando una aplicación básica
Si tu aplicación no utiliza ningún módulo nativo, entonces es muy fácil crear una versión de tu aplicación para Arm.
- Asegúrate de que el directorio
node_modules
de tu aplicación esté vacío. - Usando el Símbolo del sistema, ejecuta el comando
set npm_config_arch=arm64
antes de ejecutar el comandonpm install
/yarn install
como de costumbre. - Si tienes Electron instalado como una dependencia de desarrollo, npm descargará y descomprimirá la versión arm64. Luego puedes empaquetar y distribuir tu aplicación de manera normal.
Consideraciones generales
Código específico de arquitectura
Mucho del código específico de Windows contiene lógica if... else que selecciona entre arquitecturas x64 o x86.
if (process.arch === 'x64') {
// Do 64-bit thing...
} else {
// Do 32-bit thing...
}
Si deseas apuntar a arm64, la lógica como esta seleccionará la arquitectura incorrecta, por lo que debes verificar cuidadosamente tu aplicación y scripts de compilación para detectar condiciones como esta. En scripts personalizados de construcción y empaquetado, siempre debes comprobar el valor de npm_config_arch
en el entorno, en lugar de depender de la arquitectura del proceso actual.
Módulos nativos
Si utiliza módulos nativos, debe asegurarse de que se compilen con la v142 del compilador MSVC (que se encuentra en Visual Studio 2017). Debes verificar también que cualquier archivo precompilado .dll
o .lib
proporcionado o referenciado por el módulo nativo esté disponible para Windows en Arm.
Probar tu app
Para probar tu aplicación, utiliza un dispositivo con Windows en Arm que ejecute Windows 10 (versión 1903 o posterior). Asegúrate de copiar tu aplicación en el dispositivo de destino, la protección de Chromium no funcionará correctamente cuando se carguen los recursos de tu aplicación desde una ubicación de red.
Prerrequisitos de desarrollo
Node.js/node-gyp
Se recomienda Node.js v12.9.0 o posterior. Si no se desea actualizar a una nueva versión de Node, se puede actualizar manualmente la copia de node-gyp de npm a la versión 5.0.2 o posterior, que contiene los cambios necesarios para compilar módulos nativos para Arm.
Visual Studio 2017
Visual Studio 2017 (cualquier edición) es requerido para la compilación cruzada de módulos nativos. Puedes descargar Visual Studio Community 2017 a través del programa Visual Studio Dev Essentials de Microsoft. Después de la instalación, puede agregar los componentes específicos de Arm ejecutando lo siguiente desde un Símbolo del sistema:
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
Creando un indicador de comando para la compilación cruzada
Establecer npm_config_arch=arm64
en el entorno crea los archivos .obj
correctos para arm64, pero el Command Prompt de Desarrollador para VS 2017 estándar utilizará el enlazador x64. Para solucionar esto:
- Duplica el acceso directo x64_x86 Cross Tools Command Prompt for VS 2017 (por ejemplo, buscándolo en el menú de inicio, haciendo clic derecho, seleccionando Abrir ubicación de archivo, copiando y pegando) en un lugar conveniente.
- Right click the new shortcut and choose Properties.
- Change the Target field to read
vcvarsamd64_arm64.bat
at the end instead ofvcvarsamd64_x86.bat
.
If done successfully, the command prompt should print something similar to this on startup:
**********************************************************************
** Visual Studio 2017 Developer Command Prompt v15.9.15
** Copyright (c) 2017 Microsoft Corporation
**********************************************************************
[vcvarsall.bat] Environment initialized for: 'x64_arm64'
If you want to develop your application directly on a Windows on Arm device, substitute vcvarsx86_arm64.bat
in Target so that cross-compilation can happen with the device's x86 emulation.
Linking against the correct node.lib
By default, node-gyp
unpacks Electron's node headers and downloads the x86 and x64 versions of node.lib
into %APPDATA%\..\Local\node-gyp\Cache
, but it does not download the arm64 version (a fix for this is in development.) Para solucionar esto:
- Download the arm64
node.lib
from https://electronjs.org/headers/v6.0.9/win-arm64/node.lib - Move it to
%APPDATA%\..\Local\node-gyp\Cache\6.0.9\arm64\node.lib
Substitute 6.0.9
for the version you're using.
Cross-compiling native modules
After completing all of the above, open your cross-compilation command prompt and run set npm_config_arch=arm64
. Then use npm install
to build your project as normal. As with cross-compiling x86 modules, you may need to remove node_modules
to force recompilation of native modules if they were previously compiled for another architecture.
Debugging native modules
Debugging native modules can be done with Visual Studio 2017 (running on your development machine) and corresponding Visual Studio Remote Debugger running on the target device. To debug:
- Launch your app
.exe
on the target device via the Command Prompt (passing--inspect-brk
to pause it before any native modules are loaded). - Launch Visual Studio 2017 on your development machine.
- Connect to the target device by selecting Debug > Attach to Process... and enter the device's IP address and the port number displayed by the Visual Studio Remote Debugger tool.
- Click Refresh and select the appropriate Electron process to attach.
- You may need to make sure that any symbols for native modules in your app are loaded correctly. To configure this, head to Debug > Options... in Visual Studio 2017, and add the folders containing your
.pdb
symbols under Debugging > Symbols. - Once attached, set any appropriate breakpoints and resume JavaScript execution using Chrome's remote tools for Node.
Getting additional help
If you encounter a problem with this documentation, or if your app works when compiled for x86 but not for arm64, please file an issue with "Windows on Arm" in the title.