node.jsのモジュール・パス [ソフトウェア/PC関係]
「Node.jsプログラミングガイド」(秀和システム)。秀和システムって,なんか懐かしい。 |
また,長いことblogをサボってしまった。
この間も,結構いろいろなことを試したりしていて,書くネタがなかったわけではない。ただ,文章にまとめようとすると膨大になってしまいそうで,書き切る気力がなかったのとか,上手くまとめるのが面倒なのとかばかりで,ついほったらかしにしてしまっていたのである。モティベーションが下がっている時というのはこういうものだ。
それでも,やったことを記録しておくことは,自分にとっても(というか,主に自分にとってなのかもしれないが)後々役に立つことは,これまでの経験でよく分かっている。そもそも,綺麗にまとめようとするから嫌になるのだから,取り敢えず断片的な情報でもいいから,残しておくのが賢明に思えてきた。という訳で,背景説明とかざっくり端折って,分からない人にはさっぱり分からない記事が,しばらく続くかも知れないが,予めご了承願いたい。
で,いきなり,「node.js」の話。node.jsというのは,JavaScriptの実行環境...らしい。いや,本来の目的はサーバーサイドJavaScriptのようだが,個人的にはこれでサーバーを立てようなどとは思っていないので,そこはどうでもいいのだ。ちょっと前に,JavaScriptで簡単なFacebookアプリを書いてみた訳だが,JavaScriptを試すためだけに,いちいちHTMLを書いて,サーバーに転送して...なんてやっていたのではまだるっこしい。と思っていた時に,node.jsの存在を知ったのである。Windows用にはインストーラも用意されているので,簡単に使えるようになる。nodeというコマンドにJavaScriptのソース・ファイルを渡せば実行してくれるし,インタラクティブにJavaScriptの式を実行することもできる。様々なライブラリも用意されているので,ちょっとしたプログラムなら簡単に書けるらしい。それで,ちょっと試してみる気になったのである。
と言っても,何をどう試したらいいのか分からないので,まずはネット上のあちこちにあるサンプルを実行してみることにした。確かに,ごく簡単なHTTPサーバーなら,数行で書けてしまうようだ。なかなか面白い。しかし,程なく最初の問題に突き当たった。require文である。
require文は,使用する外部ライブラリ(モジュール)を読み込むためのものだ。require('http')とすれば,httpモジュールを読み込んで,そのオブジェクトが返ってくる。ところが,httpモジュールでは上手くいったのに,require('request')を実行するとエラーになる。これは当たり前だ。きっと,requestモジュールがインストールされていないのだろう。モジュールをリポジトリからインストールするには,npmを使う。requestモジュールは,いろいろ使えそうだから,グローバルにインストールしたい。実はこれが落とし穴に嵌る罠だったのだが,この時は疑いもせず,node.jsのコマンド・プロンプトから
npm -g request
を入力して実行した。インストールが完了してから,もう一度require('request')を実行してみる。おや? 相変わらず同じエラー・メッセージだ。どうなっているのだろう。インストールしたはずのrequestモジュールが見つからないのだろうか。
そもそも,モジュールはどこから読み込まれるのだろう。node.jsの解説サイトなどを見ても,どうもよく分からない。散々調べた挙句,"require.paths"という変数があることが分かった。そこで,node.exeを起動して,プロンプトから"require.paths"と入力してEnterキーを押すと,
C:\Work\JavaScript> node > require.paths Error: require.paths is removed. Use node_modules folders, or the NODE_PATH environment variable instead. at Function.Module._compile.Object.defineProperty.get (module.js:386:11) at repl:1:9 at REPLServer.self.eval (repl.js:109:21) at Interface.(repl.js:248:12) at Interface.EventEmitter.emit (events.js:96:17) at Interface._onLine (readline.js:200:10) at Interface._line (readline.js:518:8) at Interface._ttyWrite (readline.js:736:14) at ReadStream.onkeypress (readline.js:97:10) at ReadStream.EventEmitter.emit (events.js:126:20)
というエラー・メッセージ。"require.paths"は削除されてしまったのか。mode_modulesフォルダを使えって,どういう意味? NODE_PATHなんて環境変数,セットされてないんだけど。
"require.paths"がなくなったなら,代わりがあるはず,と思って更に調べてみると,"global.module.paths"に変更されたらしい。nodeでこの変数の内容を表示させてみると,
> global.module.paths [ 'C:\\Work\\JavaScript\\repl\\node_modules', 'C:\\Work\\JavaScript\\node_modules', 'C:\\Work\\node_modules', 'C:\\node_modules' ] >
なるほど,カレント・ディレクトリを起点にして,ルート・ディレクトリまで遡って,"mode_modules"というディレクトリを探すらしい。しかし,それならnpmでグローバル・インストールしたモジュールのディレクトリは? 調べたところ,グローバル・インストール用のディレクトリは,XPの場合,"C:\Documents and Settings\user名\Application Data\npm\node_modules",7の場合,"C:\Users\user名\AppData\Roaming\npm\mode_modules"になっているようだ。ということは,せっかくインストールしても,探してくれないということだ。Windowsインストーラまであるのに,なんと不親切な。仕方ないので,自分でNODE_PATHにnpmのモジュール・ディレクトリをセットしてみると,ちゃんと読み込んでくれるようになった。う~む。
因みに,global.module.pathsにディレクトリを追加するには,
> global.module.paths.push("c:\\npm\\node_modules") 5 > global.module.paths [ 'C:\\Work\\JavaScript\\repl\\node_modules', 'C:\\Work\\JavaScript\\node_modules', 'C:\\Work\\node_modules', 'C:\\node_modules', 'c:\\npm\\node_modules' ] >
とすれば良いようだ。
初っ端から,無駄に時間を費やしたようだが,解決したのでよしとしよう。次は,FacebookのOAuth認証が出来るかを調べてみる予定。
コメント 0