Node.jsのjQueryでTypeErrorが出た場合の解決方法
ローカルではMacで開発していまして、CentOSにデプロイした際に以下のエラーが出てjQueryが動きませんでした。
TypeError: Cannot read property 'prototype' of undefined
node_modules自体を削除し、npm installで再インストールしてみましたが、変化無し。
調べてみると、GitHubに似た状態の報告がありました。が、node自体のバージョンアップで解決したという内容と、Windows上では最新版(v0.8.8)でも解決していない報告もあり、イマイチ解決方法が分かりません。実際にv0.8.6からv0.8.8へアップデートしてみましたが、症状は解決できませんでした。
nodeのバージョンではない、と当たりをつけて、モジュールに絞って調べてみると、プロジェクト・モジュールの依存関係を調べるコマンドが見つかりました。
$ npm ls
npm WARN package.json project1@0.0.1 No README.md file found!
project1@0.0.1/Users/****/Sites/****
├── easyimage@0.1.3
├─┬ jquery@1.7.3
│ ├── htmlparser@1.7.6
│ ├─┬ jsdom@0.2.15
│ │ ├─┬ contextify@0.1.3
│ │ │ └── bindings@1.0.0
│ │ ├── cssom@0.2.5
│ │ └─┬ request@2.11.1
│ │ ├─┬ form-data@0.0.3
│ │ │ ├── async@0.1.9
│ │ │ └─┬ combined-stream@0.0.3
│ │ │ └── delayed-stream@0.0.5
│ │ └── mime@1.2.7
│ ├── location@0.0.1
│ ├── navigator@1.0.1
│ └── xmlhttprequest@1.4.2
└─┬ socket.io@0.9.10
├── policyfile@0.0.4
├─┬ redis@0.7.2
│ └── hiredis@0.1.14
└─┬ socket.io-client@0.9.10
├─┬ active-x-obfuscator@0.0.1
│ └── zeparser@0.0.5
├── uglify-js@1.2.5
├─┬ ws@0.4.21
│ ├── commander@0.6.1
│ ├── options@0.0.3
│ └── tinycolor@0.0.1
└── xmlhttprequest@1.4.2
ツリー状に各モジュールが表示されます。これをサーバ側のものと比較してみると、バージョンが微妙に異なりました。具体的にはhtmlparserのバージョンが低い。更にhtmlparserディレクトリで確認してみると「UNMET DEPENDENCY」という見慣れぬ表示が。
「依存関係を満たしていない」
というわけです。という事で、jQueryのpackage.jsonを修正し、htmlparserを1.7.6に固定、npm installをしたところ、無事エラーが出なくなりました。(この辺のログをちゃんと残していませんでした)
{ "name": "jquery", ... "dependencies": { "jsdom": "~0.2.14", "htmlparser": "1.7.6", "xmlhttprequest": "~1.4.2", "location": "0.0.1", "navigator": "~1.0.1" }, ... }
ただ、モジュールの中を修正してしまったので、後々問題になりそうではあります。