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());
});
}
我正在使用 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());
});
}