みかづきブログ・カスタム

基本的にはちょちょいのほいです。

Macでelectronとserialportを組み合わせてアプリを作る ⚡️

4年ぐらいぶりにシリアル通信を行うElectronアプリを作りました。

おぼろげながら、

  1. electronとserialportを普通に組み合わせるとエラーが出る
  2. 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.io

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無しでも動くようになってました

serialport.io
github.com

ただ、node-dmxを使った時など、9以前のserialportを読み込んでいるパッケージを使用する際は、electron-rebuildの力が必要となります。
が。electron-rebuildが廃止予定になっているので、@electron-rebuildを使いましょう。

blog.kimizuka.org