无法在 NW.js 上使用库 - 针对不同的 Node.js 版本使用

Can't use library on NW.js - was compiled against a different Node.js version using

我的问题是我想导入 this library on a desktop app based on NW.js (the template is here).

import Cap from 'cap-rbfork' //set on a vue.js view

当我启动应用程序时,它没有加载页面,我在 window 控制台上收到此错误:

  VM245:11 Uncaught Error: The module '/home/user/app/node_modules/cap-rbfork/build/Release/cap.node'
    was compiled against a different Node.js version using
    NODE_MODULE_VERSION 83. This version of Node.js requires
    NODE_MODULE_VERSION 72. Please try re-compiling or re-installing
    the module (for instance, using `npm rebuild` or `npm install`). Please try re-compiling or re-installing
the module (for instance, using `npm rebuild` or `npm install`).
    at Object.Module._extensions..node (:9080/internal/modules/cjs/loader.js:955)
    at Module.load (:9080/internal/modules/cjs/loader.js:756)
    at Function.Module._load (:9080/internal/modules/cjs/loader.js:669)
    at Module.require (:9080/internal/modules/cjs/loader.js:796)
    at require (:9080/internal/modules/cjs/helpers.js:68)
    at Object.<anonymous> (:9080/home/user/app/node_modules/cap-rbfork/lib/Cap.js:3)
    at Module._compile (:9080/internal/modules/cjs/loader.js:893)
    at Object.Module._extensions..js (:9080/internal/modules/cjs/loader.js:910)
    at Module.load (:9080/internal/modules/cjs/loader.js:756)
    at Function.Module._load (:9080/internal/modules/cjs/loader.js:669)

@Jaredcheeda

我按照您的说明,使用您建议的模板创建了一个新的 NWjs 应用程序。

  mounted(){
    var Cap = this.nw.require('cap-rbfork')
    console.log(Cap) //it lists properties
    console.log(Cap.Cap.deviceList()) //or Cap.deviceList(), but the app crashes anyway, without reporting the reason, except SIGSEGV
  }

如果我从浏览器访问页面,我得到这个错误:

vue.runtime.esm.js?2b0e:1897 Error: Module parse failed: Unexpected character '' (1:0)
You may need an appropriate loader to handle this file type, currently no loaders are configured to process this file. See https://webpack.js.org/concepts#loaders
(Source code omitted for this binary file)
    at eval (cap.node:1)
    at Object../node_modules/cap-rbfork/build/Release/cap.node (chunk-vendors.js:22)
    at __webpack_require__ (app.js:849)
    at fn (app.js:151)
    at eval (Cap.js?c745:3)
    at Object../node_modules/cap-rbfork/lib/Cap.js (chunk-vendors.js:33)
    at __webpack_require__ (app.js:849)
    at fn (app.js:151)
    at VueComponent.mounted (App.vue?234e:37)
    at invokeWithErrorHandling (vue.runtime.esm.js?2b0e:1863)

我不知道这意味着NW需要降级,所以它可以匹配正确的node-gyp版本。我创建了一个 Electron 项目,然后 answer 解决了一个类似的问题,它成功了。是否有一个 NW 相当于电子重建?

  1. 完全卸载全局安装的 Node 版本
  2. 安装节点版本管理器:
  3. 检查 NW.js 内置的 Node 版本
  4. 使用您选择的 nvm 工具安装并切换到匹配的 Node 版本
  5. 删除 package-lock.jsonnode_modules 文件夹
  6. 执行 npm install 这将 download/build 文件特定于您的全局节点版本,该版本应与 NW.js
  7. 中内置的版本相匹配

综上所述,Vue-CLI 的 Webpack/Babel 设置旨在 import/bundle/tree-shake 浏览器代码,而不是节点代码。因此,如果涉及本机代码、节点绑定、可执行文件或节点特定代码,import x from 'y' 将不起作用。

NW.js 使用 require 而不是 import 来处理导入节点模块。

如果 Node-GYP/NW-GYP 有问题,您可能还需要更改 NW.js 版本: