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

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

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

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

おぼろげながら、

  1. electronとserialportを普通に組み合わせるとエラーが出る
  2. rebuildすると使える

という4年前の記憶がありまして、まずは、electron + serialportで中身が空っぽのアプリを作ってみることにしました。

すると、

f:id:kimizuka:20210907160348p:plain

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が走るようにしたところ、無事にエラーを解消することができました。