<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>webpack &#8211; Mach3.laBlog</title>
	<atom:link href="https://blog.mach3.jp/tag/webpack/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.mach3.jp</link>
	<description></description>
	<lastBuildDate>Sat, 01 Oct 2016 01:00:04 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9</generator>
	<item>
		<title>はじめてのモジュールバンドラー</title>
		<link>https://blog.mach3.jp/2016/10/01/module-bundler.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Sat, 01 Oct 2016 01:00:04 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[browserify]]></category>
		<category><![CDATA[Grunt]]></category>
		<category><![CDATA[module bundler]]></category>
		<category><![CDATA[node.js]]></category>
		<category><![CDATA[webpack]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=4184</guid>

					<description><![CDATA[近年流行りだした「モジュールバンドラー」ですが、いまでは必携と言えるほどの存在になりつつあります。 今回はそんなモジュールバンドラーをざっくりと紹介します。 モジュールバンドラーとは モジュールバンドラー（module  [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>近年流行りだした「モジュールバンドラー」ですが、いまでは必携と言えるほどの存在になりつつあります。 今回はそんなモジュールバンドラーをざっくりと紹介します。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh3.googleusercontent.com/VdpRNQ7NMKNmrPWKUru-dUlKdJzVR09cRpqVuk7gdcI-lVvAPkjSphHZj0um_QulJef1yz-Nd18EupCQuW0n0PdPkCYaBC019U7wVN_5G0hD8jPyAA_G41Uiw9AnNHPo7Y9TbHITQ33PsEFBdh5I9sKf5I8MC3FhSakM_wisM8NXCpqI8XxlsaU7MmkGMvWXS8yNfTVbHroA0IRf_5RgrYDaTvSxkpX06J-51pbo9F4J0Zd0T8n9sF1tsRj4k4sIE7qhvd2nKWQXYYx0Pa54tFayPNhA5HC8j_oWtkxqioR_EBgm8_2RkQcYXR9o23o3ka-R9J7ltu9jAbNUHMuEYPFL89txuE0ZemJQpM3BL8SOE7zpMZfrKFKp7Mbyg14HkkLniM5sG2rw5tI1y1v3Smtw6BYC_KmwfSO-pzz2mLHHw2gpqddU0_c112pLsknI2oHOOUUQCwPFg6tXkc1PFTPdZqxngXAVgZsBG2QzUwIcseProf1ddo5CtYlC4HLVYOPlO-BxiaNPGmkvMN0uucaCXOTZUQfx9ExOaA-2rU9lE-rVFEkubFx0u5Bk00coIaIrAjMzY8FSb4c3SDTdMM-83ALzxLw3gVq7i7Tpsqk5xvVQ=w400-h150-no" alt=""/></figure>



<p></p>



<span id="more-4184"></span>



<ol class="wp-block-list">
<li>モジュールバンドラーとは</li>



<li>どんな時に使いたい？</li>



<li>「requireを使える」ということ</li>



<li>様々なモジュールバンドラー</li>



<li>browserify を使ってみよう</li>



<li>browserify + Grunt で自動コンパイルする</li>



<li>まとめ</li>
</ol>



<h2 class="wp-block-heading">モジュールバンドラーとは</h2>



<p>モジュールバンドラー（module bundler）は、文字通りモジュールをひとまとめにする（bundle）ツールです。 あまり用語として聞き慣れませんが、モジュールバンドラーの代表格のひとつである <a href="https://webpack.github.io/">webpack</a> でも使用されている言葉です。 ひらたく言うと、JavaScriptの依存関係を解決し、それらをインクルードしたひとつのファイルにまとめてくれます。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh3.googleusercontent.com/n_gfeC6P7-J8_bwTd4P52yEyCMiGRTeTvrVtuZP8NQ0B1YVG5QPI1aA14FqOy3EVYqNOPJXcTWlXruDYeBrfZcylUiRiCsm8vt9sJDi236Wds5lgWeTDWqGXarn88trcm7rKLunjdU2f-6CypAdbh2TwvxqpoD4RwFAzcWJ5kWqxM4DUJ41z0PXNQXkCU0y-Uyrz2Tqcqrp5tw4OcHr0g9XiD6Lr0Knn5FnLWf9FkrLqSIvgkh-7Yv2PvEEWBge70ezfO8LFx6kG-T6IWb6VBJr6s-iEb-87mJwLzEZCsvFCL2hKJOI3bH4Wn5brbRNUZKRC9AyrPKUzqMp-00nxrkTZa28jRwWwdnVTiXN6WjLyrspiIfEeEBlWp9n2Gz2bQYGMKhKj15H6zQvvqqJVNQ3p-0MHNf_OlVnF4FpgIPSuFAfe5v0RvIz2LRkdZ4_g9yE5hdC_O76Rgp4DPO9W1EvLjSn0mQRuN2keWueaAqU6sCuB4hUDT_JjR2plmVe1Yaxylpi96BwNsiENkiw7NmO6Wif0tzGwzsVpJHCkBZ0lK_s5E75R0E0M2a8pgxfulMGRodNVbei-uq2gnT6Spwqf52D4ycmMUbq0EpIQd04HRWrU=w482-h390-no" alt=""/></figure>



<p></p>



<p>上の図のように、 <code>require</code> で表現された依存関係を解決してゆき、 コンパイルする際にそれらを全て内包したファイルを作ってくれるのが一般的なモジュールバンドラーの振る舞いです。 <code>require</code> はもともとサーバーサイドJavaScript用に考えられた仕様なので、基本的にブラウザ上では動きません。 それをブラウザ上でも利用可能にするというのが主な目的です。</p>



<h2 class="wp-block-heading">どんな時に使いたい？</h2>



<h3 class="wp-block-heading">1. JavaScriptファイルを連結したい</h3>



<p>旧来JSファイルを連結する際には、まとめたいファイルを指定してシンプルにファイルを繋げていましたが、 この方法には「連結するファイルリストを管理しなければならない」という煩わしさがあります。</p>



<p>一方でモジュールバンドラーの場合はコード内の <code>require</code> を辿って必要なファイルだけを梱包してくれるので、 ファイルリストの管理から解放され、モジュールの取捨選択も一行の追加・削除だけで解決できます。</p>



<h3 class="wp-block-heading">2. JavaScriptでモジュールのインポートをしたい</h3>



<p>他言語で <code>import</code> や <code>require</code> を使っている方は「モジュールのインポートができる」事の素晴らしさも十分にご承知だと思います。 要するに、一行加えるだけで別ファイルに記述された機能がそのファイル内で利用できる様になるのです。</p>



<p>また同時に、コードを見直す際などに依存関係が一目瞭然になるのも大きな利点です。 Webアプリケーションの開発ではJavaScriptファイルが肥大化・複雑化するので、なんとしても欲しい仕組みですね。</p>



<h3 class="wp-block-heading">3. パッケージマネージャーを npm で一本化したい</h3>



<p><strong>bower</strong> 等のパッケージマネージャーを利用されている方は一度はその管理に頭を悩ませるでしょう。 <strong>bower</strong> はそれ自身を npm でインストールして、.bowerrc と bower.json で設定を行って管理するのですが、 「どうせ npm で package.json があるんだからそっちで一本化したい」となるわけですね。</p>



<p>モジュールバンドラーは基本的に node_modules ディレクトリからモジュールを探してインポートするので、 全て npm だけで解決する事ができ、管理が大変楽になります。</p>



<h3 class="wp-block-heading">4. node.js のモジュールをブラウザ上で使いたい</h3>



<p>node.js 向けに作られたモジュールも（一部をのぞいて）インポート可能です。</p>



<h3 class="wp-block-heading">まとめると</h3>



<p>プロジェクトの規模が大きければ大きいほど、より効力を発揮すると言えそうです。</p>



<h2 class="wp-block-heading">「requireを使える」ということ</h2>



<p>node.js に明るくない方の為に簡単に補足をしておくと、 require / exports というのは node.js で使われているモジュールの読み込みの仕組みで、CommonJSなどと呼ばれていたりします。 例えばみんなだいすきjQueryを読み込みたい場合は、まず npm で jquery をインストールします。</p>


<pre class="wp-block-code"><span><code class="hljs">$ npm install jquery@1 --save
</code></span></pre>


<p>そしてJavaScript側で require します。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-keyword">var</span> $ = <span class="hljs-built_in">require</span>(<span class="hljs-string">"jquery"</span>);
</code></span></pre>


<p>これだけで、そのファイル内ではいつも通りに $ でjQueryを参照する事ができます。簡単ですね。</p>



<p>また、「そのファイル内では」という所がポイントで、上の例の記述はグローバルな空間を汚染しません。 つまり、そのファイルのコンテキスト外で jQuery を利用しようとしても、参照出来ないという事です。</p>



<h3 class="wp-block-heading">ローカルモジュールを組み込む</h3>



<p>npm で導入したのではない、自前のモジュールを読み込みたい場合は、そのファイルまでの相対パスで指定します。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-keyword">var</span> utils = <span class="hljs-built_in">require</span>(<span class="hljs-string">"./modules/utils"</span>);
</code></span></pre>


<p>ここで注意したいのは、相対パスを &#8220;./&#8221; からはじめている部分です。 これが &#8220;modules/utils&#8221; だとモジュールの名前だと判断され、 &#8220;modules/utils&#8221; という名前のモジュールを node_modules から探そうとしてしまいます。</p>



<h3 class="wp-block-heading">require できるローカルモジュールを作る</h3>



<p>モジュールの宣言は <strong>exports</strong> あるいは <strong>module.exports</strong> に代入して行います。 まずは <strong>exports</strong> から使ってみましょう。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-comment">// modules/utils.js</span>
exports.foo = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{ <span class="hljs-keyword">return</span> <span class="hljs-string">"foo"</span>; };
exports.bar = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{ <span class="hljs-keyword">return</span> <span class="hljs-string">"bar"</span>; };
</code></span></pre>


<p>このように書く事で、require の返り値がプロパティに foo と bar を備えたオブジェクトになります。 要するに、モジュール内で宣言されている <strong>exports</strong> オブジェクトを返しているわけですね。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-keyword">var</span> utils = <span class="hljs-built_in">require</span>(<span class="hljs-string">"./modules/utils"</span>);
utils.foo(); <span class="hljs-comment">// =&gt; "foo"</span>
</code></span></pre>


<p>対して <strong>module.exports</strong> は、返り値そのものを書き換えたい場合、たとえばオブジェクトではなく関数等にしたい時に有効です。 クラスを返したいケースなどで使えますね。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-comment">// modules/foo.js</span>
<span class="hljs-keyword">var</span> Foo = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{ ... };
<span class="hljs-built_in">module</span>.exports = Foo;
</code></span></pre>


<p>このようにすると、返り値は Foo 関数そのものとなります。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-keyword">var</span> Foo = <span class="hljs-built_in">require</span>(<span class="hljs-string">"./modules/foo"</span>);
<span class="hljs-keyword">var</span> foo = <span class="hljs-keyword">new</span> Foo();
</code></span></pre>


<h2 class="wp-block-heading">様々なモジュールバンドラー</h2>



<h3 class="wp-block-heading">browserify</h3>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><a href="http://browserify.org/">Browserify</a> &#8211; <a href="http://browserify.org/">http://browserify.org/</a><br />
  Browserify lets you require(&#8216;modules&#8217;) in the browser by bundling up all of your dependencies.</p>
</blockquote>



<ul class="wp-block-list">
<li>単機能な方向性で、シンプルで簡単</li>



<li>Gulpとの相性はイマイチです</li>
</ul>



<h3 class="wp-block-heading">webpack</h3>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><a href="https://webpack.github.io/">webpack</a> &#8211; <a href="https://webpack.github.io/">https://webpack.github.io/</a><br />
  webpack, the flexible module bundler</p>
</blockquote>



<ul class="wp-block-list">
<li>JSのバンドルに留まらず多機能ですが、設定が少々ややこしい</li>



<li>Gruntとの相性はイマイチです</li>



<li>AMD仕様でのモジュール定義も可能</li>



<li>browserifyと比較して速度でアドバンテージがある様です</li>
</ul>



<p>RequireJS という物もありましたが、モジュールの定義がCommonJSではなく本記事に沿わないので割愛します。 browserifyは単機能でシンプル、webpackは多機能という印象です。</p>



<h2 class="wp-block-heading">browserify を使ってみよう</h2>



<p>シンプルな browserify を実際に使ってみましょう。 前提条件として、node.js がインストールされている必要があります。</p>



<h3 class="wp-block-heading">1. インストール</h3>



<p>ターミナル等で browserify をインストールします。環境によっては <code>sudo</code> を頭に付ける必要があります。</p>


<pre class="wp-block-code"><span><code class="hljs">$ npm install -g browserify
</code></span></pre>


<p>インストールが完了すれば <code>browserify</code> コマンドが使用可能になります。</p>


<pre class="wp-block-code"><span><code class="hljs">$ browserify --help
Usage: browserify &#91;entry files] {OPTIONS}
</code></span></pre>


<h3 class="wp-block-heading">2. 実行する</h3>



<p>適当なJSファイルを用意して、<code>browserify</code> コマンドでコンパイルしてみましょう。</p>


<pre class="wp-block-code"><span><code class="hljs">$ browserify test.js -o bundle.js
</code></span></pre>


<p>こちらが基本形です。上のコマンドを実行すると、test.js をコンパイルした結果が bundle.js として保存されます。</p>



<h2 class="wp-block-heading">browserify + Grunt で自動コンパイルする</h2>



<p>browserify コマンドを毎度実行するのは面倒なので、 タスクランナー（Grunt）でファイルの更新を検知して自動的にコンパイルする環境をつくります。 （前述にもありますが、Gulp + browserify は少々手間がかかり説明に不向きなので、ここでは Grunt で説明します）</p>



<h3 class="wp-block-heading">ファイル構成例</h3>


<pre class="wp-block-code"><span><code class="hljs">/
├ html/
│ └ assets/
│      └ js/
│           ├ src/
│           │ ├ modules/
│           │ │ ├ mymodule-01.js
│           │ │ └ mymodule-02.js
│           │ └ main.js ... エントリーファイル
│           └ main.js ... コンパイル先のJSファイル
├ node_modules/
└ Gruntfile.js
</code></span></pre>


<h3 class="wp-block-heading">設定</h3>



<p>まず必要なモジュールをインストールします。</p>


<pre class="wp-block-code"><span><code class="hljs">$ npm install grunt grunt-browserify grunt-contrib-watch --save-dev
</code></span></pre>


<p>Gruntfile.js を用意します。タスクの設定は下記のような感じにしてみます。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">grunt.initConfig({

    <span class="hljs-attr">browserify</span>: {
        <span class="hljs-attr">dev</span>: {
            <span class="hljs-attr">options</span>: {
                <span class="hljs-attr">borwserifyOptions</span>: {
                    <span class="hljs-attr">debug</span>: <span class="hljs-literal">true</span>
                }
            },
            <span class="hljs-attr">files</span>: &#91;
                {
                    <span class="hljs-attr">expand</span>: <span class="hljs-literal">true</span>,
                    <span class="hljs-attr">cwd</span>: <span class="hljs-string">"html/assets/js/src"</span>,
                    <span class="hljs-attr">src</span>: <span class="hljs-string">"*.js"</span>,
                    <span class="hljs-attr">dest</span>: <span class="hljs-string">"html/assets/js"</span>
                }
            ]
        }
    },

    <span class="hljs-attr">watch</span>: {
        <span class="hljs-attr">js</span>: {
            <span class="hljs-attr">files</span>: &#91;<span class="hljs-string">"html/assets/js/src/**/*.js"</span>],
            <span class="hljs-attr">tasks</span>: &#91;<span class="hljs-string">"browserify:dev"</span>]
        }
    }

});
</code></span></pre>


<ul class="wp-block-list">
<li><code>html/assets/js/src/*.js</code> をエントリーファイルとして、同名ファイルを <code>html/assets/js/</code> に書き出します</li>



<li><code>html/assets/js/src/**/*.js</code> が変更されると、browserify タスクが走ってコンパイルを行います</li>



<li>browserify に渡すオプションは、<code>browserifyOptions</code> に記述します。 <code>debug</code> を true にするとソースマップを生成する様になります。</li>
</ul>



<p>準備が整ったら watch してみましょう。</p>


<pre class="wp-block-code"><span><code class="hljs">$ grunt watch
</code></span></pre>


<p>無事動きましたか？</p>



<h2 class="wp-block-heading">まとめ</h2>



<p>モジュールバンドラーは昨年（2015年）あたりから流行りだして、 使ってみたところあまりにも効率が良く、今ではもう手放せない存在になりました。 CSSプリプロセッサ、タスクランナーと並んで、近年の素晴らしすぎる発明の一つですね。</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
