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の実行にも時間がかかるようになります。

--colors

--colorsオプションを利用すると、出力結果に色がついて見やすくなります。

--watch

–watchオプションを利用すると、webpack管理下のファイルが修正された場合に、自動的にコンパイル(webpackの実行)が行われます。

既にコンパイルされているファイルはキャッシュされているため、かなり高速に実行できます。

コマンドラインで–watchモードで実行すると、フォアグラウンドで実行されて入力が受け付けられなくなるので、Ctrl+Zでバックグラウンドに移してbgでジョブを再開させてください。(もしくは&をつけてコマンド実行してください。)

止めるときは、fgでフォアグランドに持ってきてCtrl+Cでいいかと思います。

Leave a Reply

Your email address will not be published. Required fields are marked *