webpack + bower でライブラリを読み込めない!
症状
webpack + bower な環境で、 特定のライブラリをパッケージ名でrequireできない!
Module not found: Error: Cannot resolve module 'jquery.simulate'
なぜだ!!
以下、jquery.simulate
を例に説明。
bower_components/jquery.simulate/bower.json
に
"main":
プロパティが無いならまだわかる。
webpackでbower使って外部ライブラリの依存解決する - Qiita
ここで紹介されているように、"main":
が設定されていなければ、
どのファイルを読めばいいのかわかんないもんな。わかるわかる。
でも、jquery.simulate
には"main":
は設定されてるんだよね。
なぜだ!!
原因
読み込めないライブラリの共通点。それは
bower.json
の"main":
に配列が指定されている!!
bower/bower.json-spec · GitHub
bower.json
の仕様としては正しいはずなんだけどね。
Resolve main entry for bower and component · Issue #3 · webpack/enhanced-resolve · GitHub
既知の問題としてissueに上がっていた。
配列だとwebpackのResolverPlugin.DirectoryDescriptionFilePlugin
では読み込めないらしい。
解決策
こちらで解決されていた。
bower-webpack-plugin
で解決できた。
余談
というか、いろんなページで紹介されているwebpack + bowerの構築法だと、
ResolverPlugin.DirectoryDescriptionFilePlugin
使ってるんだけど、
例: webpackでbower使って外部ライブラリの依存解決する - Qiita
この問題かなりの罠だと思うんだよね...
入門するときには、このプラグインがデフォルトになってもいいんじゃないかって思うな...