このガイドは、webpackを直接使用する場合のwebpack 5への移行を支援することを目的としています。より高レベルのツールを使用してwebpackを実行している場合は、移行手順についてはそのツールを参照してください。
Webpack 5は少なくともNode.js 10.13.0(LTS)が必要です。古いバージョンを使用している場合は、Node.jsをアップグレードしてください。
webpack
4を最新バージョンにアップグレードします。
webpack >= 4を使用している場合、最新のwebpack 4バージョンへのアップグレードは、追加のガイダンスを必要としません。
4より前のバージョンのwebpackを使用している場合は、webpack 4移行ガイドを参照してください。
webpack-cli
を最新バージョンにアップグレードします(使用する場合)。
使用しているすべてのプラグインとローダーを最新バージョンにアップグレードします。
一部のプラグインとローダーでは、webpack 5との互換性のためにベータ版を使用する必要がある場合があります。アップグレードする際には、各プラグイン/ローダーのリリースノートをよく読んでください。最新バージョンはwebpack 5のみをサポートしており、v4では失敗する可能性があります。そのような場合は、webpack 4をサポートする最新バージョンに更新することをお勧めします。
webpack
、webpack-cli
、プラグイン、ローダーのアップグレードされたバージョンによって、新しいエラーや警告が発生することがあります。ビルド中に非推奨の警告に注意してください。
非推奨の警告のスタックトレースを取得するために、このようにwebpack
を呼び出すことができます。どのプラグインとローダーが原因なのかを突き止められます。
node --trace-deprecation node_modules/webpack/bin/webpack.js
webpack 5はすべての非推奨機能を削除するため、続行するには、ビルド中にwebpackの非推奨警告がないことを確認してください。
mode
を使用してください対応するデフォルトが設定されるように、mode
をproduction
またはdevelopment
に設定します。
次のオプションを新しいバージョンに更新します(使用している場合)。
optimization.hashedModuleIds: true
→ optimization.moduleIds: 'hashed'
optimization.namedChunks: true
→ optimization.chunkIds: 'named'
optimization.namedModules: true
→ optimization.moduleIds: 'named'
NamedModulesPlugin
→ optimization.moduleIds: 'named'
NamedChunksPlugin
→ optimization.chunkIds: 'named'
HashedModuleIdsPlugin
→ optimization.moduleIds: 'hashed'
optimization.noEmitOnErrors: false
→ optimization.emitOnErrors: true
optimization.occurrenceOrder: true
→ optimization: { chunkIds: 'total-size', moduleIds: 'size' }
optimization.splitChunks.cacheGroups.vendors
→ optimization.splitChunks.cacheGroups.defaultVendors
optimization.splitChunks.cacheGroups.test(module, chunks)
→ optimization.splitChunks.cacheGroups.test(module, { chunkGraph, moduleGraph })
Compilation.entries
→ Compilation.entryDependencies
serve
→ DevServer
に置き換えられました。Rule.query
(v3以降非推奨)→ Rule.options
/UseEntry.options
Rule.loaders
→ Rule.use
webpack 4の設定で次のオプションを設定し、ビルドが正しく機能するかどうかを確認してみてください。
module.exports = {
// ...
node: {
Buffer: false,
process: false,
},
};
webpack 5用に設定をアップグレードする際には、これらのオプションを削除する必要があります。
それでは、webpackをバージョン5にアップグレードしましょう。
npm: npm install webpack@latest
Yarn: yarn add webpack@latest
「webpack 4と、そのプラグイン/ローダーのアップグレード」の手順で、一部のプラグイン/ローダーを最新バージョンにアップグレードできなかった場合は、ここでアップグレードしてください。
webpackの設定からoptimization.moduleIds
とoptimization.chunkIds
を削除することを検討してください。デフォルトの方が優れている可能性があります。なぜなら、productionモード
では長期的なキャッシングを、developmentモード
ではデバッグをサポートしているからです。
webpackの設定で[hash]
プレースホルダーを使用している場合は、[contenthash]
に変更することを検討してください。同じではありませんが、より効果的であることが証明されています。
YarnのPnPとpnp-webpack-plugin
を使用している場合は、朗報です。今ではデフォルトでサポートされています。設定から削除する必要があります。
正規表現を引数としてIgnorePlugin
を使用している場合、現在はoptions
オブジェクトを使用するようになりました。new IgnorePlugin({ resourceRegExp: /regExp/ })
node.fs: 'empty'
のようなものを使用している場合は、resolve.fallback.fs: false
に置き換えてください。
Webpack Node.js APIでwatch: true
を使用している場合は、削除してください。呼び出すコンパイラメソッド(watch()
の場合はtrue
、run()
の場合はfalse
)によって示されるため、設定する必要はありません。
raw-loader
、url-loader
、またはfile-loader
を使用してアセットを読み込むためのrules
を定義している場合、近いうちに非推奨となるため、代わりにAsset Modulesを使用してください。
target
を関数に設定している場合は、false
に更新し、その関数をplugins
オプション内で適用してください。以下の例を参照してください。
// for webpack 4
{
target: WebExtensionTarget(nodeConfig)
}
// for webpack 5
{
target: false,
plugins: [
WebExtensionTarget(nodeConfig)
]
}
output.library
またはoutput.libraryTarget
が定義されている場合、プロパティ名を変更します。(output.libraryTarget
→ output.library.type
、output.library
→ output.library.name
)。例
// for webpack 4
{
output: {
library: 'MyLibrary',
libraryTarget: 'commonjs2'
}
}
// for webpack 5
{
output: {
library: {
name: 'MyLibrary',
type: 'commonjs2'
}
}
}
インポートを使用してWebAssemblyを使用していた場合は、次の2段階のプロセスに従ってください。
experiments.syncWebAssembly: true
を設定して非推奨の仕様を有効にします。experiments
の値をexperiments: { asyncWebAssembly: true }
に変更して、WASM統合の最新仕様を使用してください。optimization.splitChunks
を見直してください。
optimization.splitChunks: { chunks: 'all' }
を使用することをお勧めします。name: false
を削除し、name: string | function
をidHint: string | function
に置き換えます。optimization.splitChunks.cacheGroups: { default: false, vendors: false }
を設定することで、デフォルトを無効にすることができました。これはお勧めしませんが、Webpack 5で同じ効果を得たい場合は、optimization.splitChunks.cacheGroups: { default: false, defaultVendors: false }
を使用してください。デフォルトの削除を検討してください。
entry: './src/index.js'
を使用している場合:これはデフォルトなので省略できます。output.path: path.resolve(__dirname, 'dist')
を使用している場合:これはデフォルトなので省略できます。output.filename: '[name].js'
を使用している場合:これはデフォルトなので省略できます。プロジェクトでbrowserslistを有効にしている場合、Webpack 5はbrowserslist
の設定を再利用して、ランタイムコードに対してどのコードスタイルを出力するかを決定します。
必ず
target
をbrowserslist
に設定するか、target
を削除してWebpackが自動的にbrowserslist
を設定できるようにしてください。browserslist
設定にIE 11
を追加してください。browserslist
がない場合、WebpackのランタイムコードはES2015構文(例:アロー関数)を使用してより小さいバンドルを作成します。そのため、ES2015構文をサポートしていないブラウザ(IE11など)に対してES5構文を使用するには、target: ['web', 'es5']
を設定する必要があります。
Node.jsの場合、ビルドにはサポートされているNode.jsバージョンがtarget
オプションに含まれ、Webpackはサポートされている構文を自動的に判断します(例:target: 'node8.6'
)。
/* webpackChunkName: '...' */
の使用意図を理解してください。
webpackChunkName
を使用しなくても、開発モードで自動的に便利なファイル名を割り当てます。これは新しい仕様ではサポートされておらず、警告が表示されます。代わりに
import { version } from './package.json';
console.log(version);
使用してください。
import pkg from './package.json';
console.log(pkg.version);
const compiler = webpack(...);
を使用する場合は、使用後にコンパイラを閉じます:compiler.close(callback);
。webpack(..., callback)
形式には適用されません。ビルドエラー/警告を注意深く読んでください。対応するアドバイスがない場合は、issueを作成してください。解決できるよう努めます。
少なくともレベル3または4を解決するまで、次の手順を繰り返してください。
レベル1:**スキーマ検証が失敗する**。
設定オプションが変更されました。BREAKING CHANGE:
のメモ、または代わりに使用するオプションのヒントを含む検証エラーが表示されるはずです。
レベル2:**Webpackがエラーで終了する**。
エラーメッセージには、変更が必要なことが記載されています。
レベル3:**ビルドエラー**。
エラーメッセージには、BREAKING CHANGE:
のメモが含まれています。
レベル4:**ビルド警告**。
警告メッセージには、改善できる点が記載されています。
レベル5:**ランタイムエラー**。
これは困難です。問題を見つけるためにデバッグする必要があるでしょう。一般的なアドバイスはここでは難しいです。しかし、ランタイムエラーに関するいくつかの一般的なアドバイスを以下に示します。
process
が定義されていません。exports
またはimports
のpackage.jsonフィールドを使用してください。browser
フィールドを使用してください。typeof process
チェックを使用してコードブロックをラップします。これにより、バンドルサイズに悪影響を与えることに注意してください。process.env.VARIABLE
を使用して環境変数を使用したいですか?これらの変数を設定するには、DefinePlugin
またはEnvironmentPlugin
を使用する必要があります。VARIABLE
を使用することを検討し、typeof VARIABLE !== 'undefined'
も確認してください。process.env
はNode.js固有のものであり、フロントエンドコードでは避けるべきです。auto
を含むURLを指す404エラー。output.publicPath: "auto"
による新しいデフォルトの自動publicPath
に対応しているわけではありません。output.publicPath: ""
を使用してください。レベル6:**非推奨警告**。
多くの非推奨警告が表示される可能性があります。これは直接的な問題ではありません。プラグインはコアの変更に対応するのに時間がかかります。これらの非推奨事項をプラグインに報告してください。これらの非推奨事項は警告のみであり、小さな欠点(パフォーマンスの低下など)しかない場合でも、ビルドは機能します。
--no-deprecation
フラグを使用してnodeを実行することで、非推奨警告を非表示にすることができます(例:node --no-deprecation node_modules/webpack/bin/webpack.js
)。これは一時的な回避策としてのみ使用する必要があります。レベル7:**パフォーマンスの問題**。
通常、Webpack 5ではパフォーマンスが向上しますが、パフォーマンスが悪化するケースもあります。
そして、状況を改善するためにできることがあります。
--profile --progress
は、単純なパフォーマンスプロファイルを現在表示します。node --inspect-brk node_modules/webpack/bin/webpack.js
+ chrome://inspect
/ edge://inspect
(プロファイラタブを参照)。--no-turbo-inlining
フラグを使用してみてください。module.unsafeCache: true
devtool
オプションを確認して、さまざまなオプションの比較を参照してください。Webpack 5への移行に成功したことをツイートしてください。ツイートする
issueを作成して、移行中に発生した問題について教えてください。
プルリクエストを開いて、このガイドを使用する次のユーザーを支援してください。
タイプを追加すること、コードをリファクタリングすること、メソッド名を変更することなど、Webpack内部への変更は、興味のある人のためにここに記載されています。しかし、これらは一般的なユースケースの移行の一部として意図されていません。
Module.nameForCondition
、Module.updateCacheModule
、およびModule.chunkCondition
は、もはやオプションではありません。Webpack 5には、ローダーコンテキストで使用できる組み込みのthis.getOptions
メソッドが付属しています。これは、以前は優先されていたschema-utilsからgetOptions
メソッドを使用していたローダーにとって破壊的変更です。
this.getOptions
はWebpack 5から利用可能です。?{arg:true}
→ ?{"arg":true}
。JSON5の使用は、それぞれのローダーのドキュメントでJSONに賛成して非推奨と見なされ、文書化されるべきです。loader-utils
は、クエリ文字列を解析するための特定の動作を持っています(true
、false
、null
はstring
としてではなく、プリミティブ値として解析されます)。これは、ネイティブのquerystring
解析(Node.jsに付属)を使用する新しい組み込みthis.getOptions
メソッドではもう当てはまりません。this.getOptions
メソッドを使用してオプションを取得した後、ローダーのコードでこれらのケースのカスタム動作を追加することはまだ可能です。this.getOptions
メソッドではスキーマ引数はオプションですが、ローダーのオプションにスキーマ検証を追加することを強くお勧めします。スキーマのtitle
フィールドを使用して、検証エラーメッセージをカスタマイズできます。たとえば、"title": "My Loader ooooptions"
は、次のようにエラーを表示します。Invalid ooooptions object. My Loader has been initialised using an ooooptions object that does not match the API schema. - ooooptions.foo.bar.baz should be a string.