DllPlugin
とDllReferencePlugin
は、ビルド時間の性能を大幅に向上させることができる方法でバンドルを分割する手段を提供します。「DLL」という用語は、Microsoftによって最初に導入されたダイナミックリンクライブラリを表しています。
このプラグインは、別々のwebpack設定で使用され、dll専用のバンドルを作成します。これはmanifest.json
ファイルを作成し、これはDllReferencePlugin
によって依存関係をマッピングするために使用されます。
context
(オプション):マニフェストファイル内のリクエストのコンテキスト(webpackコンテキストがデフォルト)format
(boolean = false):true
の場合、マニフェストjsonファイル(出力)はフォーマットされます。name
:公開されたdll関数の名前(TemplatePaths:[fullhash]
、[chunkhash]
、[contenthash]
、および[name]
)path
:マニフェストjsonファイル(出力)への**絶対パス**entryOnly
(boolean = true):true
の場合、エントリポイントのみが公開されます。type
:dllバンドルのタイプnew webpack.DllPlugin(options);
指定されたpath
に書き込まれるmanifest.json
を作成します。これは、requireおよびimportリクエストからモジュールIDへのマッピングが含まれています。DllReferencePlugin
で使用されます。
このプラグインをoutput.library
オプションと組み合わせて、DLL関数を公開(グローバルスコープに配置)します。
このプラグインは、プライマリWebpack設定で使用され、事前にビルドされた依存関係をrequireするために、dll専用のバンドルを参照します。
context
:(**絶対パス**)マニフェスト(またはcontentプロパティ)内のリクエストのコンテキストextensions
:DLLバンドルでモジュールを解決するために使用される拡張子('scope'を使用する場合のみ使用されます)。manifest
:content
とname
を含むオブジェクト、またはコンパイル時に読み込まれるJSONマニフェストの絶対パスへの文字列content
(オプション):リクエストからモジュールIDへのマッピング(デフォルトはmanifest.content
)name
(オプション):DLLが公開される識別子(デフォルトはmanifest.name
)(externals
も参照)scope
(オプション):DLLの内容にアクセスするために使用されるプレフィックスsourceType
(オプション):DLLの公開方法(libraryTarget)new webpack.DllReferencePlugin(options);
DLLマニフェストファイルを参照して、依存関係の名前をモジュールIDにマッピングし、必要に応じて内部の__webpack_require__
関数を使用してそれらを要求します。
このプラグインは、スコープ付きモードとマッピングモードの2つの異なるモードで使用できます。
DLLの内容は、モジュールプレフィックスの下でアクセスできます。つまり、scope = 'xyz'
の場合、DLL内のファイルabc
はrequire('xyz/abc')
を介してアクセスできます。
DLLの内容は現在のディレクトリにマッピングされます。要求されたファイルが(解決後)DLL内のファイルと一致する場合、DLLからのファイルが代わりに使用されます。
これはDLLバンドルのすべてのファイルを解決した後に発生するため、DLLバンドルのコンシューマーに対して同じパスを使用可能にする必要があります。つまり、DLLにlodash
とファイルabc
が含まれている場合、require('lodash')
とrequire('./abc')
はメインバンドルにビルドする代わりに、DLLから使用されます。
webpack.vendor.config.js
const path = require('path');
new webpack.DllPlugin({
context: __dirname,
name: '[name]_[fullhash]',
path: path.join(__dirname, 'manifest.json'),
});
webpack.app.config.js
new webpack.DllReferencePlugin({
context: __dirname,
manifest: require('./manifest.json'),
scope: 'xyz',
sourceType: 'commonjs2',
});
2つの別々の例フォルダ。スコープとコンテキストを示しています。