webpack build 高速化 まとめ

この記事は[Typescript Tutorial React & Webpack](https://www.typescriptlang.org/docs/handbook/react-&-webpack.html)を出汁にしています。 
$ `npm install -D webpack@beta typescript@beta ts-loader source-map-loader @types/react-dom @types/react`
$ `npm install -S react@next react-dom@next` 

途中webpackのバージョンが更新されていますがこの記事に関しては問題ないと思われます。
気になる方は [What's new in webpack 2](https://gist.github.com/sokra/27b24881210b56bbaff7) 

## エピソード 1 「Qiita 新着順で眺めてたら記事発見」
[webpackのDLLバンドルを使ってビルドを速くする](http://qiita.com/pirosikick/items/c77db84dbed4c447a6fe)
[pirosikick](http://qiita.com/pirosikick)さんの投稿で[HappyPack](https://github.com/amireh/happypack)の存在を知る。

HappyPackに関する日本語の記事は一つもなかったので、公式ドキュメントとソースをさっと流し読みして試してみる。
$ `npm install -D happypack`

```js:webpack.config.js
var path = require('path');
var HappyPack = require('happypack');

module.exports = {
  entry: "./src/index.tsx",
  output: {
    path: __dirname + "/dist",
    filename: "bundle.js",
  },
  devtool: "source-map",
  resolve: {
    extensions: ["", ".ts", ".tsx", ".js"]
  },
  // externalsも有効
  externals: {
    "react": "React",
    "react-dom": "ReactDOM"
  },
  plugins: [
    new HappyPack({
      cache: true,
      loaders: ["ts!source-map"],
      threads: 4
    })
  ],
  module: {
    loaders: [
      {
        test: /\.tsx?$/,
        loader: path.resolve(__dirname, "./node_modules/ts-loader")
      }
    ],
    preLoaders: [
      {
        test: /\.js$/,
        loader: path.resolve(__dirname, "./node_modules/source-map-loader")
      }
    ],
  }
};
```

![happpack.png](https://qiita-image-store.s3.amazonaws.com/0/115845/e9a97584-178d-e10e-41a8-666a644ce43f.png)

happypackは特別に

- externals(後に詳細)有効
- HappyPackの機能のキャッシュ有効 
- スレッド４つ

## エピソード 2 「DLLバンドルは？」

![dll-used.png](https://qiita-image-store.s3.amazonaws.com/0/115845/0cabf08b-7f62-d585-4652-e50fbb7154f8.png)

## エピソード 3 「何もしない場合？」

![default.png](https://qiita-image-store.s3.amazonaws.com/0/115845/d94f19f6-9dcb-2423-a0a1-e8ed37354362.png)

## エピソード 4 「何もしないよりマシだったけど、気になるからおとなしく公式Tutorialで試してみる」 

![external.png](https://qiita-image-store.s3.amazonaws.com/0/115845/7b0f0550-478c-6430-775d-0ba5279af2b5.png)

## エピソード 5 結論

```js:webpack.config.js
module.exports = {
    entry: "./src/index.tsx",
    output: {
        filename: "./dist/bundle.js",
    },

    // Enable sourcemaps for debugging webpack's output.
    devtool: "source-map",

    resolve: {
        // Add '.ts' and '.tsx' as resolvable extensions.
        extensions: ["", ".webpack.js", ".web.js", ".ts", ".tsx", ".js"]
    },

    module: {
        loaders: [
            // All files with a '.ts' or '.tsx' extension will be handled by 'ts-loader'.
            { test: /\.tsx?$/, loader: "ts-loader" }
        ],

        preLoaders: [
            // All output '.js' files will have any sourcemaps re-processed by 'source-map-loader'.
            { test: /\.js$/, loader: "source-map-loader" }
        ]
    },

    // When importing a module whose path matches one of the following, just
    // assume a corresponding global variable exists and use that instead.
    // This is important because it allows us to avoid bundling all of our
    // dependencies, which allows browsers to cache those libraries between builds.
    externals: {
        "react": "React",
        "react-dom": "ReactDOM"
    },
};
```

# つよさ： externals > dll >> happypack >>> default


- HappyPackは見込み無し 
- dllは見込みあり 
- externalsはwebpack.config.jsに記述するだけで最高パフォーマンス


貴重な時間を浪費してしまった😢

externalsについては公式ドキュメントやQiitaやGoogle検索で。

誤字脱字、情報の誤りはお教えください😢