Quasar Framework、Electron 和 Serialport:indexOf 错误

Quasar Framework, Electron, and Serialport: indexOf Error

我正在使用 Quasar、Electron 和串口建立一个测试项目。使用最小串行端口测试启动应用程序时,出现以下错误:

vue-router.esm.js?85f8:2128 TypeError: Cannot read property 'indexOf' of undefined
    at Function.getFileName (bindings.js?d8c5:178)
    at bindings (bindings.js?d8c5:82)
    at eval (win32.js?0965:1)
    at Object../node_modules/@serialport/bindings/lib/win32.js (vendor.js:340)
    at __webpack_require__ (app.js:854)
    at fn (app.js:151)
    at eval (index.js?3983:6)
    at Object../node_modules/@serialport/bindings/lib/index.js (vendor.js:252)
    at __webpack_require__ (app.js:854)
    at fn (app.js:151)

甚至当我只包含 serialport 包而没有做任何其他操作时,甚至会发生错误。这似乎是一个基本问题。重现问题的代码:

<script lang="ts">
import { Vue, Component } from 'vue-property-decorator';
import SerialPort from 'serialport';

@Component
export default class Index extends Vue {
  test() {
    console.log('test', SerialPort);
  }
}
</script>

我尝试了在这里、Quasar 论坛等中可以找到的所有内容。pp.: electron-rebuild,尝试将串行端口配置为外部依赖项,...

我不太确定重建过程是否按预期工作,但我不知道要检查什么以确保它正常工作。带有串行端口的电子示例项目正在为我工​​作。也许是类星体相关的东西?

我可以获得有关重建过程的更多信息吗?我尝试了指定版本的不同组合,但没有任何帮助。

我也asked这个问题作为serialport存储库中的一个问题,但是在vue.config.js中添加它不起作用,因为我使用Quasar作为CLI选项。

我认为主要的问题是当 Quasar 到位时如何为电子正确重建串口,这似乎没有按预期工作。

我在 Quasar 和 Electron 中将 Serialport 设置为 运行 也遇到了一些麻烦,但我成功了。该解决方案不是很漂亮,将来可能会崩溃。

如您所写,您需要 运行 电子重建。你可以通过运行ning "./node_modules/.bin/electron-rebuild"来执行。你还应该在你的包中放入 .json 在“脚本”部分

"install": "electron-rebuild"

我使用 Electron 预加载脚本将串口放入 window 对象中。 Here is the documentation on how to enable this. In the electron-main.js, you also need to add the following line

app.allowRendererProcessReuse = false;

如果缺失,electron将加载失败

在electron-preload.js中,把这个

window.serialport = require("serialport");

您现在可以通过 window.serialport 在您的 Quasar 项目中使用串行端口。

我遇到的另一个问题是 Quasar 在打包项目时更改了 package.json 并删除了安装脚本,因此 electron-rebuild 在构建时不会 运行 并且打包版本不起作用.我设法通过在 quasar.conf.js

的电子部分添加一个“beforePackaging”挂钩来解决这个问题
//Top of the file
const path = require("path");
const crossSpawn = require("cross-spawn");
...
electron: {
  ...
  beforePackaging(params) {
    return new Promise(resolve => {
      const runner = crossSpawn(
        path.join("node_modules", ".bin", "electron-rebuild"),
        [""],
        {
          stdio: "inherit",
          stdout: "inherit",
          stderr: "inherit",
          cwd: params.unpackagedDir
        }
      );

      runner.on("close", () => {
        resolve();
      });
    });
  },
}

也许有人对此有更好的解决方案,但我希望这会有所帮助。

beforePackaging (params) {
    return new Promise(resolve => {
      const runner = crossSpawn(
        '..\..\..\node_modules\.bin\electron-rebuild -f -v 9.3.1 -w serialport',
        [''],
        {
          stdio: 'inherit',
          stdout: 'inherit',
          stderr: 'inherit',
          cwd: params.unpackagedDir
        }
      )
      runner.on('close', () => {
        resolve()
      })
    })
  },
   beforePackaging(params) {
        return new Promise((resolve) => {
          const runner = crossSpawn(
           "npx electron-rebuild", [""], {
              stdio: "inherit",
              stdout: "inherit",
              stderr: "inherit",
              cwd: params.unpackagedDir,
            }
          );
          runner.on("close", () => resolve());
        });
      }