LoginSignup
31
32

More than 5 years have passed since last update.

node-webkitでネイティブモジュールを使う

Last updated at Posted at 2014-05-31

概要

node-webkit使ってシリアルポート経由で、arduinoが送ってくるカラーセンサーの値を読もうとしたらserialportモジュール入れるのに苦労した。ので、対処したときの記録。もしかすると必要ないものとか、手順もあるかもしれない。
もっと簡単な方法とかあったらぜひ知りたい。

なにが困るのか

node.jsのモジュールにはfsとかみたいな組み込みのモジュール、Javascriptで書かれたモジュール、c++なんかで書かれたネイティブモジュールがある。
で、ネイティブモジュールをnode-webkitで使うと、エラーが出て動かない(そのまま動くときがあるのかは知らん)。それはABI(application binary interface)がnode.jsで動くときとnode-webkitで動くときで違うらしいんだけど、詳しいことは良くわからない。

ではどうするのか

npmでインストールしたあと自分でリビルドする。
node.js向けだとnode-gypってのを使ってビルドするんだけど、node-webkitではnw-gypっていうnode-gypのフォークを使う。で、そのためにはビルド環境を先に準備しておく必要がある。環境についてはnode-gypと同じでいいみたい。

ビルド環境

Unixの場合、python2.7とmakeとGCC(とか)で、windowsの場合、python2.7とVC++(Express可)をあらかじめ入れておく必要がある。今回はwindowsでpython2.7、VC++2010 Expressを使った。

手順

上記をインストールしたら、nw-gypをグローバルに入れる。

npm install nw-gyp -g

次にプロジェクトのnode_modules内の各モジュールのディレクトリに移動する。
たとえばserialportを利用するなら、プロジェクトのホーム以下のnode_modules/serialportに移動する。そこでnw-gypコマンドを実行する。で、そのときnode-webkitのターゲットバージョンを指定する。

nw-gyp rebuild --target=0.9.2

で、これでちゃんとイケるんじゃないかと思うけど、serialportの場合上手く行かなかった。以下の様な感じのエラーが出る。

gyp: Undefined variable module_name in binding.gyp
gyp ERR! configure error

エラーメッセージでググると、こんな記事があった。

node-pre-gypってパッケージを使え、ということらしい。
なんとなくで読むと、node-gypを簡単に使えるようにするパッケージか何かではないかと思うので、binding.gypを書いて適切に設定できれば必要ないのかもしれない。でもよく分からんので、入れて使う。

npm install node-pre-gyp -g
node-pre-gyp rebuild --runtime=node-webkit --target=0.9.2

runtimeをnode-webkitにしてあるので問題なくイケる。
で、32bitだとこれで大丈夫なんだけど、64bitのwindowsを入れてるマシンで試した時はちゃんと32bit向けのビルドだってことを明示しないとエラーで落ちた。

node-pre-gyp rebuild --runtime=node-webkit --target=0.9.2 --target_arch=ia32

というわけで、これで動くようになった。
やったね。

31
32
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
31
32