Electron 类星体框架、电子和串行端口:indexOf错误
我正在用类星体、电子和串口建立一个测试项目。使用最小串行端口测试启动应用程序时,出现以下错误:Electron 类星体框架、电子和串行端口:indexOf错误,electron,quasar,node-serialport,Electron,Quasar,Node Serialport,我正在用类星体、电子和串口建立一个测试项目。使用最小串行端口测试启动应用程序时,出现以下错误: 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)
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>
从“Vue属性装饰器”导入{Vue,Component};
从“SerialPort”导入SerialPort;
@组成部分
导出默认类索引扩展Vue{
测试(){
console.log('test',SerialPort);
}
}
我尝试了所有我能在这里找到的东西,在Quasar论坛上,等等。pp.:electron rebuild,尝试将serialport配置为外部依赖项
我不太确定重建过程是否按预期工作,但我不知道要检查什么才能确保它工作正常。带有serialport的electron示例项目正在为我工作。也许这是与类星体有关的事情
我可以获得重建过程的更多信息吗?我尝试了不同的组合来指定版本,但没有任何帮助
我还在serialport存储库中将此问题作为一个问题,但将其添加到vue.config.js中不起作用,因为我使用Quasar作为CLI选项
我认为主要的问题是,当类星体就位时,如何正确地为电子重建串行端口,这似乎并没有像预期的那样工作。我在让串行端口在类星体和电子中运行时也遇到了一些麻烦,但我让它工作了。这个解决方案不是很好,将来可能会失败 正如您所写,您需要运行electron rebuild。您可以通过运行“/node\u modules/.bin/electron rebuild”来执行它。您还应该在“脚本”部分的package.json中输入 我使用Electron预加载脚本将serialport放入窗口对象中。是关于如何启用此功能的文档。在electron-main.js中,还需要添加 如果丢失,电子将无法加载 在electron-preload.js中,将此
window.serialport = require("serialport");
现在,您可以通过使用window.serialport在Quasar项目中使用serialport
我遇到的另一个问题是,Quasar在打包项目时更改了package.json,并删除了安装脚本,因此electron rebuild在构建时不会运行,打包版本也不会工作。我通过在quasar.conf.js的electron部分添加一个“beforepacking”钩子来解决这个问题
//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();
});
});
},
}
也许有人有更好的解决办法,但我希望,这会有所帮助。非常感谢。你的建议行得通。我认为这是一次卑鄙的攻击。但至少是一个有效的我仍然有重建的问题,因为它不能自动工作。但是它是手动工作的,所以我现在就用它。谢谢!!!我花了一下午的时间想弄明白。您的答案是唯一有效的。经过进一步的开发和测试,我遇到了以下问题:electron builder正在devDependencies部分进行electron重建。如果我将包移动到此位置,beforePackaging函数将无法找到节点_modules/.bin/electron重建路径。可能是因为只安装了非开发依赖项?这个问题有解决方法吗?我想让未来的读者知道,这个很棒的答案也适用于一个小细节:在
quasar.conf.js
electron
extendewebpack(cfg)
中添加cfg.externals={“node hid”:“commonjs node hid”}
。其余部分完全相同,只是您应该键入node hid
,而不是serialport
。但它工作得很好。我花了几个小时试图解决这个问题,所以我希望它能帮助别人。代码转储并不能得到好的答案。您应该解释这是如何以及为什么解决他们的问题的。我建议阅读“。这可以帮助未来的用户学习并最终将这些知识应用到他们自己的代码中。在解释代码时,用户也可能会给予积极的反馈/支持。
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()
})
})
},
//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()
})
})
},