JavaScriptファイルをwebpackで処理してみます。
1ファイルでの例
$ mkdir webpack_wk
$ cd webpack_wk/
webpack で処理させるjsを作成します。
$ vi foo.js
document.write(“Hello webpack”);
foo.js から bundle.js を作成します。
$ webpack ./foo.js bundle.js
bundle.jsを呼び出すHTMLファイルを作成します。
$ vi index.html
<!doctype html> <html> <head> </head> <body> <script type=”text/javascript” src=”bundle.js” charset=”utf-8″></script> </body> </html>
index.htmlをブラウザで表示すると、Hello webpackと表示されます。
ちなみに、bundle.jsは以下のような内容になります。
/******/ (function(modules) { // webpackBootstrap /******/ // The module cache /******/ var installedModules = {}; /******/ /******/ // The require function /******/ function __webpack_require__(moduleId) { /******/ /******/ // Check if module is in cache /******/ if(installedModules[moduleId]) /******/ return installedModules[moduleId].exports; /******/ /******/ // Create a new module (and put it into the cache) /******/ var module = installedModules[moduleId] = { /******/ exports: {}, /******/ id: moduleId, /******/ loaded: false /******/ }; /******/ /******/ // Execute the module function /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); /******/ /******/ // Flag the module as loaded /******/ module.loaded = true; /******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } /******/ /******/ /******/ // expose the modules object (__webpack_modules__) /******/ __webpack_require__.m = modules; /******/ /******/ // expose the module cache /******/ __webpack_require__.c = installedModules; /******/ /******/ // __webpack_public_path__ /******/ __webpack_require__.p = ""; /******/ /******/ // Load entry module and return exports /******/ return __webpack_require__(0); /******/ }) /************************************************************************/ /******/ ([ /* 0 */ /***/ function(module, exports, __webpack_require__) { document.write("Hello webpack"); /***/ } /******/ ])
2.require(依存付け)を利用してみる
先ほどのfoo.jsに外部jsファイルの依存を加えてみます。
$ vi foo.js
require(“./bar.js”); //これでbar.jsが読込まれる。
document.write(“Hello foo.js”);
require(“./baz.js”); //これでbarzjsが読込まれる。
$ vi bar.js
document.write(“Hello bar.js”);
$ vi baz.js
document.write(“Hello baz.js”);
$webpack ./foo.js bundle.js
bundle.js の中身を見てみると、foo.jsの処理の下に、bar.jsが追加されているのがわかります。
jsの処理を追っていくと、jsごとに無名関数 function(module, exports, __webpack_require__) でラップされているのがわかります。
そして、上から順番にモジュールIDがふられていきます。jsの途中で、require(“./foo.js”);のように書いたところは、__webpack_require__(moduleID)に置き換えられます。この関数によって依存性のあるモジュールが読込まれることになります。
index.htmlを実行すると、
Hello bar.jsfoo.jsHello baz.js
と表示されます。foo.jsに記載した順で実行されているのがわかります。
3.相互に依存させるとどうなるか
bar.jsのなかでrequire(“./foo.js”);とすると、webpack実行時にエラーが出て怒られました。
エントリーポイント(webpack実行時にしていする元ファイル)に対して依存することは禁止されているみたいです。
それ以外のモジュール同士であれば、相互に依存させた場合も、後から読込まれたモジュール内のrequireが呼ばれた際には先に読込まれたモジュールはinstalledModulesに保存されているので、そのexportsが返されます。
4.CSSの読み込み
webpackだけではCSSに対応していないため、css-loader style-loaderが必要になります。
インストールはnpmを使って簡単にできます。
$ npm install css-loader style-loader
インストールが完了したら、CSSを作って読込んでみます。
$ vi foo.css
body { background: red;}
$ vi foo.js
require(“foo.css”);
document.write(“background is red”);
$ webpack ./foo.js bundle.js
bundle.js を見てみると、jsのときと同じようにCSSを読込んでいるのがわかります。
CSSは最終的にheadタグの下に読込まれるようになっています。
CSS読み込み時はrequireの書き方が特殊ですが、webpack実行時にオプションとして–module-bind ‘css=style!css’ を指定すれば、require(“./foo.css”)のように書くことができます。
5.便利な設定
コマンドの簡素化
ここまで見てきたwebpackの使い方は、いずれもファイルの指定だったり、CSSのオプションをつけたりと面倒でした。
開発中同じオプションで使い続ける場合は、設定ファイルを作ると楽になります。
例えば、最初に読込ませるjsファイルをentry.js、生成するjs名をbundle.jsとし、CSSローダーも組み込む(CSSの読み込み時に、require(“./foo.css”)と書けるようにする)には以下の設定ファイルを作成します。
webpack.config.js
module.exports = { entry: "./entry.js", output: { path: __dirname, filename: "bundle.js" }, module: { loaders: [ { test: /\.css$/, loader: "style!css" } ] } };
この設定ファイルをwebpack実行時のパスに置くことで、webpackの実行が以下のコマンドのみですむようになります。
$ webpack
その他実行時のオプション
–progress
開発が進み、ファイル数が増えてくるとwebpackの実行にも時間がかかるようになります。
1 |
--progressオプションを利用すると、プログレスバーの表示ができます。 |
--colors
--colorsオプションを利用すると、出力結果に色がついて見やすくなります。
--watch
–watchオプションを利用すると、webpack管理下のファイルが修正された場合に、自動的にコンパイル(webpackの実行)が行われます。
既にコンパイルされているファイルはキャッシュされているため、かなり高速に実行できます。
コマンドラインで–watchモードで実行すると、フォアグラウンドで実行されて入力が受け付けられなくなるので、Ctrl+Zでバックグラウンドに移してbgでジョブを再開させてください。(もしくは&をつけてコマンド実行してください。)
止めるときは、fgでフォアグランドに持ってきてCtrl+Cでいいかと思います。