Electronでネイティブを実行できるnode-ffiを利用できるようになるまで

はじまりはじまり

node-ffiというライブラリがある。
これを使うと、ネイティブなライブラリ・フレームワーク
JavaScriptのコードから呼び出せる。
https://github.com/node-ffi/node-ffi


なのですが、Electronから使う場合、npmでnode-ffiを入れるだけでは、
動作しないことがほとんどなのであった。
↓のようなエラーが出たり(もちろんネイティブは呼び出せない)、そもそもElectronアプリが起動しなかったり。

was compiled against a different Node.js version using
NODE_MODULE_VERSION 64. This version of Node.js requires
NODE_MODULE_VERSION 57. Please try re-compiling or re-installing
the module (for instance, using `npm rebuild` or `npm install`).
    at process.module.(anonymous function) [as dlopen] (ELECTRON_ASAR.js:172:20)
    at Object.Module._extensions..node (module.js:598:18)
    at Object.module.(anonymous function) [as .node] (ELECTRON_ASAR.js:186:18)
    at Module.load (module.js:503:32)
    at tryModuleLoad (module.js:466:12)
    at Function.Module._load (module.js:458:3)
    at Module.require (module.js:513:17)
    at require (internal/module.js:11:18)

ちなみに環境はMacですぞ。

どうするどうする?

こうすれば絶対大丈夫、というのは、まだよく分からない。
何度か同じ問題と戦っているけど、
一度成功するパターンを掴んだら、そこで問題の追跡止めちゃうからね。仕方ないね。


以下は、最新の成功パターンである。

バージョンを決める

いろいろな理由があって、入れるバージョンは、このバージョンになった。
Electron 3系は、Nodeは10.2。
Electron 3なので、Spectron 5.0。
electron-packagerは12.1.0以降でないとダメ。

  • Electron 3.1.1
  • Node 10.2.1
  • Spectron 5.0.0
  • electron-packager 12.1.0

node 10.2.1を入れる

nvmでnodeをインストールする。

nvm ls-remote
nvm install v10.2.1
nvm use v10.2.1

npmでelectronを入れる

electron-packagerもついでに入れる。

npm install --save-dev electron@3.1.1 spectron@5.0.0 electron-rebuild electron-packager@12.1.0

node-ffi関連のライブラリを入れる

ffiを使うには、natives、bindings、debug、ms、nan、ref、ref-structあたりが必要になる。
bindings、ms、debugは直接入れなくても平気ではないか説ある。
(でも、今試しにbindings、ms、debug抜いたら、ビルドエラーになっちゃった)

npm install --save natives bindings debug ffi ms nan ref ref-struct

TypeScriptを使っているなら、定義ファイルも入れておきましょう。

npm install --save-dev @types/ffi @types/ref @types/ref-struct

ffi関連ライブラリをビルドする

electron-rebuildコマンドでnodeのライブラリをビルドする。
環境構築が上手く行かないときは、ここのビルドが失敗することが多いと思う。

./node_modules/.bin/electron-rebuild

動作確認

これでElectronアプリが起動して、
かつ、変なエラーログが出ていなければ、成功です。
Let's enjoy node-ffi.

./node_modules/.bin/electron .

おわり

おわり。