webpack2はじめました


仕事のプロジェクトでお世話になっているRailsが5.1からwebpackがサポートされるということで、そろそろモダンなフロントエンドにも力入れていきたい所存であるからして、手始めにwebpackとはなんぞやというところから始めようと思った次第です。

- webpackとは
- webpack事始め
- v1とv2で全然違うのが罠

以上のことを自分なりにまとめてみました。
自分用の備忘録なので、分かりづらかったり、よく理解できてなかったりするかもしれませんが…コメントなどで指摘していただけるとありがたいです。

## webpackとは

webpackとはなんぞや。
早い話、Ruby大先生で言うところのBundlerみたいなもの……って例えるとわかりやすいでしょうか。
ちょっと違うような気もします。Node.jsのnpm先輩もいますし…。
__モジュールバンドラー__ っていうのが正解らしいのですが、じゃあこの_モジュールバンドラーって何さ？_ってことになると思います。

参考：[初めてのwebpack](http://qiita.com/kmszk/items/45fb4690ace32216ca25)
このページが詳しく書いてあります。
要約すると、フロントエンドで開発してきたJSなりSASSやらLESSで作った __ファイル（モジュール）をバンドル（まとめてくれる）__ のがwebpackということらしいです。
ただ、今までgulpでやってた仮想サーバーとかファイルのwatch機能、モジュールコードをバンドルする過程で、Babel.jsなどを使ってプリコンパイルや、SassやLESSなどのメタ言語のコンパイルとかも出来るので、タスクランナーと勘違いしてしまうこともあるような気がします。
__ちがう、タスクランナーじゃなくて、モジュールバンドラーだから__。

## webpack事始め

前提として、

- node.jsを使ったことがある。
- npmを使ったことがある。
- ターミナルでのCLI操作に抵抗がない

以上3点はクリアしているものとして、勧めます。
「そもそも黒い画面なんて怖い！見たくない！」って言う人は…………、__CLIでnode.js100万回くらいインストールしてきてから読んだほうがいいかもしれないです。__

### まずは公式の`Getting Started`を参考に

webpackは最新バージョンは2です。ggると大体v1の方のチュートリアルとかが出てくるんですが、微妙に参考になったり参考にならなかったりしたので、v2のサイトに乗ってる_GUIDE_の_Getting Started_を参考にした方が、わかりやすいと思います。
ただ、公式のドキュメントになりますので、英語をある程度読めないといけません。
私は英語は中学生レベルで止まってる感じですが、なんとか理解できたので…多分大丈夫（だと思います）。

ただ、公式のものそのままだと、無駄なステップがあったりするので若干省略します。

```sh
# webpack-demoというディレクトリを作成して、移動
  mkdir webpack-demo && cd webpack-demo
# npmのpackage.jsonを作成
  npm init -y
# webpackのインストール
  npm install --save-dev webpack
# webpackがインストールされたか確認
  webpack --help
```

大体ここまでは大したエラーもなくすんなり進むと思います。
次に「hello webpack」というテキストを表示させます。
`app`というディレクトリを作ってその中`index.js`を作成して次のコードを書きます。

```js
import _ from 'lodash';
function component () {
  var element = document.createElement('div');
  element.innerHTML = _.join(['Hello','webpack'], ' ');

  return element;
}

document.body.appendChild(component());

```

この書き方だと`lodash`入れないと動かないので、インストールしておきます。

```
npm install --save lodash
```

あとHTMLも用意します。

```html
<html>
   <head>
     <title>webpack 2 demo</title>
   </head>
   <body>
     <script src="dist/bundle.js"></script>
   </body>
 </html>
```

続いてwebpackの設定ファイルを作ります。
大体`webpack.config.js`で作られてますが、`webpack`の部分は任意の名前で問題ないみたいです。
でも、考えるのめんどくさいし、今の段階でconfigファイルは一個しか必要ないので`webpack.config.js`で作ります。

```js
var path = require('path');
var webpack = require('webpack');
module.exports = [
  {
    entry: ['./source/app.js'],  //元ネタのjsファイルパス
    output: {
      filename: 'bundle.js', // 出力する時のファイル名（お好みで）
      path: path.resolve(__dirname, 'dist')  //出力先のディレクトリパスを指定。（__dirnameは多分rootのことを指してるんじゃないかな…）←多分
    },
  },
];
```

configを書いたら、`$ npm run webpack`コマンドを叩いて、実装します。
outputで指定したディレクトリに、指定したファイル名のjsファイルが書き出されてればOKです。
`index.html`をブラウザの窓に突っ込んで表示してみてください。
`Hello webpack`と表示されれば成功です。

## v1とv2の違い
個人的に、Qiitaとかはてブの記事を見ててなんとなく引っかかったところです。
v1とv2でconfig.jsの書き方が微妙に変更になっています。
自分も勉強中なので、まだまだわからないこともありますが、一番わかり易い、よく目にするところで言うと、Loader周りがv1とv2で記述方法が変更されているみたいです。

参考：[Migrating from v1 to v2](https://webpack.js.org/guides/migrating/)

```js:v1
module: {
  loaders: [
    {
      test: /\.css$/,
      loaders: [
        "style-loader",
        "css-loader?modules=true"
      ]
    },
    {
      test: /\.jsx$/,
      loader: "babel-loader", // Do not use "use" here
      options: {
        // ...
      }
    }
  ]
}
```

```js:v2
module: {
  rules: [
    {
      test: /\.css$/,
      use: [
        {
          loader: "style-loader"
        },
        {
          loader: "css-loader",
          options: {
            modules: true
          }
        }
      ]
    },
    {
      test: /\.jsx$/,
      loader: "babel-loader", // Do not use "use" here
      options: {
        // ...
      }
    }
  ]
}
```

似ているようで、結構違います。
v2インストールしても、v1の書き方してて「動かない？！？！(ﾟωﾟ; )」ってことが、自分も写経しててよくありました。
ggって探すと大抵v1の書き方が紹介されてるんですが、npm install でインストールされるのは最新のv2なので…ggるときも、v2に絞って探さないといけない…
っていうか、もう公式ドキュメント見たほうが早いな…ってなって、結局公式の英語ドキュメントを、Google翻訳片手に眺めては写経してました。
ReactとかAngulerとかJSライブラリ周りをいじるときもBabel読み込んだりいろいろ使うと思いますが、
SassとかCSSとかimgとか読み込ませたりするのにLoaderを使うので、これからwebpack始めるよ！という方は、ドキュメント探すときの参考になればいいなって思います。


私は英語も得意じゃないですし、webpackも触り初めて1週間経つか経たないかのレベルしかさわれてないので、もし「ここ違うよ！」っていうのがあれば、遠慮なくコメントいただけるとうれしいです(･∀-`; )

__参考__

- [Getting Started（webpack2公式）](https://webpack.js.org/guides/get-started/)
- [Migrating from v1 to v2](https://webpack.js.org/guides/migrating/)
- [webpack 入門](http://qiita.com/soarflat/items/28bf799f7e0335b68186)
- [タスクランナーを使わずにnpm+webpackのみでWebアプリ開発](http://qiita.com/nihsuy/items/9b7effe47ebe5869fd3f)
- [step by stepで始めるwebpack](http://qiita.com/howdy39/items/48d85c430f90a21075cd)
- [Webpackってどんなもの？](http://qiita.com/kmszk/items/45fb4690ace32216ca25)
- [webpackでes6+React+Redux+Sassの環境を構築してみる(sourceMap,uglify,minimizeも)](http://qiita.com/keitaMatsuo/items/65d7a613918747930be9)
- [【webpack2対応】俺が作り上げたSCSSのビルド環境を晒す【リントもあるよ】](http://qiita.com/Mic-U/items/d222a677d80a5ab46e2c)
- [webpack.config.jsの読み方、書き方](http://dackdive.hateblo.jp/entry/2016/04/13/123000)