4

我使用n-api编写了一个 c++ 模块,用cmake-js编译它,现在想在我的electron-vue应用程序中使用它。electron-vue如果我在没有它的项目中使用该模块。但是当我尝试在我的electron-vue应用程序中使用它时,我总是遇到这个错误:

 App threw an error during load
 TypeError: Cannot read property 'indexOf' of undefined
      at Function.getFileName (D:\temp\test2\node_modules\bindings\bindings.js:178:16)
      at bindings (D:\temp\test2\node_modules\bindings\bindings.js:82:48)
      at eval (webpack:///./src/main/index.js?:28:67)
      at Module../src/main/index.js (D:\temp\test2\dist\electron\main.js:3822:1)
      at __webpack_require__ (D:\temp\test2\dist\electron\main.js:21:30)
      at eval (webpack:///./src/main/index.dev.js?:11:1)
      at Object../src/main/index.dev.js (D:\temp\test2\dist\electron\main.js:3810:1)
      at __webpack_require__ (D:\temp\test2\dist\electron\main.js:21:30)
      at eval (webpack:///multi_./src/main/index.dev.js_./src/main/index.js?:1:1)
      at Object.0 (D:\temp\test2\dist\electron\main.js:3880:1)

我正在使用这样的绑定

const colorBalance = require('bindings')('colorBalance');

我试图根据这个将我的模块定义为外部的,但它没有解决问题:

// vue.config.js
module.exports = {
  pluginOptions: {
    electronBuilder: {
      externals: ['NameOfMyModule']
    }
  }
}
4

4 回答 4

1

很可能您正在尝试将方法“indexOf”应用于尚未定义的变量。查看文档https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf。检查您的变量是否在某处定义,它应该是数组类型。

于 2020-01-23T10:13:43.530 回答
0

我通过将构建链从 更改为 解决了我的cmake问题gyp。编译gyp一切正常。

于 2020-01-26T09:23:16.933 回答
0

@grobotor,关于自助注册问题。请参阅这些资源:)

TLDR;我在 bindings.gyp 中发现我的问题是由于这个

"sources": [ ],

当我尝试在 Linux 上运行自动测试时,这导致了错误“错误:模块没有自注册”(因为模块只为 mac 构建) https://github.com/codebytere/node-mac-permissions/issues /23

关于您的原始问题,我认为 electronBuilder externals 不应该是该属性的位置,因为它是一个打包程序。externals需要配置 bundler,比如用 webpack的externals

我的配置示例:

// Bundle all deps when building dist (except native modules), otherwise streamline development by just using local node_modules dir
externals: packDistributable ? [{
    permissions: "node-mac-permissions"
}] : [nodeExternals()],
于 2021-03-12T19:47:49.960 回答
0

与此同时,我尝试在没有以下情况下导入模块bindings

const colorBalance = require('../../build/Release/colorBalance.node');

然后我收到一个新错误:

Error: Cannot open D:\temp\test2\build\Release\colorBalance.node: Error: Module did not self-register.
      at Object.eval (webpack:///./build/Release/colorBalance.node?:1:155)
      at eval (webpack:///./build/Release/colorBalance.node?:2:30)
      at Object../build/Release/colorBalance.node (D:\temp\test2\dist\electron\main.js:97:1)
      at __webpack_require__ (D:\temp\test2\dist\electron\main.js:21:30)
      at eval (webpack:///./src/main/index.js?:28:20)
      at Module../src/main/index.js (D:\temp\test2\dist\electron\main.js:3833:1)
      at __webpack_require__ (D:\temp\test2\dist\electron\main.js:21:30)
      at eval (webpack:///./src/main/index.dev.js?:11:1)
      at Object../src/main/index.dev.js (D:\temp\test2\dist\electron\main.js:3821:1)
      at __webpack_require__ (D:\temp\test2\dist\electron\main.js:21:30)

我已经使用electron-rebuild. win_delay_load_hook 我在这里读过并尝试过但错误并没有消失。

于 2020-01-25T14:30:24.543 回答