认识一下Electron中的.node模块

2023年 7月 21日 50.6k 0

Node原生模块

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

比如 用于windows环境下置顶窗口的一个库 github.com/robinwassen… ,就是一个Node模块功能库。

Node模块和Electron的一些关系

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

  • 编译:因为 .node 文件是二进制的,所以它们需要针对特定的 Node.js 版本和架构进行编译。这是因为 Node.js 和 Electron 使用 V8 JavaScript 引擎的 ABI (Application Binary Interface),而 ABI 随着 Node.js 和 Electron 版本的改变而改变。如果你在不同的环境中使用 .node 文件,可能需要为每个环境单独编译。

  • Electron 版本:由于 Electron 包含了 Node.js,所以它有自己的 Node.js 版本和 ABI。如果你正在使用 Electron,你需要确保你的 .node 文件是针对你的 Electron 版本编译的,而不是你的系统的 Node.js 版本。

  • electron-rebuild:由于上述原因,如果你的 Electron 应用依赖于原生插件,那么当你改变 Electron 版本时,你需要重新编译这些插件。这就是 electron-rebuild 包的用途。它可以帮助你重新编译所有的原生插件以匹配你的 Electron 版本。

  • node-gyp:node-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 可在 nodejs.org/en/download… 上进行简单查阅。

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

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

    node-gyp

    electron-rebuild官网说到,node-gyp时打包.node文件的前提。

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

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

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

    macos

    在macos上 的 node-gyp 安装方法可以参考 eliu.github.io/2020/02/27/… 此博客

    windows

    node-gyp官网所言 github.com/nodejs/node…

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

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

    windows下找不到Visual Studio的问题

    安装 Visual Studio Community

    在electron打包forcefocus时,非预期的出现了Could not find any Visual Studio的错误

    解决问题思路是,检查 Visual Studio 是否安装,查到文件夹中其实只装了 BuildTools ,并没有装 Community,去官网下载 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 中找到了答案:

    简单来讲,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不同

    相关文章

    服务器端口转发,带你了解服务器端口转发
    服务器开放端口,服务器开放端口的步骤
    产品推荐:7月受欢迎AI容器镜像来了,有Qwen系列大模型镜像
    如何使用 WinGet 下载 Microsoft Store 应用
    百度搜索:蓝易云 – 熟悉ubuntu apt-get命令详解
    百度搜索:蓝易云 – 域名解析成功但ping不通解决方案

    发布评论