Webpackを使えばCommonJSに準拠した形でJavaScriptどうしの依存関係を構築していけますが、状況によってはWebpack外との連携を取っていく必要が出てきます。
Webpack管理外のライブラリを使う
プロジェクトを作った後からWebpackを導入したなどで、Webpack管理下のコードから、外部にあるライブラリを呼び出す必要があるかもしれません。
また、jQueryなどの著名なライブラリの場合、「そちらはWebpackのバンドルに含めず、既存のパブリックCDNを使いたい」というような状況も、発生するものです。
このような場合、いちおう「グローバルにあるjQuery
をそのまま使う」という選択肢も、ないわけではありません。ただ、それをやると、依存関係がはっきりしなくなって、Webpackの魅力が半減してしまいます。また、Node経由で入れるライブラリなどでは、きちんとrequire('jquery')
としてある例があるので、これにも手当てが必要です。
正しい方法としては、webpack.config.js
で指定するexternals
という設定があります(リファレンス)。
externals: {
jquery: 'jQuery'
}
のように書いておくと、require('jquery')
で呼び出されるモジュールが、本来のjQueryではなく、単にグローバルのjQuery
変数を参照するだけのものに差し替わります(もちろん、Webpackのバンドルより前にjQueryを読み込んでおかないと、正しく動作しません)。
Webpackで入れたライブラリを外部から使う
逆に、Webpack管理のライブラリもそのままではグローバルに現れませんので、手段が必要となります。
もちろん自分でwindow.foo = require('foo');
のようにしてもいいのですが、それを勝手に行ってくれるツールとしてexpose-loader(GitHub)があります。require('expose-loader?変数名!ファイル')
のように書くだけで、ファイル
をrequire
したものをグローバルの変数名
にしてくれます。
CommonJSに則っていないライブラリをWebpack管理に入れる
jQueryプラグインなどでよくあるのですが、JavaScriptライブラリの中には、CommonJSとして他ライブラリとつなぐのではなく、
ようなものがあります。このような場合、元のコードに手を加えることもできますが、imports-loader(GitHub)を使って処理することもできます。
前者の場合、require('imports-loader?jQuery=jquery!./file')
のようにすれば、ファイル冒頭にvar jQuery=require('jquery');
を補って処理してくれるので、CommonJS経由のjQueryが入ります。
後者の場合は、require('imports-loader?this=>window!./file')
とすることで、this
にwindow
を割り付けた状態で処理してくれるようになります。