LoginSignup
30
38

More than 5 years have passed since last update.

Webpackと外部のJavaScriptを連携する

Posted at

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として他ライブラリとつなぐのではなく、

  • グローバルにあるjQueryをそのまま拾ってきて、そこにセットする1
  • thiswindowになっているのを前提に、直接変数を書き込む2

ようなものがあります。このような場合、元のコードに手を加えることもできますが、imports-loader(GitHub)を使って処理することもできます。

前者の場合、require('imports-loader?jQuery=jquery!./file')のようにすれば、ファイル冒頭にvar jQuery=require('jquery');を補って処理してくれるので、CommonJS経由のjQueryが入ります。

後者の場合は、require('imports-loader?this=>window!./file')とすることで、thiswindowを割り付けた状態で処理してくれるようになります。

脚注


  1. もっとも、requireの結果として何かが取れる構造ではないので、CommonJSとjQueryプラグインはそんなに相性が良くないかもしれません。 

  2. どういうわけか、npmにあるのにこういうスタイルになっているコードに遭遇してしまったこともあります。 

30
38
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
30
38