1

我正在尝试让 node-serialport 与电子和 webpack 一起使用。

将串行端口作为外部模块导入

# webpack.config.js

externals: {
  serialport: "serialport"
}

这是我的应用程序中的代码:

// read NMEA data from serial port
const SerialPort = require('serialport');
console.log(SerialPort.list());

const Readline = SerialPort.parsers.Readline;
const port = new SerialPort('/dev/tty.Redmi-ShareGPS', { baudRate: 4800 });
const parser = port.pipe(new Readline({ delimiter: '\r\n' }));



// Open errors will be emitted as an error event
port.on('error', function(err) {
  console.log(err.message);
})

// send NMEA data to GPS.js
parser.on('data', function(data) {
  // gps.update(data);
});

麻烦在第一行:const SerialPort = require('serialport');

Webpack 编译一切都没有错误,但我有一个浏览器控制台错误:

Uncaught ReferenceError: serialport is not defined
    at Object.<anonymous> (bundle.js:65651)
    at __webpack_require__ (bundle.js:20)
    at Object.<anonymous> (bundle.js:65630)
    at __webpack_require__ (bundle.js:20)
    at Object.<anonymous> (bundle.js:31520)
    at __webpack_require__ (bundle.js:20)
    at Object.<anonymous> (bundle.js:25595)
    at __webpack_require__ (bundle.js:20)
    at _ol_ (bundle.js:63)
    at bundle.js:66

这在 webpack 生成的 bundle.js 中的起源:

/* 315 */
/***/ (function(module, exports, __webpack_require__) {

// read NMEA data from serial port
const SerialPort = __webpack_require__(316);
console.log(serialport.list());

const Readline = SerialPort.parsers.Readline;
const port = new SerialPort('/dev/tty.Redmi-ShareGPS', { baudRate: 4800 });
const parser = port.pipe(new Readline({ delimiter: '\r\n' }));

// Open errors will be emitted as an error event
port.on('error', function (err) {
  console.log(err.message);
});

// send NMEA data to GPS.js
parser.on('data', function (data) {
  // gps.update(data);
});

/***/ }),
/* 316 */
/***/ (function(module, exports) {

module.exports = serialport;

/***/ })
/******/ ]);

错误线正是module.exports = serialport;

根据externals 上的webpack 文档,我想我需要以某种方式将串行端口作为全局变量包含在内,但该示例适用于 jQuery,它是一个 js 文件,串行端口是节点模块。

如何让它发挥作用?

4

3 回答 3

2

经过几个小时的挫折,我搬家了

const SerialPort = require('serialport');

从应该由 webpack 捆绑到 index.html 的 javascript 文件:

<script>
  const SerialPort = require('serialport');
</script>
<script src="dist/bundle.js"></script>

现在可以识别 SerialPort。

此外,webpack-dev-server 似乎不适用于 Electron 和串行端口。我必须启动完整的电子应用程序。

于 2017-10-03T23:33:03.663 回答
2

试试remote

您可能还想尝试使用remote

const SerialPort = require( "electron" ).remote.require( "serialport" );
于 2018-05-27T16:36:50.703 回答
0

利用eval

const serialport = eval(`require('serialport')`)
于 2021-11-23T12:10:46.067 回答