4年ぐらいぶりにシリアル通信を行うElectronアプリを作りました。
おぼろげながら、
- electronとserialportを普通に組み合わせるとエラーが出る
- rebuildすると使える
という4年前の記憶がありまして、まずは、electron + serialportで中身が空っぽのアプリを作ってみることにしました。
すると、
A JavaScript error occurred in the main process
Uncaught Exception:
Error: The module '/Users/app/node_modules/@serialport/bindings/build/Release/bindings.node'
was compiled against a different Node.js version using
NODE_MODULE_VERSION 83. This version of Node.js requires
NODE_MODULE_VERSION 89. Please try re-compiling or re-installing
the module (for instance, using `npm rebuild` or `npm install`).
at process.func [as dlopen] (electron/js2c/asar_bundle.js:5:1846)
at Object.Module._extensions..node (internal/modules/cjs/loader.js:1143:18)
at Object.func [as .node] (electron/js2c/asar_bundle.js:5:1846)
at Module.load (internal/modules/cjs/loader.js:940:32)
at Module._load (internal/modules/cjs/loader.js:781:14)
at Function.f._load (electron/js2c/asar_bundle.js:5:12913)
at Module.require (internal/modules/cjs/loader.js:964:19)
at require (internal/modules/cjs/helpers.js:88:18)
at bindings (/Users/app/node_modules/bindings/bindings.js:112:48)
at Object.(/Users/app/node_modules/@serialport/bindings/lib/darwin.js:2:36)
App threw an error during load
Error: The module '/Users/node_modules/@serialport/bindings/build/Release/bindings.node'
was compiled against a different Node.js version using
NODE_MODULE_VERSION 83. This version of Node.js requires
NODE_MODULE_VERSION 89. Please try re-compiling or re-installing
the module (for instance, using `npm rebuild` or `npm install`).
at process.func [as dlopen] (electron/js2c/asar_bundle.js:5:1846)
at Object.Module._extensions..node (internal/modules/cjs/loader.js:1143:18)
at Object.func [as .node] (electron/js2c/asar_bundle.js:5:1846)
at Module.load (internal/modules/cjs/loader.js:940:32)
at Module._load (internal/modules/cjs/loader.js:781:14)
at Function.f._load (electron/js2c/asar_bundle.js:5:12913)
at Module.require (internal/modules/cjs/loader.js:964:19)
at require (internal/modules/cjs/helpers.js:88:18)
at bindings (/Users/node_modules/bindings/bindings.js:112:48)
at Object.(/Users/node_modules/@serialport/bindings/lib/darwin.js:2:36)
しっかりエラーが出ました。やはり記憶は正しかったですね。
Please try re-compiling or re-installing
the module (for instance, using `npm rebuild` or `npm install`)
と書いてあるので、rebuildするという解決方法も記憶通りっぽいです。
で、rebuildの手順を調べてみると、
serialportの公式ドキュメントに書いてありました。
4年の間に、ものすごく親切な世の中になりましたね。
package.json
{ "name": "electron-and-serialport", "version": "1.0.0", "main": "index.js", "scripts": { "postinstall": "electron-rebuild -f -w serialport" }, "devDependencies": { "electron-rebuild": "^3.2.3" }, "dependencies": { "electron": "^14.0.0", "serialport": "^9.2.1" } }
ドキュメント通り、こんな感じでnpm installが走ったときにelectron-rebuildが走るようにしたところ、無事にエラーを解消することができました。
追記(2024.05.30)
改めてドキュメントを見てみると、Version 10以降はelectron-rebuild無しでも動くようになってました。
ただ、node-dmxを使った時など、9以前のserialportを読み込んでいるパッケージを使用する際は、electron-rebuildの力が必要となります。
が。electron-rebuildが廃止予定になっているので、@electron-rebuildを使いましょう。