Webpack 4 は 2018 年 2 月にリリースされました。それ以来、破壊的な変更なしに多くの機能を出荷してきました。私たちは、人々が破壊的な変更を伴う大きな変更を嫌っていることを知っています。特に、webpack は通常年に 2 回しか触れず、残りの時間は「問題なく動作する」だけです。しかし、破壊的な変更なしに機能を出荷することには、コストもかかります。API やアーキテクチャの大幅な改善を行うことができません。
そのため、時々、困難が積み重なり、すべてをめちゃくちゃにしないために、破壊的な変更を余儀なくされることがあります。それが新しいメジャーバージョンのタイミングです。そのため、webpack 5 には、これらのアーキテクチャの改善と、それなしには実装できなかった機能が含まれています。
メジャーバージョンは、デフォルトの一部を見直し、その間に登場した提案や仕様に合わせるチャンスでもありました。
本日(2020-10-10)webpack 5.0.0 がリリースされましたが、これは完了した、バグがない、あるいは機能が完全に揃っているという意味ではありません。webpack 4 と同様に、問題の修正と機能の追加により開発を継続します。今後数日間で多くのバグ修正が行われるでしょう。機能は後から追加されます。
つまり、破壊的な変更が完了したということです。アーキテクチャをレベルアップし、将来の機能(および現在の機能)の基盤を構築するために、多くのリファクタリングが行われました。
それは状況によります。アップグレードが失敗し、2回目または3回目の試行が必要になる可能性が高いです。それを受け入れることができる場合は、今すぐアップグレードを試して、webpack、プラグイン、ローダーにフィードバックを提供してください。私たちはそれらの問題を解決することに熱心です。誰かが始めなければならず、あなたはそれから恩恵を受ける最初の一人になるでしょう。
Webpack は完全にスポンサーシップに基づいています。他のオープンソースプロジェクトのように、大企業に縛られて(そして資金提供を受けて)いるわけではありません。スポンサーシップからの収益の 99% は、貢献度に基づいて貢献者とメンテナーに分配されます。私たちは、webpack をより良くするためにお金を投資することを信じています。
しかし、パンデミックが発生しており、企業はもはやスポンサーシップにそれほど積極的ではありません。Webpack も(他の多くの企業や人々のように)これらの状況に苦しんでいます。
私たちは貢献者にふさわしい金額を支払うことができませんでしたが、現在では利用できる資金が半分しかないため、より深刻な削減を行う必要があります。状況が改善するまで、貢献者とメンテナーには各月の最初の 10 日間のみ支払います。残りの日は、ボランティアで働いたり、雇用主から給料をもらったり、他のことに取り組んだり、数日休暇を取ったりすることができます。これにより、最初の 10 日間に行った作業に対してより同等の金額を支払うことができます。
最大の「ありがとう」は、過去 3 年間 webpack に多大なスポンサーシップを提供してくれたtrivagoに送ります。残念ながら、Covid-19 の影響を大きく受けたため、今年はスポンサーシップを継続することができません。他の企業が立ち上がり、これらの(巨大な)足跡をたどってくれることを願っています。
すべてのスポンサーに感謝します。
このリリースは以下に焦点を当てています。
v4 で非推奨になった項目はすべて削除されました。
移行: webpack 4 のビルドで非推奨の警告が出力されないことを確認してください。
以下に、v4 で削除されたが、非推奨の警告が表示されなかったものがいくつかあります。
新しい非推奨には、参照しやすいように非推奨コードが含まれています。
require.include
は非推奨となり、使用するとデフォルトで警告が発せられます。
動作は、Rule.parser.requireInclude
を allowed、deprecated、または disabled に変更できます。
初期の頃、webpack の目的は、ほとんどの Node.js モジュールをブラウザで実行できるようにすることでしたが、モジュールの状況が変化し、多くのモジュールは現在、主にフロントエンド向けに記述されています。Webpack <= 4 には、Node.js のコアモジュールの多くに対するポリフィルが付属しており、モジュールがコアモジュール(例えば、crypto
モジュール)を使用すると、自動的に適用されます。
これにより、Node.js 向けに書かれたモジュールを使いやすくなりますが、これらの巨大なポリフィルがバンドルに追加されます。多くの場合、これらのポリフィルは不要です。
Webpack 5 では、これらのコアモジュールの自動ポリフィルを停止し、フロントエンド互換モジュールに焦点を当てます。私たちの目標は、Node.js コアモジュールが利用できない Web プラットフォームとの互換性を向上させることです。
移行:
package.json
の browser
フィールドを使用します。ブラウザ向けの代替実装/依存関係を提供します。長期キャッシュのために新しいアルゴリズムが追加されました。これらはプロダクションモードでデフォルトで有効になっています。
chunkIds: "deterministic"
moduleIds: "deterministic"
mangleExports: "deterministic"
このアルゴリズムは、モジュールとチャンクに短い(3桁または5桁)の数値 ID を、エクスポートに短い(2文字)名前を決定論的な方法で割り当てます。これはバンドルサイズと長期キャッシュの間のトレードオフです。
moduleIds/chunkIds/mangleExports: false
は、デフォルトの動作を無効にし、プラグインを介してカスタムアルゴリズムを提供できます。webpack 4 では、カスタムプラグインなしの moduleIds/chunkIds: false
でビルドが成功しましたが、webpack 5 ではカスタムプラグインを提供する必要があります。
移行: chunkIds
、moduleIds
、mangleExports
のデフォルト値を使用するのが最適です。また、古いデフォルト chunkIds: "size", moduleIds: "size", mangleExports: "size"
を選択することもできます。これにより、より小さなバンドルが生成されますが、キャッシュの無効化がより頻繁になります。
注: webpack 4 では、ハッシュ化されたモジュール ID によって gzip のパフォーマンスが低下しました。これはモジュールの順序の変更に関連しており、修正されました。
注: webpack 5 では、deterministic
ID はプロダクションモードでデフォルトで有効になっています。
webpack 5 では、[contenthash]
を使用する場合、ファイルのコンテンツの実際のハッシュを使用するようになりました。以前は、内部構造のハッシュを「のみ」使用していました。コメントのみが変更されたり、変数の名前が変更されたりした場合、長期キャッシュにプラスの影響を与える可能性があります。これらの変更は、最小化後には表示されません。
開発モードでデフォルトで有効になっている新しい名前付きチャンク ID アルゴリズムは、チャンク (およびファイル名) に人間が読める名前を付けます。モジュール ID は、context
に相対的なパスによって決定されます。チャンク ID は、チャンクのコンテンツによって決定されます。
そのため、デバッグのために import(/* webpackChunkName: "name" */ "module")
を使用する必要はなくなりました。ただし、本番環境のファイル名を制御したい場合は、引き続き意味があります。
本番環境で chunkIds: "named"
を使用することもできますが、モジュール名に関する機密情報を誤って公開しないように注意してください。
移行: 開発時にファイル名が変更されるのが気に入らない場合は、chunkIds: "natural"
を渡して、古い数値モードを使用できます。
Webpack 5 では、複数の webpack ビルドが連携できるようにする「モジュールフェデレーション」と呼ばれる新しい機能が追加されました。ランタイムの観点からは、複数のビルドからのモジュールは、巨大な接続されたモジュールグラフのように動作します。開発者の観点からは、指定されたリモートビルドからモジュールをインポートし、最小限の制限で使用できます。
詳細については、この別ガイドをご覧ください。
JSON モジュールは提案に準拠するようになり、デフォルト以外のエクスポートを使用すると警告を発するようになりました。厳密な ECMAScript モジュールからインポートする場合、JSON モジュールには名前付きエクスポートはなくなりました。
移行: デフォルトのエクスポートを使用してください。
デフォルトのエクスポートを使用する場合でも、使用されていないプロパティは optimization.usedExports
最適化によって削除され、プロパティは optimization.mangleExports
最適化によってマングルされます。
JSON のようなファイル (例えば、toml、yaml、json5 など) をインポートするために、Rule.parser.parse
でカスタム JSON パーサーを指定することが可能です。
import.meta.webpackHot
は module.hot
のエイリアスであり、厳密な ESM でも利用可能です。import.meta.webpack
は webpack のメジャーバージョンを数値で表したものです。import.meta.url
は現在のファイルの file:
URL です (__filename
に似ていますが、ファイル URL として)Webpack 5 では、アセットを表すモジュールをネイティブでサポートするようになりました。これらのモジュールは、出力フォルダーにファイルを生成するか、JavaScript バンドルに DataURI を挿入します。いずれにしても、操作する URL を提供します。
これらは複数の方法で使用できます。
import url from "./image.png"
と、そのようなインポートに一致する場合に module.rules
で type: "asset"
を設定する。(古い方法)new URL("./image.png", import.meta.url)
(新しい方法)「新しい方法」の構文は、バンドラーなしでもコードを実行できるようにするために選択されました。この構文は、ブラウザのネイティブ ECMAScript モジュールでも利用できます。
アセットに new URL
を new Worker
/new SharedWorker
/navigator.serviceWorker.register
と組み合わせると、webpack は自動的に Web ワーカー用の新しいエントリーポイントを作成します。
new Worker(new URL("./worker.js", import.meta.url))
この構文は、バンドラーなしでもコードを実行できるようにするために選択されました。この構文は、ブラウザのネイティブ ECMAScript モジュールでも利用できます。
Webpack 5 は、リクエストのプロトコルの処理をサポートしています。
data:
がサポートされています。Base64 または生のエンコーディングがサポートされています。MIME タイプは、module.rules
でローダーとモジュールタイプにマッピングできます。例: import x from "data:text/javascript,export default 42"
file:
がサポートされています。http(s):
がサポートされていますが、new webpack.experiments.schemesHttp(s)UriPlugin()
を介してオプトインする必要があります。リクエストのフラグメントがサポートされています。例: ./file.js#fragment
Webpack 5 は、いわゆる「非同期モジュール」をサポートしています。これらは同期的に評価されませんが、非同期で代わりに Promise ベースです。
import
を介してインポートすると、自動的に処理され、追加の構文は不要で、違いはほとんど気づきません。
require()
を介してインポートすると、エクスポートを解決する Promise が返されます。
webpack では、非同期モジュールを使用する複数の方法があります。
Webpack 5 では、より多くのアプリケーションをカバーするために、追加の外部タイプが追加されました。
promise
: Promise に評価される式。外部モジュールは非同期モジュールであり、解決された値がモジュールエクスポートとして使用されます。
import
: ネイティブの import()
を使用して、指定されたリクエストをロードします。外部モジュールは非同期モジュールです。
module
: まだ実装されていませんが、import x from "..."
を介してモジュールをロードする予定です。
script
: <script>
タグを介して URL をロードし、グローバル変数 (およびオプションでそのプロパティ) からエクスポートを取得します。外部モジュールは非同期モジュールです。
package.json の exports
フィールドと imports
フィールドがサポートされるようになりました。
Yarn PnP がネイティブでサポートされています。
詳細については、パッケージのエクスポートを参照してください。
Webpack 5 では、ターゲットのリストを渡すことができ、ターゲットのバージョンもサポートしています。
例: target: "node14"
target: ["web", "es2020"]
これにより、webpack が次のことを判断するために必要なすべての情報を提供できます。
Stats テストのフォーマットが、可読性と冗長性の点で改善されました。デフォルト値が冗長性を抑え、大規模なビルドにも適するように改善されました。
stats.chunkRelations
で切り替えることができます。files
と auxiliaryFiles
を区別するようになりました。stats.ids
で切り替えることができます。stats.modulesSort
で変更できます。stats.chunkModulesSort
で変更できます。stats.nestedModulesSort
で変更できます。stats.hash
で変更できます。stats.builtAt
で有効にできます。サマリーにタイムスタンプが表示されます。stats.children
で表示できます。CLI の --progress
で使用される ProgressPlugin
にいくつかの改善が加えられましたが、プラグインとして手動で使用することもできます。
以前は、処理されたモジュールのみをカウントしていました。現在は、entries
、dependencies
、および modules
をカウントできます。これらはすべてデフォルトで表示されるようになりました。
以前は、現在処理中のモジュールが表示されていました。これにより、多くの stderr 出力が発生し、一部のコンソールでパフォーマンスの問題が発生していました。これは現在デフォルトで無効になっています(activeModules
オプション)。これにより、コンソールでのスパムの量も減ります。モジュールの構築中の stderr への書き込みは、500ms にスロットルされます。
プロファイリングモードもアップグレードされ、ネストされた進捗メッセージのタイミングが表示されるようになります。これにより、どのプラグインがパフォーマンスの問題を引き起こしているかを把握しやすくなります。
新たに追加された percentBy
オプションは、ProgressPlugin
に進捗率の計算方法を指示します。
new webpack.ProgressPlugin({ percentBy: 'entries' });
進捗率をより正確にするために、ProgressPlugin
は最後に既知の合計モジュール数をキャッシュし、次のビルドでこの値を再利用します。最初のビルドではキャッシュがウォームアップされますが、後続のビルドではこの値が使用および更新されます。
webpack 4 では、複数の webpack ランタイムが同じ HTML ページで競合する可能性がありました。これは、チャンクローディングに同じグローバル変数を使用していたためです。それを修正するために、output.jsonpFunction
設定にカスタム名を指定する必要がありました。
Webpack 5 は、package.json
の name
からビルドの一意の名前を自動的に推測し、これを output.uniqueName
のデフォルトとして使用します。
この値は、競合する可能性のあるすべてのグローバルを一意にするために使用されます。
移行:package.json
に一意の名前を指定して、output.jsonpFunction
を削除してください。
Webpack 5 は、可能な場合に output.publicPath
を自動的に決定します。
Webpack 5 は、ソースコードから typescript の型定義を生成し、npm パッケージを介して公開します。
移行:@types/webpack
を削除します。名前が異なる場合は、参照を更新してください。
Webpack は、エクスポートのネストされたプロパティへのアクセスを追跡できるようになりました。これにより、名前空間オブジェクトを再エクスポートするときに、ツリーシェイキング(未使用のエクスポートの削除とエクスポートの短縮)を改善できます。
// inner.js
export const a = 1;
export const b = 2;
// module.js
export * as inner from './inner';
// or import * as inner from './inner'; export { inner };
// user.js
import * as module from './module';
console.log(module.inner.a);
この例では、エクスポート b
は本番モードで削除できます。
Webpack 4 は、モジュールのエクスポートとインポート間の依存関係を分析しませんでした。Webpack 5 には、本番モードでデフォルトで有効になっている新しいオプション optimization.innerGraph
があり、モジュール内のシンボルに対する分析を実行して、エクスポートからインポートへの依存関係を把握します。
このようなモジュールでは、
import { something } from './something';
function usingSomething() {
return something;
}
export function test() {
return usingSomething();
}
内部グラフアルゴリズムは、something
が test
エクスポートが使用された場合にのみ使用されることを把握します。これにより、より多くのエクスポートを未使用としてフラグを立て、バンドルからより多くのコードを省略できます。
"sideEffects": false
が設定されている場合、これにより、さらに多くのモジュールを省略できます。この例では、test
エクスポートが未使用の場合、./something
が省略されます。
未使用のエクスポートに関する情報を取得するには、optimization.usedExports
が必要です。副作用のないモジュールを削除するには、optimization.sideEffects
が必要です。
次のシンボルを分析できます
export default
(または変数宣言)/*#__PURE__*/
式フィードバック:この分析に不足しているものが見つかった場合は、問題を報告してください。追加を検討します。
eval()
を使用すると、eval されたコードがスコープ内の任意のシンボルを参照する可能性があるため、モジュールのこの最適化が中止されます。
この最適化は、ディープスコープ解析とも呼ばれます。
Webpack は、CommonJs エクスポートと require()
呼び出しの未使用エクスポート分析をオプトアウトしていました。
Webpack 5 は、いくつかの CommonJs 構成のサポートを追加し、未使用の CommonJs エクスポートを削除したり、require()
呼び出しから参照されるエクスポート名を追跡したりできます。
次の構成がサポートされています
exports|this|module.exports.xxx = ...
exports|this|module.exports = require("...")
(再エクスポート)exports|this|module.exports.xxx = require("...").xxx
(再エクスポート)Object.defineProperty(exports|this|module.exports, "xxx", ...)
require("abc").xxx
require("abc").xxx()
require()
Object.defineProperty(exports|this|module.exports, "__esModule", { value: true|!0 })
exports|this|module.exports.__esModule = true|!0
分析できないコードを検出すると、webpack は中止し、これらのモジュールのエクスポート情報を(パフォーマンス上の理由から)一切追跡しません。
package.json の "sideEffects"
フラグを使用すると、モジュールを副作用なしとして手動でフラグを立てることができ、未使用の場合にそれらを削除できます。
Webpack 5 は、ソースコードの静的分析に従って、モジュールを副作用なしとして自動的にフラグを立てることもできます。
Webpack 5 は、ランタイムごとにモジュールを分析および最適化できるようになりました(デフォルトで実行されます)。ランタイムは、多くの場合、エントリポイントと同じです。これにより、本当に必要なエントリポイントでのみエクスポートできます。エントリポイントは、(エントリポイントごとにランタイムを使用している限り)互いに影響しません。
モジュール連結もランタイムごとに機能し、各ランタイムで異なる連結を可能にします。
モジュール連結は第一級の市民になり、すべてのモジュールと依存関係がそれを実装できるようになりました。当初、webpack 5 は ExternalModules と json モジュールのサポートを追加しましたが、今後さらに追加される可能性が高いです。
export *
が改善され、より多くの情報を追跡し、default
エクスポートを未使用としてフラグを立てなくなりました。
export *
は、webpack が競合するエクスポートがあると確信している場合に警告を表示するようになります。
import()
を使用すると、/* webpackExports: ["abc", "default"] */
マジックコメントを介してモジュールを手動でツリーシェイクできます。
開発モードでのビルドパフォーマンスと、両方のモード間の類似性を改善することにより、本番環境のみの問題を回避することとの間で、適切なトレードオフを見つけようとしています。
Webpack 5 は、両方のモードでデフォルトで sideEffects
最適化を有効にします。webpack 4 では、この最適化により、package.json の "sideEffects"
フラグが正しくないために、本番環境のみのエラーが発生していました。開発環境でこの最適化を有効にすると、これらの問題をより迅速かつ簡単に発見できます。
多くの場合、開発と本番環境は、ファイルシステムのケースセンシティブが異なる異なる OS で発生するため、webpack 5 は、ケースに関して奇妙な点がある場合に、さらにいくつかの警告/エラーを追加します。
Webpack は ASI が発生したことを検出し、セミコロンが挿入されない場合、より短いコードを生成します。Object(...)
-> (0, ...)
Webpack は、複数のエクスポートゲッターを単一のランタイム関数呼び出しにマージします。r.d(x, "a", () => a); r.d(x, "b", () => b);
-> r.d(x, {a: () => a, b: () => b});
output.environment
に追加オプションが追加されました。これにより、webpack によって生成されたランタイムコードに使用できる ECMAScript 機能を指定できます。
通常、このオプションを直接指定するのではなく、代わりに target
オプションを使用します。
Webpack 4 は、ES5 コードのみをエミットしていました。Webpack 5 は、ES5 と ES6/ES2015 コードの両方を生成できるようになりました。
最新のブラウザーのみをサポートすると、アロー関数を使用するより短いコードと、export default
に TDZ を使用するより仕様に準拠したコード(const
宣言を使用)が生成されます。
target
オプションの改善webpack 4 では、target
は "web"
と "node"
(およびその他いくつか) の間のおおまかな選択でした。 webpack 5 では、より多くのオプションが提供されます。
target
オプションは、以前よりも生成されるコードに多くの影響を与えるようになりました。
externals
global
、__filename
、__dirname
)browser
フィールド、exports
および imports
条件)これらのいくつかのことについては、"web"
と "node"
の選択はあまりにも大雑把であり、より多くの情報が必要です。したがって、"node10.13"
のように最小バージョンを指定し、ターゲット環境に関するより多くのプロパティを推論できるようにします。
配列で複数のターゲットを組み合わせることも許可されるようになり、webpack はすべてのターゲットの最小プロパティを決定します。配列の使用は、"web"
や "node"
(バージョン番号なし) のように完全な情報を提供しないターゲットを使用する場合にも役立ちます。例えば、["web", "es2020"]
はこれら 2 つの部分的なターゲットを結合します。
環境のプロパティを決定するために browserslist データを使用する "browserslist"
というターゲットがあります。このターゲットは、プロジェクトで browserslist の設定が利用可能な場合にもデフォルトで使用されます。そのような設定が利用できない場合は、デフォルトで "web"
ターゲットが使用されます。
一部の組み合わせと機能はまだ実装されておらず、エラーが発生します。それらは将来の機能のための準備です。例:
["web", "node"]
は、まだ実装されていないユニバーサルチャンクローディングメソッドにつながります。["web", "node"]
+ output.module: true
は、まだ実装されていないモジュールチャンクローディングメソッドにつながります。"web"
は、http(s):
インポートがまだ実装されていない module
externals として扱われることにつながります (回避策: externalsPresets: { web: false, webAsync: true }
、これは代わりに import()
を使用します)。モジュールは、単一の数値よりも優れた方法でサイズを表現するようになりました。現在、異なるタイプのサイズがあります。
SplitChunksPlugin は、これらの異なるサイズをどのように処理するかを認識し、minSize
と maxSize
にそれらを使用します。デフォルトでは、javascript
サイズのみが処理されますが、複数の値を渡して管理できるようになりました。
module.exports = {
optimization: {
splitChunks: {
minSize: {
javascript: 30000,
webassembly: 50000,
},
},
},
};
サイズには単一の数値を使用することもできます。この場合、webpack はデフォルトのサイズタイプを自動的に使用します。
mini-css-extract-plugin
は、サイズタイプとして css/mini-extra
を使用し、このサイズタイプをデフォルトのタイプに自動的に追加します。
ファイルシステムキャッシュが追加されました。これはオプトインであり、次の構成で有効にできます。
module.exports = {
cache: {
// 1. Set cache type to filesystem
type: 'filesystem',
buildDependencies: {
// 2. Add your config as buildDependency to get cache invalidation on config change
config: [__filename],
// 3. If you have other things the build depends on you can add them here
// Note that webpack, loaders and all modules referenced from your config are automatically added
},
},
};
重要な注意事項
デフォルトでは、webpack は、webpack が内部にある node_modules
ディレクトリがパッケージマネージャーによって**のみ**変更されることを想定しています。ハッシュとタイムスタンプは node_modules
ではスキップされます。代わりに、パフォーマンス上の理由から、パッケージ名とバージョンのみが使用されます。シンボリックリンク (つまり、npm/yarn link
) は、resolve.symlinks: false
が指定されていない限り問題ありません (とにかく避けてください)。snapshot.managedPaths: []
を使用してこの最適化をオプトアウトしない限り、node_modules
のファイルを直接編集しないでください。 Yarn PnP を使用する場合、webpack は yarn キャッシュが不変であると想定します (通常はそうです)。 snapshot.immutablePaths: []
でこの最適化をオプトアウトできます。
キャッシュは、デフォルトで node_modules/.cache/webpack
(node_modules を使用する場合) resp. .yarn/.cache/webpack
(Yarn PnP を使用する場合) に保存されます。すべてのプラグインがキャッシュを正しく処理する場合、手動で削除する必要はおそらくありません。
多くの内部プラグインも永続的なキャッシュを使用します。例: SourceMapDevToolPlugin
(SourceMap の生成をキャッシュするため) や ProgressPlugin
(モジュール数をキャッシュするため)
永続的なキャッシュは、キャッシュへの読み取り/書き込みアクセスを最適化するために、使用状況に応じて複数のキャッシュファイルを自動的に作成します。
デフォルトでは、開発モードではタイムスタンプが、本番モードではファイルハッシュがスナップショットに使用されます。ファイルハッシュを使用すると、CI でも永続的なキャッシュを使用できます。
コンパイラは、使用後にクローズする必要があります。コンパイラは、アイドル状態になり、この状態を離れ、これらの状態のフックを持っています。プラグインは、これらのフックを使用して重要でない作業を行うことができます。(つまり、永続的なキャッシュは、キャッシュをゆっくりとディスクに保存します)。コンパイラのクローズ時 - 残りのすべての作業は、できるだけ早く完了する必要があります。コールバックは、クローズが完了したことを通知します。
プラグインとそのそれぞれの作成者は、一部のユーザーがコンパイラのクローズを忘れる可能性があることを想定する必要があります。したがって、すべての作業は、アイドル状態でも最終的に終了する必要があります。作業が完了している間、プロセスが終了しないようにする必要があります。
webpack()
ファサードは、コールバックが渡されると自動的に close
を呼び出します。
移行: Node.js API を使用する場合は、完了したら必ず Compiler.close
を呼び出すようにしてください。
Webpack は、最初のビルドですべての出力ファイルを常にエミットしていましたが、インクリメンタル (watch) ビルド中に変更されていないファイルの書き込みをスキップしていました。webpack の実行中に、他のものが出力ファイルを変更しないと想定されています。
永続的なキャッシュが追加されたことで、webpack プロセスを再起動した場合でも watch のようなエクスペリエンスを提供する必要がありますが、webpack が実行されていない場合でも、他のものが出力ディレクトリを変更しないと考えるのは、あまりにも強い仮定でしょう。
そのため、webpack は出力ディレクトリ内の既存のファイルをチェックし、その内容をメモリ内の出力ファイルと比較します。ファイルが変更された場合にのみ、ファイルを書き込みます。これは最初のビルドでのみ実行されます。実行中の webpack プロセスで新しいアセットが生成された場合、インクリメンタルビルドでは常にファイルが書き込まれます。
webpack とプラグインは、コンテンツが変更された場合にのみ新しいアセットを生成すると想定しています。入力が同じ場合は新しいアセットが生成されないように、キャッシュを使用する必要があります。このアドバイスに従わないと、パフォーマンスが低下します。
[immutable]
(コンテンツハッシュを含む) としてフラグが立てられたファイルは、同じ名前のファイルが既に存在する場合は書き込まれません。コンテンツハッシュは、ファイルの内容が変更されると変更されると想定しています。これは一般的には当てはまりますが、webpack またはプラグインの開発中は必ずしも当てはまるとは限りません。
単一のファイルのみを起動できるターゲット (node、WebWorker、electron main など) は、実行時にブートストラップに必要な依存ピースを自動的にロードすることをサポートするようになりました。
これにより、これらのターゲットで opimization.splitChunks
を chunks: "all"
で、optimization.runtimeChunk
も使用できるようになります。
チャンクのロードが非同期であるターゲットでは、初期評価も非同期になることに注意してください。これは、エクスポートされた値が Promise であるため、output.library
を使用する場合に問題となる可能性があります。
enhanced-resolve
が v5 に更新されました。これには次の改善点があります。
false
へのエイリアスが使用可能になりましたexports
や imports
フィールドなどの機能のサポートJS コードを含まないチャンクは、JS ファイルを生成しなくなります。これにより、CSS のみを含むチャンクを持つことができます。
すべての機能が最初から安定しているわけではありません。webpack 4 では、実験的な機能を追加し、それらが実験的であることを変更ログに記載しましたが、これらの機能が実験的であることを設定から常に明確にすることができませんでした。
webpack 5 では、実験的な機能を有効にできる新しい experiments
設定オプションがあります。これにより、有効になっている/使用されているものが明確になります。
webpack はセマンティックバージョニングに従いますが、実験的な機能については例外を設けます。実験的な機能には、マイナーな webpack バージョンで破壊的な変更が含まれる可能性があります。このようなことが発生した場合は、変更ログに明確なメモを追加します。これにより、安定した機能についてはメジャーバージョンに長く留まることができる一方で、実験的な機能についてはより迅速に反復することができます。
次の実験が webpack 5 に同梱されます
experiments.syncWebAssembly
)experiments.asyncWebAssembly
)experiments.topLevelAwait
)await
を使用すると、モジュールが非同期モジュールになりますexperiments.outputModule
)<script type="module">
を介して遅延ロードされ、モジュールモードで最小化されますこれは、WebAssembly のサポートがデフォルトで無効になっていることも意味することに注意してください。
サポートされている Node.js の最小バージョンが 6 から 10.13.0(LTS) に引き上げられました。
移行: 利用可能な最新の Node.js バージョンにアップグレードしてください。
entry: {}
で空のオブジェクトが許可されるようになりました (プラグインでエントリを追加できるようにするため)target
が配列、バージョン、browserslist をサポートcache: Object
が削除されました: メモリキャッシュオブジェクトへの設定はできなくなりましたcache.type
が追加されました: "memory"
と "filesystem"
の間で選択できるようになりましたcache.type = "filesystem"
用の新しい設定オプションが追加されましたcache.cacheDirectory
cache.name
cache.version
cache.store
cache.hashAlgorithm
cache.idleTimeout
cache.idleTimeoutForInitialStore
cache.buildDependencies
snapshot.resolveBuildDependencies
が追加されましたsnapshot.resolve
が追加されましたsnapshot.module
が追加されましたsnapshot.managedPaths
が追加されましたsnapshot.immutablePaths
が追加されましたresolve.cache
が追加されました: 安全な resolve キャッシュを無効/有効にできますresolve.concord
が削除されましたresolve.moduleExtensions
が削除されましたresolve.alias
の値は、配列または false
を指定できるようになりましたresolve.restrictions
が追加されました: 潜在的な resolve 結果を制限できますresolve.fallback
が追加されました: resolve に失敗したリクエストをエイリアスできますresolve.preferRelative
が追加されました: モジュールリクエストが相対リクエストでもある場合に、モジュールを resolve できますnode.Buffer
が削除されましたnode.console
が削除されましたnode.process
が削除されましたnode.*
(Node.js ネイティブモジュール) が削除されましたresolve.alias
および ProvidePlugin
を使用してください。エラーが発生した場合はヒントが表示されます。(v4 で使用されていたポリフィルとモックについては、node-libs-browser を参照してください)output.filename
が関数を指定できるようになりましたoutput.assetModuleFilename
が追加されましたoutput.jsonpScriptType
が output.scriptType
に名前変更されましたdevtool
がより厳格になりましたfalse | eval | [inline-|hidden-|eval-][nosources-][cheap-[module-]]source-map
optimization.chunkIds: "deterministic"
が追加されましたoptimization.moduleIds: "deterministic"
が追加されましたoptimization.moduleIds: "hashed"
が非推奨になりましたoptimization.moduleIds: "total-size"
が削除されましたoptimization.hashedModuleIds
が削除されましたoptimization.namedChunks
が削除されました (NamedChunksPlugin
も同様)optimization.namedModules
が削除されました (NamedModulesPlugin
も同様)optimization.occurrenceOrder
が削除されましたchunkIds
および moduleIds
を使用してくださいoptimization.splitChunks
の test
がチャンク名に一致しなくなりました(module, { chunkGraph }) => chunkGraph.getModuleChunks(module).some(chunk => chunk.name === "name")
を使用してくださいoptimization.splitChunks
に minRemainingSize
が追加されましたoptimization.splitChunks
の filename
が関数を指定できるようになりましたoptimization.splitChunks
のサイズが、ソースタイプごとのサイズを持つオブジェクトを指定できるようになりましたminSize
minRemainingSize
maxSize
maxAsyncSize
maxInitialSize
optimization.splitChunks
に maxSize
に加えて maxAsyncSize
および maxInitialSize
が追加されました: 初期チャンクと非同期チャンクで異なる最大サイズを指定できますoptimization.splitChunks
の name: true
が削除されました: 自動名はサポートされなくなりましたchunkIds: "named"
を使用すると、デバッグに役立つ名前がファイルに付けられますoptimization.splitChunks.cacheGroups[].idHint
が追加されました: 名前付きチャンク ID の選択方法に関するヒントを与えますoptimization.splitChunks
の automaticNamePrefix
が削除されましたidHint
を使用してくださいoptimization.splitChunks
の filename
が初期チャンクに限定されなくなりましたoptimization.splitChunks
に、モジュールを比較する際に使用されたエクスポートを含めるための usedExports
が追加されましたoptimization.splitChunks.defaultSizeTypes
が追加されました: サイズに数値を使用する場合のサイズタイプを指定しますoptimization.mangleExports
が追加されましたoptimization.minimizer
で "..."
を使用してデフォルトを参照できるようになりましたoptimization.usedExports
に、ランタイムごとの分析を無効にしてグローバルに実行できるようにする (パフォーマンスが向上) ための "global"
値が追加されましたoptimization.noEmitOnErrors
が optimization.emitOnErrors
に名前変更され、ロジックが反転しましたoptimization.realContentHash
が追加されましたoutput.devtoolLineToLine
が削除されましたoutput.chunkFilename: Function
が許可されるようになりましたoutput.hotUpdateChunkFilename: Function
が禁止されるようになりました: いずれにしても機能しませんでした。output.hotUpdateMainFilename: Function
が禁止されるようになりました: いずれにしても機能しませんでした。output.importFunctionName: string
は、サポートされていない環境でのポリフィルを許可するために、import()
の代替として使用される名前を指定しますoutput.charset
が追加されました: false に設定すると、スクリプトタグの charset
プロパティが省略されますoutput.hotUpdateFunction
が output.hotUpdateGlobal
に名前変更されましたoutput.jsonpFunction
が output.chunkLoadingGlobal
に名前変更されましたoutput.chunkCallbackFunction
が output.chunkLoadingGlobal
に名前変更されましたoutput.chunkLoading
が追加されましたoutput.enabledChunkLoadingTypes
が追加されましたoutput.chunkFormat
が追加されましたmodule.rules
の resolve
および parser
が異なる方法でマージされるようになりました (オブジェクトはディープマージされ、配列には前の値を参照する "..."
を含めることができます)module.rules
に parser.worker
が追加されました: サポートされるワーカーを設定できますmodule.rules
の query
および loaders
が削除されましたmodule.rules
の options
で文字列を渡すことは非推奨になりましたmodule.rules
に mimetype
が追加されました: DataURI の mimetype に一致させることができますmodule.rules
に descriptionData
が追加されました: package.json からのデータに一致させることができますmodule.defaultRules
で "..."
を使用してデフォルトを参照できるようになりましたstats.chunkRootModules
が追加されました: チャンクのルートモジュールを表示しますstats.orphanModules
が追加されました: 出力されないモジュールを表示しますstats.runtime
が追加されました: ランタイムモジュールを表示しますstats.chunkRelations
が追加されました: 親/子/兄弟チャンクを表示しますstats.errorStack
が追加されました: エラーの webpack 内部スタックトレースを表示しますstats.preset
が追加されました: プリセットを選択しますstats.relatedAssets
が追加されました: 他のアセットに関連するアセット (例: SourceMaps) を表示しますstats.warningsFilter
が非推奨になり、ignoreWarnings
が推奨されるようになりましたBannerPlugin.banner
の署名が変更されましたdata.basename
が削除されましたdata.query
が削除されましたfilename
から抽出してくださいSourceMapDevToolPlugin
の lineToLine
が削除されました[hash]
が非推奨になりました[fullhash]
を使用するか、別のハッシュオプションを使用することをお勧めします[modulehash]
が非推奨になりました[hash]
を使用してください[moduleid]
が非推奨になりました[id]
を使用してください[filebase]
が削除されました[base]
を使用してください[name]
[base]
[path]
[ext]
externals
は、異なる署名 ({ context, request }, callback)
を持つようになりましたexternalsPresets
が追加されましたexperiments
が追加されました (上記の実験セクションを参照)watchOptions.followSymlinks
が追加されましたwatchOptions.ignored
が RegExp を指定できるようになりましたwebpack.util.serialization
が公開されるようになりました。target
はデフォルトで "browserslist"
になりましたmodule.unsafeCache
は、デフォルトで node_modules
に対してのみ有効になりましたoptimization.moduleIds
は、size
ではなく、プロダクションモードではデフォルトで deterministic
になりましたoptimization.chunkIds
は、total-size
ではなく、プロダクションモードではデフォルトで deterministic
になりましたoptimization.nodeEnv
は、none
モードではデフォルトで false
になりましたoptimization.splitChunks.minSize
は、プロダクションではデフォルトで 20k
になりましたoptimization.splitChunks.enforceSizeThreshold
は、プロダクションではデフォルトで 50k
になりましたoptimization.splitChunks
の minRemainingSize
は、デフォルトで minSize
になりましたoptimization.splitChunks
の maxAsyncRequests
および maxInitialRequests
のデフォルト値が 30 に増加しましたoptimization.splitChunks.cacheGroups.vendors
が optimization.splitChunks.cacheGroups.defaultVendors
に名前変更されましたoptimization.splitChunks.cacheGroups.defaultVendors.reuseExistingChunk
は、デフォルトで true
になりましたoptimization.minimizer
のターゲットのデフォルトでは、terser オプションで compress.passes: 2
が使用されるようになりましたcache
が使用されている場合、resolve(Loader).cache
はデフォルトで true
になりましたresolve(Loader).cacheWithContext
はデフォルトで false
になりましたresolveLoader.extensions
で .json
が削除されましたtarget
では、node.global
node.__filename
および node.__dirname
はデフォルトで false
になりましたstats.errorStack
はデフォルトで false
になりましたthis.getOptions
この新しい API は、ローダーでのオプションの使用を簡略化します。検証用の JSON スキーマを渡すことができます。詳細については、PR を参照してください
this.exec
これはローダーコンテキストから削除されました
移行: これはローダー自体で実装できます
this.getResolve
ローダー API の getResolve(options)
は、module.rules
の resolve
を参照して、異なる方法でオプションをマージします。
webpack 5 は異なる発行依存関係を区別するため、オプションとして dependencyType
(例: "esm"
、"commonjs"
など) を渡すことが理にかなっている場合があります。
次の変更は、プラグインの作成者のみに関連します
webpack 5 のプラグインは、設定のデフォルトが適用される前に適用されるようになりました。これにより、プラグインは独自のデフォルトを適用したり、設定プリセットとして機能したりできます。
ただし、これはプラグインが適用されるときに設定値が設定されていることに依存できないため、破壊的な変更でもあります。
移行: プラグインフック内でのみ設定にアクセスしてください。または、設定へのアクセスを完全に避け、コンストラクターを介してオプションを取得することをお勧めします。
ランタイムコードの大部分は、いわゆる「ランタイムモジュール」に移動されました。これらの特別なモジュールは、ランタイムコードの追加を担当します。これらは任意のチャンクに追加できますが、現在は常にランタイムチャンクに追加されます。「ランタイム要件」は、どのランタイムモジュール (またはコアランタイム部分) がバンドルに追加されるかを制御します。これにより、使用されているランタイムコードのみがバンドルに追加されることが保証されます。将来的には、ランタイムコードが必要なときにロードするために、オンデマンドロードされたチャンクにランタイムモジュールを追加することもできます。
ほとんどの場合、コアランタイムを使用すると、__webpack_require__
で呼び出す代わりに、エントリモジュールをインライン化できます。バンドル内に他のモジュールがない場合、__webpack_require__
はまったく必要ありません。これは、複数のモジュールが 1 つのモジュールに連結されるモジュール連結とうまく組み合わされます。
最良の場合、ランタイムコードはまったく必要ありません。
移行: プラグインで webpack ランタイムにランタイムコードを注入している場合は、代わりに RuntimeModules の使用を検討してください。
webpack で複雑なオブジェクトをシリアライズできるように、シリアライゼーションのメカニズムが追加されました。これはオプトインのセマンティクスを持っているため、シリアライズする必要があるクラスは明示的にフラグを立てる必要があります(そしてそのシリアライゼーションを実装する必要があります)。これは、ほとんどのモジュール、すべての依存関係、およびいくつかのエラーに対して行われています。
移行: カスタム モジュールまたは依存関係を使用する場合は、永続的なキャッシュのメリットを得るためにシリアライズ可能にすることをお勧めします。
プラグインインターフェイスを備えた Cache
クラスが追加されました。このクラスは、キャッシュへの書き込みとキャッシュからの読み込みに使用できます。構成に応じて、さまざまなプラグインがキャッシュに機能を追加できます。MemoryCachePlugin
はインメモリキャッシュを追加します。FileCachePlugin
は永続的な(ファイルシステム)キャッシュを追加します。
FileCachePlugin
は、シリアライゼーションメカニズムを使用して、キャッシュされたアイテムをディスクに永続化し、復元します。
hooks
を持つクラスは、その hooks
オブジェクトがフリーズされるため、この方法でカスタムフックを追加することはできなくなりました。
移行: カスタムフックを追加する推奨される方法は、WeakMap と静的な getXXXHooks(XXX)
メソッド(例: getCompilationHook(compilation)
)を使用することです。内部クラスは、カスタムフックに使用されるのと同じメカニズムを使用します。
webpack 3 プラグインの互換性レイヤーが削除されました。これは webpack 4 ではすでに非推奨になっていました。
あまり使用されていないいくつかの tapable API が削除または非推奨になりました。
移行: 新しい tapable API を使用してください。
シーリングプロセスのいくつかのステップには、異なるステージに対応する複数のフックがありました。例: optimizeDependenciesBasic
、optimizeDependencies
、optimizeDependenciesAdvanced
。これらは、stage
オプションで使用できる単一のフックに置き換えられました。可能なステージの値については、OptimizationStages
を参照してください。
移行: 代わりに残りのフックにフックします。stage
オプションを追加できます。
バンドルテンプレートがリファクタリングされました。MainTemplate/ChunkTemplate/ModuleTemplate は非推奨となり、JavaScriptModulesPlugin が JS テンプレートを処理するようになりました。
このリファクタリングの前は、JS 出力は Main/ChunkTemplate によって処理され、別の出力(例: WASM、CSS)はプラグインによって処理されていました。これは、JS がファーストクラスであり、別の出力がセカンドクラスであるかのように見えます。リファクタリングにより、これが変更され、すべての出力はそれぞれのプラグインによって処理されるようになりました。
テンプレートの一部にフックすることはまだ可能です。フックは、Main/ChunkTemplate ではなく、JavaScriptModulesPlugin にあります。(はい、プラグインにもフックを含めることができます。私はそれらをアタッチされたフックと呼んでいます。)
互換性レイヤーがあるため、Main/Chunk/ModuleTemplate はまだ存在しますが、新しいフックロケーションへのタップコールを委任するだけです。
移行: 非推奨メッセージの指示に従ってください。ほとんどの場合、異なる場所にあるフックを指しています。
オブジェクトがエントリポイントとして渡される場合、値は文字列、文字列の配列、または記述子である可能性があります。
module.exports = {
entry: {
catalog: {
import: './catalog.js',
},
},
};
記述子構文を使用して、追加のオプションをエントリポイントに渡すことができます。
デフォルトでは、エントリチャンクの出力ファイル名は output.filename
から抽出されますが、特定のエントリに対してカスタムの出力ファイル名を指定できます。
module.exports = {
entry: {
about: { import: './about.js', filename: 'pages/[name][ext]' },
},
};
デフォルトでは、すべてのエントリチャンクは使用するすべてのモジュールを格納します。dependOn
オプションを使用すると、あるエントリチャンクから別のエントリチャンクにモジュールを共有できます。
module.exports = {
entry: {
app: { import: './app.js', dependOn: 'react-vendors' },
'react-vendors': ['react', 'react-dom', 'prop-types'],
},
};
アプリチャンクには、react-vendors
が持つモジュールは含まれません。
エントリ記述子を使用すると、エントリポイントごとに異なる library
オプションを渡すことができます。
module.exports = {
entry: {
commonjs: {
import: './lib.js',
library: {
type: 'commonjs-module',
},
},
amd: {
import: './lib.js',
library: {
type: 'amd',
},
},
},
};
エントリ記述子を使用すると、エントリごとに runtime
を指定できます。指定すると、この名前のチャンクが作成され、エントリのランタイムコードのみが含まれます。複数のエントリが同じ runtime
を指定すると、そのチャンクにはこれらのすべてのエントリの共通ランタイムが含まれます。これは、同じ HTML ページで一緒に使用できることを意味します。
module.exports = {
entry: {
app: {
import: './app.js',
runtime: 'app-runtime',
},
},
};
エントリ記述子を使用すると、エントリごとに chunkLoading
を指定できます。このエントリのランタイムは、これを使用してチャンクをロードします。
module.exports = {
entry: {
app: {
import: './app.js',
},
worker: {
import: './worker.js',
chunkLoading: 'importScripts',
},
},
};
webpack は、モジュールとチャンクをコンパイルフェーズで特定の順序で並べ、ID をインクリメンタルな順序で割り当てていました。これはもはや当てはまりません。順序は ID 生成には使用されなくなり、代わりに ID 生成の完全な制御はプラグインにあります。
モジュールとチャンクの順序を最適化するフックが削除されました。
移行: コンパイルフェーズでのモジュールとチャンクの順序に依存することはできなくなりました。
非推奨の警告を印刷する互換性レイヤーがあります。
移行: 配列メソッドの代わりにセットメソッドを使用してください。
この新しいクラスは、キャッシュされた方法でファイルシステムに関する情報にアクセスするために使用できます。現在、ファイルとディレクトリの両方のタイムスタンプを要求できます。タイムスタンプに関する情報は、可能であればウォッチャーから転送され、それ以外の場合はファイルシステムアクセスによって決定されます。
将来的には、ファイルコンテンツハッシュの要求が追加され、モジュールはファイルハッシュの代わりにファイルコンテンツで有効性をチェックできるようになります。
移行: file/contextTimestamps
を使用する代わりに、compilation.fileSystemInfo
API を使用してください。
ディレクトリのタイムスタンプが利用可能になり、ContextModules のシリアライゼーションが可能になりました。
変更されたファイルを参照しやすくするために、Compiler.modifiedFiles
が(Compiler.removedFiles
の隣に)追加されました。
compiler.inputFileSystem
および compiler.outputFileSystem
の他に、入力または出力と見なされないすべての fs アクション(レコード、キャッシュ、またはプロファイリング出力の書き込みなど)用の新しい compiler.intermediateFileSystem
があります。
ファイルシステムには、fs
インターフェイスがあり、join
や mkdirp
などの追加のメソッドを必要としなくなりました。ただし、join
や dirname
などのメソッドがある場合は、それらが使用されます。
HMR ランタイムは、ランタイムモジュールにリファクタリングされました。HotUpdateChunkTemplate
は ChunkTemplate
にマージされました。ChunkTemplates とプラグインは、HotUpdateChunk
も処理する必要があります。
HMR ランタイムの JavaScript 部分は、コア HMR ランタイムから分離されました。他のモジュールタイプも、独自の方法で HMR を処理できるようになりました。将来的には、これにより、例として mini-css-extract-plugin または WASM モジュールの HMR が可能になります。
移行: これは新しく導入された機能であるため、移行するものはありません。
import.meta.webpackHot
は、module.hot
と同じ API を公開します。これは、module
にアクセスできない厳密な ESM モジュール(.mjs、package.json の type: "module")からも使用できます。
webpack は、関数を呼び出す関数と、並列処理を制限する semaphore
によってモジュール処理を処理していました。Compilation.semaphore
は削除され、非同期キューがワークのキューイングと処理を処理するようになりました。各ステップには個別のキューがあります。
Compilation.factorizeQueue
: 依存関係のグループに対してモジュールファクトリを呼び出します。Compilation.addModuleQueue
: モジュールをコンパイルキューに追加します(キャッシュからモジュールを復元する場合があります)。Compilation.buildQueue
: 必要に応じてモジュールをビルドします(モジュールをキャッシュに保存する場合があります)。Compilation.rebuildQueue
: 手動でトリガーされた場合にモジュールを再度ビルドします。Compilation.processDependenciesQueue
: モジュールの依存関係を処理します。これらのキューには、ジョブ処理を監視およびインターセプトするいくつかのフックがあります。
将来的には、複数のコンパイラーが連携して動作し、これらのキューをインターセプトすることでジョブオーケストレーションを実行できるようになります。
移行: これは新しく導入された機能であるため、移行するものはありません。
webpack の内部には、いくつかのロギングが含まれるようになりました。stats.logging
および infrastructureLogging
オプションを使用して、これらのメッセージを有効にできます。
webpack は、解決されたモジュールを依存関係に格納し、含まれるモジュールをチャンクに格納していました。これはもはや当てはまりません。モジュールグラフでモジュールがどのように接続されているかに関するすべての情報は、ModuleGraph クラスに格納されるようになりました。モジュールがチャンクとどのように接続されているかに関するすべての情報は、ChunkGraph クラスに格納されるようになりました。例: チャンクグラフに依存する情報も、関連するクラスに格納されます。
つまり、モジュールに関する次の情報が移動されました
webpack は、キャッシュから復元されたときに、モジュールをグラフから切断していました。これはもはや必要ありません。モジュールはグラフに関する情報を格納せず、技術的には複数のグラフで使用できます。これにより、キャッシュが容易になります。
これらの変更のほとんどには互換レイヤーがあり、使用時に非推奨の警告を表示します。
移行: ModuleGraphとChunkGraphで新しいAPIを使用してください。
DependenciesBlockVariables
は削除され、InitFragmentsが代わりに使われるようになりました。DependencyTemplates
は、モジュールのソースの先頭にコードを注入するためにInitFragments
を追加できるようになりました。InitFragments
は重複排除を可能にします。
移行: ソースに負のインデックスで何かを挿入する代わりに、InitFragments
を使用してください。
モジュールは、Module.getSourceTypes()
を介してサポートするソースタイプを定義する必要があります。それに応じて、さまざまなプラグインがこれらのタイプでsource()
を呼び出します。例:ソースタイプがjavascript
の場合、JavascriptModulesPlugin
はソースコードをバンドルに埋め込みます。ソースタイプがwebassembly
の場合、WebAssemblyModulesPlugin
はwasmファイルを生成します。カスタムソースタイプもサポートされています。例:mini-css-extract-pluginは、ソースコードをcssファイルに埋め込むためにソースタイプstylesheet
を使用する可能性があります。
モジュールタイプとソースタイプの間に関係はありません。例:モジュールタイプjson
もソースタイプjavascript
を使用し、モジュールタイプwebassembly/experimental
はソースタイプjavascript
とwebassembly
を使用します。
移行: カスタムモジュールは、これらの新しいインターフェースメソッドを実装する必要があります。
Statsのpreset
、default
、json
、およびtoString
は、プラグインシステムによって組み込まれるようになりました。現在のStatsをプラグインに変換しました。
移行: Statsの機能をすべて置き換えるのではなく、カスタマイズできるようになりました。追加情報を別のファイルに書き込む代わりに、stats jsonに追加できます。
webpackで使用されるウォッチャーがリファクタリングされました。以前はchokidar
とネイティブ依存関係のfsevents
(macOSのみ)を使用していました。現在では、ネイティブのNode.js fs
のみに基づいています。つまり、webpackにはネイティブ依存関係が残っていません。
また、監視中にファイルシステムに関するより多くの情報をキャプチャします。mtimeと監視イベント時間、および欠落しているファイルに関する情報をキャプチャするようになりました。このため、WatchFileSystem
APIが少し変更されました。また、その際に配列をSetに、オブジェクトをMapに変換しました。
webpackは、メモリ使用量を削減するために、Compilation.assets
のSourcesをSizeOnlySource
バリアントに置き換えるようになりました。
複数のアセットが同じファイル名に対して異なるコンテンツをエミットしています
という警告がエラーになりました。
モジュールのエクスポートに関する情報を保存する方法がリファクタリングされました。ModuleGraphには、各Module
のExportsInfo
があり、エクスポートごとに情報を保存します。また、不明なエクスポートに関する情報や、モジュールが副作用のみの方法で使用されているかどうかに関する情報も保存します。
各エクスポートについて、次の情報が保存されます。
optimization.usedExports
も参照)optimization.providedExports
も参照)optimization.mangleExports
も参照)import * as X from "..."; export { X };
Compilationは、別のコンパイルフェーズとしてコード生成を特徴とするようになりました。Module.source()
またはModule.getRuntimeRequirements()
内で隠れて実行されることはなくなりました。
これにより、フローが大幅にクリーンになるはずです。また、このフェーズの進捗状況を報告したり、プロファイリング時にコード生成をより可視化したりすることもできます。
移行: Module.source()
およびModule.getRuntimeRequirements()
は非推奨になりました。代わりにModule.codeGeneration()
を使用してください。
webpackには、依存関係の参照を表す単一のメソッドとタイプ(Compilation.getDependencyReference
がDependencyReference
を返す)がありました。このタイプには、参照されるモジュール、インポートされたエクスポート、弱い参照であるかどうか、および順序付けに関連する情報など、この参照に関するすべての情報が含まれていました。
これらの情報をすべてまとめることは、参照を取得するのにコストがかかり、頻繁に(誰かが情報を必要とするたびに)呼び出されます。
webpack 5では、コードベースのこの部分がリファクタリングされ、メソッドが分割されました。
Dependency.getReferencedExports()
を介して取得できます。Dependency
クラスにweak
フラグがあります。HarmonyImportDependencies
のみに関連し、sourceOrder
プロパティを介して取得できます。NormalModules
に新しいタイプの依存関係が追加されました: プレゼンテーション依存関係
これらの依存関係はコード生成フェーズでのみ使用されますが、モジュールグラフの構築中には使用されません。そのため、参照されるモジュールを持つことはなく、エクスポート/インポートに影響を与えることもありません。
これらの依存関係は処理が安価であり、webpackは可能な限りこれらを使用します。
これは非推奨になります。以下を使用してください
module.exports = {
resolve: {
alias: {
xyz$: false,
},
},
};
または絶対パスを使用してください
module.exports = {
resolve: {
alias: {
[path.resolve(__dirname, '....')]: false,
},
},
};
Compiler.name
: 絶対パスでコンパイラー名を生成する場合、名前の両方の部分で|
または!
で区切るようにしてください。|
は、Stats文字列出力でスペースに置き換えられます。SystemPlugin
はデフォルトで無効になりました。Rule.parser.system: true
で再度有効にできます。ModuleConcatenationPlugin
: DependencyVariables
が削除されたため、連結はDependencyVariables
によって阻止されなくなりました。module
、global
、process
、またはProvidePluginの場合に連結できることを意味します。Stats.presetToOptions
が削除されました。compilation.createStatsOptions
を使用してください。SingleEntryPlugin
とSingleEntryDependency
が削除されました。EntryPlugin
とEntryDependency
を使用してください。ExtendedAPIPlugin
が削除されました。__webpack_hash__
と__webpack_chunkname__
は常に使用でき、必要な場所にランタイムコードが挿入されます。ProgressPlugin
は、reportProgress
にtapableコンテキストを使用しなくなりました。ProgressPlugin.getReporter(compiler)
を使用してください。ProvidePlugin
が.mjs
ファイルで再有効化されました。Stats
jsonのerrors
とwarnings
には、文字列ではなく、プロパティに分割された情報を持つオブジェクトが含まれるようになりました。message
Compilation.hooks.normalModuleLoader
は非推奨になりました。NormalModule.getCompilationHooks(compilation).loader
を使用してください。NormalModuleFactory
のフックをウォーターフォールからベイリングに変更し、ウォーターフォール関数を返すフックを変更および名前変更しました。compilationParams.compilationDependencies
を削除しました。compilation.file/context/missingDependencies
に追加することで、コンパイルに依存関係を追加できます。compilationDependencies.add
をfileDependencies.add
に委譲します。stats.assetsByChunkName[x]
は常に配列になりました。__webpack_get_script_filename__
関数が追加されました。"sideEffects"
は、micromatch
ではなくglob-to-regex
によって処理されます。IgnorePlugin
からcheckContext
が削除されました。__webpack_exports_info__
APIを使用すると、エクスポートの使用状況を調べることができます。serve
プロパティを削除します。CachePlugin
を削除しました。Chunk.entryModule
は非推奨です。代わりにChunkGraphを使用してください。Chunk.hasEntryModule
は非推奨です。Chunk.addModule
は非推奨です。Chunk.removeModule
は非推奨です。Chunk.getNumberOfModules
は非推奨です。Chunk.modulesIterable
は非推奨です。Chunk.compareTo
は非推奨です。Chunk.containsModule
は非推奨です。Chunk.getModules
は非推奨です。Chunk.remove
は非推奨です。Chunk.moveModule
は非推奨です。Chunk.integrate
は非推奨です。Chunk.canBeIntegrated
は非推奨です。Chunk.isEmpty
は非推奨です。Chunk.modulesSize
は非推奨です。Chunk.size
は非推奨です。Chunk.integratedSize
は非推奨です。Chunk.getChunkModuleMaps
は非推奨です。Chunk.hasModuleInGraph
は非推奨です。Chunk.updateHash
シグネチャが変更されました。Chunk.getChildIdsByOrders
シグネチャが変更されました。(TODO: ChunkGraph
への移動を検討)Chunk.getChildIdsByOrdersMap
シグネチャが変更されました。(TODO: ChunkGraph
への移動を検討)Chunk.getChunkModuleMaps
を削除しました。Chunk.setModules
を削除しました。ChunkGraph
が追加されました。ChunkGroup.setParents
を削除しました。ChunkGroup.containsModule
を削除しました。Compilation.cache
は削除され、Compilation.getCache()
が代わりに使用されるようになりました。ChunkGroup.remove
は、グループをブロックから切断しなくなりました。ChunkGroup.compareTo
シグネチャが変更されました。ChunkGroup.getChildrenByOrders
シグネチャが変更されました。ChunkGroup
のインデックスとインデックスの名前が、事前/事後順序インデックスに変更されました。ChunkTemplate.hooks.modules
シグネチャが変更されました。ChunkTemplate.hooks.render
シグネチャが変更されました。ChunkTemplate.updateHashForChunk
シグネチャが変更されました。Compilation.hooks.optimizeChunkOrder
を削除しました。Compilation.hooks.optimizeModuleOrder
を削除しました。Compilation.hooks.advancedOptimizeModuleOrder
を削除しました。Compilation.hooks.optimizeDependenciesBasic
を削除しました。Compilation.hooks.optimizeDependenciesAdvanced
を削除しました。Compilation.hooks.optimizeModulesBasic
を削除しました。Compilation.hooks.optimizeModulesAdvanced
を削除しました。Compilation.hooks.optimizeChunksBasic
を削除しました。Compilation.hooks.optimizeChunksAdvanced
を削除しました。Compilation.hooks.optimizeChunkModulesBasic
を削除しました。Compilation.hooks.optimizeChunkModulesAdvanced
を削除しました。Compilation.hooks.optimizeExtractedChunksBasic
を削除しました。Compilation.hooks.optimizeExtractedChunks
が削除されました。Compilation.hooks.optimizeExtractedChunksAdvanced
が削除されました。Compilation.hooks.afterOptimizeExtractedChunks
が削除されました。Compilation.hooks.stillValidModule
が追加されました。Compilation.hooks.statsPreset
が追加されました。Compilation.hooks.statsNormalize
が追加されました。Compilation.hooks.statsFactory
が追加されました。Compilation.hooks.statsPrinter
が追加されました。Compilation.fileDependencies
、Compilation.contextDependencies
、および Compilation.missingDependencies
は、LazySets になりました。Compilation.entries
が削除されました。Compilation.entryDependencies
を使用してください。Compilation._preparedEntrypoints
が削除されました。dependencyTemplates
は、rawな Map
ではなく、DependencyTemplates
クラスになりました。Compilation.fileTimestamps
および contextTimestamps
が削除されました。Compilation.fileSystemInfo
を使用してください。Compilation.waitForBuildingFinished
が削除されました。Compilation.addModuleDependencies
が削除されました。Compilation.prefetch
が削除されました。Compilation.hooks.beforeHash
は、モジュールのハッシュが作成された後に呼び出されるようになりました。Compiliation.hooks.beforeModuleHash
を使用してください。Compilation.applyModuleIds
が削除されました。Compilation.applyChunkIds
が削除されました。Compiler.root
が追加されました。これはルートコンパイラーを指します。Compiler.hooks.afterDone
が追加されました。Source.emitted
は、コンパイラーによって設定されなくなりました。Compilation.emittedAssets
を確認してください。Compiler/Compilation.compilerPath
が追加されました。これは、コンパイラツリー内のコンパイラの一意の名前です(ルートコンパイラースコープに対して一意)。Module.needRebuild
は非推奨となりました。Module.needBuild
を使用してください。Dependency.getReference
のシグネチャが変更されました。Dependency.getExports
のシグネチャが変更されました。Dependency.getWarnings
のシグネチャが変更されました。Dependency.getErrors
のシグネチャが変更されました。Dependency.updateHash
のシグネチャが変更されました。Dependency.module
が削除されました。DependencyTemplate
のベースクラスができました。MultiEntryDependency
が削除されました。EntryDependency
が追加されました。EntryModuleNotFoundError
が削除されました。SingleEntryPlugin
が削除されました。EntryPlugin
が追加されました。Generator.getTypes
が追加されました。Generator.getSize
が追加されました。Generator.generate
のシグネチャが変更されました。HotModuleReplacementPlugin.getParserHooks
が追加されました。Parser
は JavascriptParser
に移動しました。ParserHelpers
は JavascriptParserHelpers
に移動しました。MainTemplate.hooks.moduleObj
が削除されました。MainTemplate.hooks.currentHash
が削除されました。MainTemplate.hooks.addModule
が削除されました。MainTemplate.hooks.requireEnsure
が削除されました。MainTemplate.hooks.globalHashPaths
が削除されました。MainTemplate.hooks.globalHash
が削除されました。MainTemplate.hooks.hotBootstrap
が削除されました。MainTemplate.hooks
のいくつかのシグネチャが変更されました。Module.hash
は非推奨となりました。Module.renderedHash
は非推奨となりました。Module.reasons
が削除されました。Module.id
は非推奨となりました。Module.index
は非推奨となりました。Module.index2
は非推奨となりました。Module.depth
は非推奨となりました。Module.issuer
は非推奨となりました。Module.profile
が削除されました。Module.prefetched
が削除されました。Module.built
が削除されました。Module.used
が削除されました。Module.getUsedExports
を使用してください。Module.getUsedExports
を使用してください。Module.optimizationBailout
は非推奨となりました。Module.exportsArgument
が削除されました。Module.optional
は非推奨となりました。Module.disconnect
が削除されました。Module.unseal
が削除されました。Module.setChunks
が削除されました。Module.addChunk
は非推奨となりました。Module.removeChunk
は非推奨となりました。Module.isInChunk
は非推奨となりました。Module.isEntryModule
は非推奨となりました。Module.getChunks
は非推奨となりました。Module.getNumberOfChunks
は非推奨となりました。Module.chunksIterable
は非推奨となりました。Module.hasEqualsChunks
が削除されました。Module.useSourceMap
は NormalModule
に移動しました。Module.addReason
が削除されました。Module.removeReason
が削除されました。Module.rewriteChunkInReasons
が削除されました。Module.isUsed
が削除されました。isModuleUsed
、isExportUsed
、および getUsedName
を使用してください。Module.updateHash
のシグネチャが変更されました。Module.sortItems
が削除されました。Module.unbuild
が削除されました。invalidateBuild
を使用してください。Module.getSourceTypes
が追加されました。Module.getRuntimeRequirements
が追加されました。Module.size
のシグネチャが変更されました。ModuleFilenameHelpers.createFilename
のシグネチャが変更されました。ModuleProfile
クラスが追加されました。ModuleReason
が削除されました。ModuleTemplate.hooks
のシグネチャが変更されました。ModuleTemplate.render
のシグネチャが変更されました。Compiler.dependencies
が削除されました。MultiCompiler.setDependencies
を使用してください。MultiModule
が削除されました。MultiModuleFactory
が削除されました。NormalModuleFactory.fileDependencies
、NormalModuleFactory.contextDependencies
、および NormalModuleFactory.missingDependencies
は LazySets になりました。RuntimeTemplate
メソッドは、runtimeRequirements
引数を取るようになりました。serve
プロパティが削除されました。Stats.jsonToString
が削除されました。Stats.filterWarnings
が削除されました。Stats.getChildOptions
が削除されました。Stats
ヘルパーメソッドが削除されました。Stats.toJson
のシグネチャが変更されました(2番目の引数が削除されました)。ExternalModule.external
が削除されました。HarmonyInitDependency
が削除されました。Dependency.getInitFragments
は非推奨となりました。apply
の initFragements
を使用してください。setId
を使用してください。async-node
、node
、web
、webworker
で実行されるようになりました。store: "instant"
および store: "pack"
を使用したファイルシステムキャッシングでも実行されるようになりました。resolvedModuleId
、resolvedModuleIdentifier
、および resolvedModule
を Stats の理由に追加しました。resolvedModule
を表示します。Compilation
の file/context/missingDependencies
はソートされなくなりました。Compiler.assetEmitted
に、より多くの情報を含む改善された2番目の引数があります。LimitChunkCountPlugin
から minChunkSize
オプションを削除しました。webpack.JavascriptModulesPlugin
-> webpack.javascript.JavascriptModulesPlugin
__system_context__
を追加します。emitAsset
の assetInfo
がマージされるようになりました。filename
に基づくパスの場合、[query]
が有効なプレースホルダーになりました。Compilation.deleteAsset
を追加します。require("webpack-sources")
を require("webpack").sources
として公開します。