Slide 1

Slide 1 text

React+webpackのビルドを高速化 Osaka Mix Leap (2018/01/11)平野昌士 / @shisama

Slide 2

Slide 2 text

{ "about": { "name": "Masashi Hirano", "works": "Weblio, Inc.", "twitter": "@shisama_", "github": "shisama" } }

Slide 3

Slide 3 text

この発表の対象者 webpack使ってる方 JSのビルドに時間がかかるとお悩みの方 開発スピードをもっとあげたい方

Slide 4

Slide 4 text

仕事でReactを使ったSPAを開発して います

Slide 5

Slide 5 text

webpackを使ってビルドしています

Slide 6

Slide 6 text

webpackのビルド実行時間 1分もかかります

Slide 7

Slide 7 text

もっとビルド早くして開発スピードあ げたい

Slide 8

Slide 8 text

主にwebpackでしていること 複数ファイルを一つにバンドル babelでES2015+やReactを変換 minify

Slide 9

Slide 9 text

高速化前のwebpack.config module.exports = { // webpack.config.js 一部抜粋 plugins: [ new webpack.optimize.UglifyJsPlugin(), ], module: { rules: [ { test: /\.(js|jsx)$/, use: 'babel-loader', }, ] }, };

Slide 10

Slide 10 text

ここからビルドの実行を高 速化していきます

Slide 11

Slide 11 text

高速化に使ったもの cacheDirectory DllPlugin

Slide 12

Slide 12 text

cacheDirectory

Slide 13

Slide 13 text

cacheDirectory babel‒loaderのオプション機能 babelの結果をキャッシュする デフォルトではoffになっています

Slide 14

Slide 14 text

cacheDirectoryの使いかた webpack.config内のbabel‒loaderにクエリを追加する だけ

Slide 15

Slide 15 text

cacheDirectoryの使いかた module.exports = { // webpack.config.js 一部抜粋 plugins: [ new webpack.optimize.UglifyJsPlugin(), ], module: { rules: [ { test: /\.(js|jsx)$/, use: 'babel-loader?cacheDirectory', // cacheDirectory on }, ] }, };

Slide 16

Slide 16 text

ビルド実行時間 高速化前: 1分前後 cacheDirectory(初回): 1分前後 cacheDirectory(2回目以降): 40秒~50秒

Slide 17

Slide 17 text

DllPlugin

Slide 18

Slide 18 text

DllPlugin webpackのプラグイン 依存PKGだけバンドルしてファイル分割  →reactとかreact‒domとかを別ファイルにまとめる  →分割するので、元のバンドルファイルは軽くなる  →分割したファイル両方をhtmlで読み込む 依存PKGに変更が無ければDLLバンドルファイルの更 新は不要

Slide 19

Slide 19 text

DllPluginの使い方 DLLバンドル用のwebpack.configを用意 これまでのwebpack.config側でDLLバンドルの情報を 読み込む 分割したファイルをhtmlで読み込む

Slide 20

Slide 20 text

DLLバンドル用のwebpack.config const path = require('path'); const webpack = require('webpack'); module.exports = { entry: { // 依存PKG 配列 指定 vendor: ['react', 'react-dom' /* 依存PKG */], }, output: { path: 'path/to/dist', filename: '[name].dll.js', library: '[name]', }, plugins: [ // DllPlugin manifest.json 吐 new webpack.DllPlugin({ path: 'path/to/dll/[name]-manifest.json'), name: '[name]', }), new webpack.optimize.UglifyJsPlugin(), ], resolve: { modules: [path.resolve(__dirname, 'src'), 'node_modules'], }, };

Slide 21

Slide 21 text

これまでのwebpack.config module.exports = { // webpack.config.js 一部抜粋 plugins: [ // Dll 使 new webpack.DllReferencePlugin({ context: __dirname, // DLL manifest.json 指定 manifest: require('path/to/dll/vendor-manifest.json'), }), new webpack.optimize.UglifyJsPlugin(), ], module: { rules: [ { test: /\.(js|jsx)$/, use: 'babel-loader?cacheDirectory', // cacheDirectory on }, ] } };

Slide 22

Slide 22 text

分割したファイルをhtmlで読み込む

Slide 23

Slide 23 text

ビルド実行時間 高速化前: 1分前後 cacheDirectory(2回目以降): 40~50秒 cacheDirectory+DllPlugin: 20秒前後

Slide 24

Slide 24 text

その他高速手段 ・happypack  ・webpackのキャッシュ  ・今回は効果が出ませんでした ・webpack#externals  ・指定したPKGをバンドルに含めない  ・依存PKGはCDNから取ってくる場合おすすめ ・parcel  ・バズったやつ  ・Blazing fast。webpackよりかなりビルド早い  ・no config  ・webpackほど機能豊富ではない  ・minifyが壊れていたりするらしい  ・現状では導入は厳しそう

Slide 25

Slide 25 text

参考 ・ ・ ・ ・ ・ babel‒loader DllPlugin webpackのDLLバンドルを使ってビルドを速くする webpack時代の終わりとparcel時代のはじまり parcelでバンドルしてみた & そのとき出会ったハマりどころまと め

Slide 26

Slide 26 text

宣伝

Slide 27

Slide 27 text

ご清聴ありがとうございました