webpack2へ移行する軽いメモ
npmの方もbetaが取れて、2.2.1が公式に配布となりました。
公式サイト
webpackのversion:2のために公式サイトが作られました。 webpack
移行の手順
詳しくはこちらを確認してください。
Migrating from v1 to v2
Medium
移行における変更点
フィールドバリデータ
設定ファイルのフィールドを検証します。
v1ではwebpack-validatorが必要でしたが、v2ではデフォルトで入っています。
ローダー
リネーム
module.loaders
->module.rules
loaders
->use
query
->options
{ rules: [ { test: /\.js$/, use: ['babel-loader'], options: { } } ] }
module-loaders-is-now-module-rules
preLoadersとpostLoaders
ローダーを呼び出すタイミングを設定するpreとpostのキーがなくなります。
v1ではmodule.preLoaders
, module.postLoaders
の中に各ローダーの設定を書いていましたが、v2ではすべてのローダーがrules
に入りキーでの区別がなくなります。
その代わりに、enforce
を各ルール内に設定します。
{ rules: [ { test: /\.js$/, use: ['eslint-loader'], enforce: 'pre' // or 'post' } ] }
module-preloaders-and-module-postloaders-was-removed
ローダーチェイン
style-loader!css-loader!less-loader
のようなv1の書き方はuse
ではサポートされません。
module.loaders
の場合のみサポートされます。
use
を使ったときの上記の書き方だと以下のようになります。
rules: { use: [ 'style-loader', 'css-loader', 'less-loader' ] }
-loaderのサフィックスについて
-loader
を設定なしで省略することはできなくなります。
もし省略したい場合は、resolveLoader.moduleExtensions = ['-loader']
を設定する必要があります。
できなくなった理由として、エラーが理解しづらくなるからです。
Remove automatic -loader module name extension · Issue #2986 · webpack/webpack · GitHub
automatic-loader-module-name-extension-removed
jsonのロードについて
今まではjson-loaderが必要でしたが、設定の必要がなくなります。
v2以降は自動的にwebpack側が内部で呼び出します。
Support JSON out of the box · Issue #3363 · webpack/webpack · GitHub
json-loader-is-not-required-anymore
プラグイン
名前の変更が必要(デプリケートなものも含む)
- OccurenceOrderPlugin -> OccurrenceOrderPlugin
- NoErrorsPlugin -> NoEmitOnErrorsPlugin
消されたもの
- DedupePlugin
- ResolverPlugin
- OldWatchingPlugin
extract-text-webpack-plugin
今現在、v2.0.0-rc.2となっています。
なので、何も指定無しでnpmからinstallすると1.0.1がダウンロードされるので注意が必要です。
引数のとり方が変わりました。今まではファイル名とオプションが別々だったのが、すべてオブジェクトで包みます。
今現在、急ぎで開発を行っています。
new ExtractTextPlugin({ filename: 'bundle.css', disable: false, allChunks: true })
https://github.com/webpack-contrib/extract-text-webpack-plugin/milestone/1github.com
extracttextwebpackplugin-breaking-change
resolve
resolveの書き方が変わります。
root
がmodules
にリネームされました。
ここにbower_components
を書き、descriptionFiles
にbower.json
書くとnode_modulesと同じように引けます。
今まではresolverPluginで引いていたのですが、この書き方でいけるようになりました。
Resolve
webpack以外での変更するべき設定
Babel
tree shakingのため、es6 modulesからcommonJS modulesへの変換を停止させます。
{ "presets": [ ["es2015", {"modules": false}] ] }
mixing-es2015-with-amd-and-commonjs
react-hot-loader
まだ、npmの方は1.3.1系ですが、3系にそろそろ(?)上がりそうなので追加します。
1系から3系への変更はこちらを参照
1系では以下の用に書いてたのですが、
if (module.hot) { module.hot.accept('./App', () => { const NextApp = require('./App').default; ReactDOM.render( <AppContainer> <NextApp /> </AppContainer>, rootEl ); }); }
3系では上記のNextAppの部分が必要なくなり、共通化することが可能になりました。
詳しい構成等は以下を参照してください。nextブランチが3.0.0向けになっています。 github.com
Document React Hot Loader 3 · Issue #243 · gaearon/react-hot-loader · GitHub React Hot Loader 3 by gaearon · Pull Request #240 · gaearon/react-hot-loader · GitHub
Jest
.babelrcの方でmodules: false
しますが、JestはNodeで動くため、commonJS modulesにする必要があります。
テストのときだけcommonJS modulesへ変換します。
{ "presets": [ ["es2015", {"modules": false}] ], "env": { "test": { "plugins": ["transform-es2015-modules-commonjs"] } } }
https://facebook.github.io/jest/docs/webpack.html#using-with-webpack-2facebook.github.io
ローダの設定を書く場所
フィールドのバリデータが入り、今までルートに設定を書いていたものは使えなくなりました。(e.g. postcss)
書き方は2種類(設定ファイルの書けるもの(babel, postcss, etc…)については3種類)あります。
各種ローダのoptions
を使う方法、LoaderOptionsPluginを使う方法です。
基本的に自分は、LoaderOptionsPluginの方では書かず、 外部設定ファイルかoptions
のどちらかで定義します。
理由として、LoaderOptionsPluginの場合はグローバル(1つしか宣言できない)と同じ扱いになるので同じローダでも個別に適応することをわけるのが難しくなるからです。
(これにおいては設定ファイルでもグローバルになるのでダメですが。。)