Electron中的Node原生模块

文章内涵 github 图床图片,图裂的话请检查下网络环境

Node 原生模块

.node 文件是一种用于 Node.js 的原生模块。原生模块是一种能在 Node.js 中使用的二进制插件,它通常使用 C 或 C++ 编写,其他的如 Rust 也可以编写,并且编译为 .node 文件。再 node 代码中可以通过 require() 函数来加载和使用这些插件,就像 JavaScript 模块一样。使用其中暴漏出来的一些 api 能力。

比如 用于 windows 环境下置顶窗口的一个库 https://github.com/robinwassen/forcefocus (opens in a new tab) ,就是一个 Node 模块功能库。

Node 模块和 Electron 的一些关系

.node 在 Electron 中 应用的一些名词解释

  1. 编译:因为 .node 文件是二进制的,所以它们需要针对特定的 Node.js 版本和架构进行编译。这是因为 Node.js 和 Electron 使用 V8 JavaScript 引擎的 ABI (Application Binary Interface),而 ABI 随着 Node.js 和 Electron 版本的改变而改变。如果你在不同的环境中使用 .node 文件,可能需要为每个环境单独编译。
  2. Electron 版本:由于 Electron 包含了 Node.js,所以它有自己的 Node.js 版本和 ABI。如果你正在使用 Electron,你需要确保你的 .node 文件是针对你的 Electron 版本编译的,而不是你的系统的 Node.js 版本。
  3. electron-rebuild:由于上述原因,如果你的 Electron 应用依赖于原生插件,那么当你改变 Electron 版本时,你需要重新编译这些插件。这就是 electron-rebuild 包的用途。它可以帮助你重新编译所有的原生插件以匹配你的 Electron 版本。
  4. node-gypnode-gyp 是一个跨平台的工具,用于编译 Node.js 的原生插件。如果你在开发或者构建一个包含 .node 文件的 Electron 应用,你可能需要在你的机器上安装和配置 node-gyp

总的来说, 打包好的 .node 要和此 node 文件运行环境比如 electron 的 node 环境一致,如果不一致,会出现大体如下的错误

Error: The module '/path/to/native/module.node'
was compiled against a different Node.js version using
NODE_MODULE_VERSION $XYZ. This version of Node.js requires
NODE_MODULE_VERSION $ABC. Please try re-compiling or re-installing
the module (for instance, using `npm rebuild` or `npm install`).

要避免这类问题,就要保持打包.node 和运行.node时的 node 环境一致, Node 版本对应的 NODE_MODULE_VERSION 可在 https://nodejs.org/en/download/releases (opens in a new tab) 上进行简单查阅。

人为的去保证打包和使用原生模块的 Node 环境时一件很繁琐的事情,而 electron-rebuild (opens in a new tab)就是为了解决这一事情,它可以快速的帮助开发者打包当前 Electron 对应 Node 版本的原生文件,而是开发者手动的查阅,切换到对应的 Node 版本。

node-gyp就是我们要打包.node文件时的构建工具,不管时自己打包,还是使用electron-rebuild,都需要它。

node-gyp

electron-rebuild官网 (opens in a new tab)说到,node-gyp 时打包.node文件的前提。

Node v12.13.0 or higher is required. Building native modules from source uses node-gyp (opens in a new tab), refer to the link for its installation/runtime requirements.

node-gyp 在 windows 和 mac 上的处理有所区别

  • mac 上需要 python 环境和一些 xcode 配置;
  • windows 上需要 python 环境和  Visual Studio 的一些安装处理, 详见下文

macos

在 macos 上 的 node-gyp 安装方法可以参考 https://eliu.github.io/2020/02/27/node-gyp-rebuild-failed-on-catalina/ (opens in a new tab) 此博客

windows

node-gyp 官网所言 https://github.com/nodejs/node-gyp#on-windows (opens in a new tab)

安装 Visual C++ 构建环境:Visual Studio Build Tools (opens in a new tab)(如果使用早于 VS2019 的版本,则使用“Visual C++ 构建工具”,否则使用“使用 C++ 进行桌面开发”工作负载)或 Visual Studio Community (opens in a new tab)(使用“使用 C++ 进行桌面开发”工作负载) ) python 和  C++ Build Tools 的安装可以使用工具 windows-build-tools (opens in a new tab) 进行

目前在安装 node 的时候,windows-build-tools已经集成进 Node 的安装包内了,如下图

windows 下找不到 Visual Studio 的问题

安装 Visual Studio Community

在 electron 打包forcefocus (opens in a new tab)时,非预期的出现了Could not find any Visual Studio的错误

解决问题思路是,检查 Visual Studio 是否安装,查到文件夹中其实只装了 BuildTools ,并没有装 Community,去官网 (opens in a new tab)下载 installer,按提示安装 Community 即可

注意:安装的时候记得点击勾选使用 C++的桌面开发这一项

安装完毕后, Visual Studio 的文件夹就有了 Community 目录

打开 electron-rebuild debug 模式

// 项目package.json示例
"rebuild": "node-gyp rebuild",
"rebuild-electron": "electron-rebuild -f",
"install": "prebuild-install || node-gyp rebuild",   

满心欢喜的执行 npm run rebuild-electron,还是错误 Could not find any Visual Studio

按照错误提示,我打开了 electron-rebuild 的 debug 模式,如何打开见以下代码,@chatgpt4


要将 DEBUG 环境变量设置为 "electron-rebuild",你可以在命令行使用下面的命令。具体的命令会根据你使用的操作系统和终端不同而有所不同。

如果你在 Unix 或者类 Unix 系统(比如 Linux 或 macOS)的 Bash 或者类似的 shell 中:

DEBUG=electron-rebuild npm run rebuild-electron

如果你在 Windows 的 cmd.exe 中:

set DEBUG=electron-rebuild && npm run rebuild-electron

如果你在 Windows 的 PowerShell 中:

$env:DEBUG='electron-rebuild'; npm run rebuild-electron

这些命令会设置 DEBUG 环境变量并立即运行 npm run rebuild-electron。设置的环境变量只对这个命令有效,不会影响其他的终端会话或者命令。

如果 "electron-rebuild" 提供了更多的 debug 信息,你应该能在你的终端输出中看到。


通过 debug 模式的 log ,找到了问题所在

可以清楚的看到,node-gyp 执行的时候找的不是 Visual Studio 2022(我安装的版本), 而是 Visual Studio 2015,找的到才怪哦。

如果你在使用 electron-rebuild 的时候遇到非预期问题,可以通过 debug 模式来查看详细信息

配置 node-gyp 的 Visual Studio 版本

问题找到了,接下来改去配置 node-gyp 执行过程中,索引到正确的 vs 版本即可。

在网上查阅了一些帖子,大部分都是说让设置 npm cofing 的设置 如下,

// .npmrc文件
msvs_version=2022
msvs-version=2022

但是不起作用,之后在electron-rebuild 的 github issue (opens in a new tab) 中找到了答案:

简单来讲,npm 的 vs 版本设置和 node-gyp 无关,需要设置 GYP_MSVS_VERSION

问题解决

使用 命令 GYP_MSVS_VERSION=2022 npm run rebuild-electron 解决问题,当然,最好的办法是把系统的GYP_MSVS_VERSION 变量全局更改。

.node文件如愿打包,其中 114 116 即不同版本的 electron 对应的 node 环境不同而导致的 NODE_MODULE_VERSION 不同