使用ava时NODE_MODULE_VERSION不正确

Dan*_*ens 5 node.js nodegit electron ava spectron

我编写了一个使用nodegit的 Electron 应用程序。对于我的测试部分,我结合使用ava和 Spectron 来测试我的应用程序。我的所有测试都有效 - 包括在我的应用程序中使用nodegit 的功能。

除了上述测试之外,我还制作了一个纯非 Electron测试文件,在其中直接导入 nodegit。

 import * as nodegit from 'nodegit';
Run Code Online (Sandbox Code Playgroud)

现在通过ava执行此测试将返回:

node_modules\.pnpm\nodegit@0.27.0\node_modules\nodegit\build\Release\nodegit.node'
was compiled against a different Node.js version using
NODE_MODULE_VERSION 82. This version of Node.js requires
NODE_MODULE_VERSION 83. Please try re-compiling or re-installing
the module (for instance, using `npm rebuild` or `npm install`).
    at Module._extensions..node (internal/modules/cjs/loader.js:1122:18)
Run Code Online (Sandbox Code Playgroud)

82版本到底来自哪里?我只安装了nodejs 14.15.0,它使用了83预期的版本。为什么节点认为该版本与我的应用程序中实际运行的版本不匹配?这就是我的package.json样子:

  "devDependencies": {
    "ava": "^3.13.0",
  },
  "scripts": {
    "ava": "node_modules/.bin/ava",
     ...
  },
  "ava": {
    "files": [
      "*.ts"
    ],
    "extensions": [
      "ts"
    ],
    "require": [
      "ts-node/register"
    ],
    "nodeArguments": [
      "--napi-modules",
      "--experimental-modules"
    ]
  },
Run Code Online (Sandbox Code Playgroud)

nodegit自己构建,在config.gypi文件中它甚至引用了:

    "node_module_version": 83,
Run Code Online (Sandbox Code Playgroud)

我做了一个超级简单的可重现示例:https ://github.com/Githubber2021/node_module_version-issue

% node --version
14.15.0
% npm install
% npm run ava
... error
Run Code Online (Sandbox Code Playgroud)

谁能解释一下这是一个错误还是 82 版本来自哪里?

小智 5

答案已经解决了,只需添加一种方法即可。

如前所述,无论每个 Node.js 的版本如何,Node.J 的 ABI(应用程序二进制接口)可能与 Electron 使用的 Node.js 的 ABI 不同。

因此,您使用 NPM 安装一个本机模块,该模块使用具有相应 NODE_MODULE_VERSION (ABI) 的 Node.js 构建正常,但是当 Electron 尝试使用它时,您会收到错误,要求您的模块使用 Node.js 的 ABI 版本。 Electron.js 包含在 Electron 中。

另一种方法:

像任何其他 Node 项目一样安装模块,然后使用electro-rebuild包为 Electron 进行重建。

npm install --save-dev electron-rebuild
./node_modules/.bin/electron-rebuild
Run Code Online (Sandbox Code Playgroud)

笔记

  1. 这将重建您已经构建的模块,但这次会自动查找您拥有的 Electron 版本的标头。
  2. 每次运行“ npm install ”时都需要重复此操作(或在 package.json 的脚本部分添加序列)。
  3. 使用“Electron Forge”,该工具会在开发或制作可发行版时自动应用。使用“Electron Packager”,您可以查看该项目的自述文件。

来源: https: //github.com/electron/electron-rebuild