Узел-последовательный порт как внешний модуль в веб-пакете - модуль не найден

Я пытаюсь заставить node-serialport работать с электроном и веб-пакетом.

Я импортирую последовательные порты как внешний модуль:

# 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;

В соответствии с документами webpack для внешних устройств, я полагаю, что мне как-то нужно включить последовательный порт в качестве глобальная переменная, но пример для jQuery, который является файлом js, а serialport — это модуль узла.

Как заставить это работать?


person Patryk    schedule 27.09.2017    source источник


Ответы (2)


После многих часов разочарования я переехал

const SerialPort = require('serialport');

из файла javascript, который должен быть связан веб-пакетом, с index.html:

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

SerialPort теперь распознается.

Кроме того, похоже, что webpack-dev-server не очень хорошо работает с Electron и последовательным портом. Мне нужно запустить полное электронное приложение.

person Patryk    schedule 03.10.2017

Попробуйте remote.

Вы также можете попробовать использовать remote:

const SerialPort = require( "electron" ).remote.require( "serialport" );
person Joshua Pinter    schedule 27.05.2018
comment
Пробовал это, преодолел ошибку веб-пакета, но получил ошибки при загрузке fs из-за того, что электрон загружает свою собственную версию и конфликтует с узлом fs. К сожалению, мне пришлось прибегнуть к решению Патрика, даже если оно кажется грязным. - person Claudio; 04.06.2018
comment
Используете ли вы electron-rebuild для пересборки собственных пакетов для имеющейся у вас версии электрона? github.com/electron/electron-rebuild - person Joshua Pinter; 04.06.2018
comment
Да, я был, но оказалось, что я делал это совершенно неправильно, поскольку проблема была связана с объявлением ввода angular5 для последовательного порта, которое я забыл добавить в службу. Я последовал этому ответу, и он сработал как шарм: .com/questions/48252859/ - person Claudio; 05.06.2018
comment
это сделало это для меня, больше ничего не нужно :) - person Jan; 24.09.2019