React NativeアプリでRealmを使うためにNode.jsのバージョンを下げた話とか

GitHub風進捗グラフAPIサービスPixelaのReact Nativeアプリを開発している。特に気にせず最新版のNode.js v11.7.0を利用していたのだけれど、Realmのインストール時に問題が起きたのでメモ。

 

pixe.la

github.com

 

 

[Realm v2.22.0はNode.js v11.x非対応]

npm install realm --save-devとコマンドを実行すると、次のエラーが出た。

In file included from ../src/node/node_init.hpp:29:
../src/node/node_class.hpp:373:10: error: called object type 'int' is not a
      function or function pointer
        F(isolate, info.This(), property, return_value);
        ~^
8 errors generated.
make: *** [Release/obj.target/realm/src/node/node_init.o] Error 1
gyp ERR! build error 
gyp ERR! stack Error: `make` failed with exit code: 2
gyp ERR! stack     at ChildProcess.onExit (/usr/local/lib/node_modules/npm/node_modules/node-gyp/lib/build.js:262:23)
gyp ERR! stack     at ChildProcess.emit (events.js:188:13)
gyp ERR! stack     at Process.ChildProcess._handle.onexit (internal/child_process.js:254:12)
...(略)...
gyp ERR! node -v v11.7.0
gyp ERR! node-gyp -v v3.8.0
gyp ERR! not ok 
node-pre-gyp ERR! build error 
...(略)...
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! realm@2.22.0 install: `node-pre-gyp install --fallback-to-build`
npm ERR! Exit status 1
npm ERR! 
npm ERR! Failed at the realm@2.22.0 install script.
...(略)...

 

node install errorググるとissueが見つかった。

github.com

 

以前はNode.js v10.xでも同様のエラーが発生していたが、今は対応された、ということらしい。そのまま探していくと、果たしてNode 11のサポートに関するチケットも見つかった。

github.com

 

どうやら昨年適当にバージョンを上げたのが悪さをしているらしい。

kdnakt.hatenablog.com

 

[RealmはLTSのNode.jsをサポート]

realm.io 

Prerequisites
・Node 6, 8, and 10 are supported.

 

公式サイトも確認すると、確かにNode.js v6.x, v8.x, v10.xをサポートしていると書かれている。先ほどのissueにも書かれているように、LTSのNodeはサポートしてやるから、それ以外のメジャーバージョンは使うな、ということらしい。

 

 

github.com

Node.js v6.xのサポートが2019年4月末で終わり、Node.js v12.xのサポートが2019年10月にスタートするので、恐らく10月以降にNode.js v11.xでもRealmを利用できるようになるだろう。

 

RealmやReact Nativeの世界とは完全に別件だが、2018年4月末にサポート終了を迎えたNode.js v4.xは、半年ほどかけてAWS Lambdaでもランタイムとして使えなくなったので、Node.js v6.xも同様に2019年後半には使えなくなりそう。

dev.classmethod.jp

 

[nでNode.jsをLTSにダウングレード]

本題に戻す。Realmを使いたいのでNode.jsをv10.xにダウングレードしたい。Node.jsのバージョン管理といえばnvmだのnodebrewだの色々あるのは知っている。

既にNode.jsがインストールされている環境(macOS 10.14.2)なので、アンインストールしたりするのは嫌だな、と思いながらググっていると、nを使うと良さそうという回答を見つけたので試してみることに。

stackoverflow.com

 

Githubで確認すると、やはりインストールしてすぐ使えそうに見える。

github.com

 

まずはnpm install -g nを実行してnをインストールする。

~/Develop/pixelarn akito$ npm install -g n
/usr/local/bin/n -> /usr/local/lib/node_modules/n/bin/n
+ n@2.1.12
added 1 package from 4 contributors in 0.965s

 

次に、nを利用してNode.jsをLTSの最新版に設定する。

~/Develop/pixelarn akito$ n 10.15.0
mkdir: /usr/local/n/versions/node: Permission denied
mkdir: /usr/local/n/versions/io: Permission denied

     install : node-v10.15.0
       mkdir : /usr/local/n/versions/node/10.15.0
mkdir: /usr/local/n/versions/node/10.15.0: Permission denied

  Error: sudo required

 

失敗。sudoをつけてsudo n 10.15.0を実行する必要があった。

~/Develop/pixelarn akito$ sudo n 10.15.0
Password:

     install : node-v10.15.0
       mkdir : /usr/local/n/versions/node/10.15.0
       fetch : https://nodejs.org/dist/v10.15.0/node-v10.15.0-darwin-x64.tar.gz
######################################################################## 100.0%
   installed : v10.15.0

 

node -vコマンドでバージョンを確認すると確かにバージョンがv11.xから変更されていた。すでにインストール済みのNode.js v11.xと競合してエラーが発生したりはしないらしい。安心。

~/Develop/pixelarn akito$ node -v
v10.15.0

 

ということで改めてRealmをインストールする。

~/Develop/pixelarn akito$ npm install realm --save-dev

> realm@2.22.0 install /Users/akito/Develop/pixelarn/node_modules/realm
> node-pre-gyp install --fallback-to-build

node-pre-gyp WARN Using request for node-pre-gyp https download
[realm] Success: "/Users/akito/Develop/pixelarn/node_modules/realm/compiled/node-v64_darwin_x64/realm.node" is installed via remote
npm WARN react-native-elements@0.19.1 requires a peer of react-native-vector-icons@^4.2.0 but none is installed. You must install peer dependencies yourself.

+ realm@2.22.0
added 78 packages from 46 contributors and audited 35129 packages in 12.487s
found 0 vulnerabilities

 

問題なくRealmをインストールすることができた。

 

[まとめ]

  • Node.jsはLTSを使うと、ライブラリがサポートしていて無難
  • Node.jsのバージョン管理はnがオススメ