ことの発端
- 自作のgrunt pluginをgulpに移植しよーと頑張っていたら、突然requireで失敗するようになった。
- (´・ω・`)
- nodeのrequire実装を覗いてみないと、なにが起きてるのかわからなかった
- ってわけで、調べよう
標準モジュールを読んでみる
- エラーログで、nodeの中の
module.js
というでエラーが出ている旨が書いてあるのだけれど、その実ファイルはどこにあるのか。 - → このへんはコンパイル済なので、実行している実ファイルは追えない模様
でも、ソースコードは読めるよ!
1. githubで読む
- https://github.com/joyent/node
- tagから見たいバージョンを選んできて、
lib
以下あたりを見るといろいろある
2. ローカルで読む
- nodebrew使ってる場合、
.nodebrew/src/{バージョン}/node-{バージョン}/lib/
というところにsrcも残っていた - おそらくビルド前のコードが残っているということかと
- ここを編集しても、実際の実行に反映されたりはしない
3. もっと深く読む
- Cの層まで本格的に読むのであればこのあたり参考。gkbr。
debuggerをちゃんと使おう
ざんねんながら、上記手段では原因がよくわからなかったので、ちゃんと実行時の処理を追いながら調べることに。
node debug {スクリプト名}
とやると、スクリプトを逐次実行できる。
その後は、ちまちまコマンドを入力していくと、ハイライトする部分を変えたりしながら進められる。
-
n
,next
: 次の行へ -
s
,step
: 現在の行の関数の中へ (step in) -
c
,cont
: 実行再開(ブレークポイントまで一気に)
しかしめんどくさい → node-inspector
Chrome Developer ToolだのEclipseだのAndroid Studioだのに慣れている身としては、さすがにみづらい。
というわけでnode-inspector
!!
1. インストールする
npm install -g node-inspector
2. デバッグしたいスクリプトを--debug-brk
付きで実行
- これで、node debugの時のように、いったん実行はストップ
- サーバーが起動して、そこからstep inとかもろもろを撃ち込めるようになるっぽい
- (そこはnode debugではないのか!)
3. node-inspector
を実行
node-inspector
- 表示されるローカルホストのURLを覚えておく
- 場合によっては
--web-port={port}
のオプションをつける (8080ポートが埋まっている場合など)
4. ブラウザでURLをひらく
- そこには、Chrome Developer Toolにそっくりなデバッグ画面が!
顛末
- node-inspectorで追ったら患部が分かった
- requireができなかったのは、もともとのgrunt-pluginの
package.json
に、main
プロパティが指定されていなかったからでした - ちなみに
main
がなくても、index.js
が置いてあれば大丈夫だった模様 - このへんで判明 → https://github.com/joyent/node/blob/v0.10.26/lib/module.js#L113
- ていうかglunt pluginって、
grunt.loadNpmTask
を使うから、require
は使わないのか…
できたよ
- https://github.com/fnobi/varline
- いい具合なのでそのうち宣伝したい