このセクションの内容は、以下のリンクの内容を基に作成されており、CC BY 4.0 ライセンスの対象となります。
特に明記されていない限り、以下の内容は元のコンテンツに基づいた修正と削除の結果であるとみなすことができます。
externals
設定オプションを使用すると、出力バンドルから依存関係を除外できます。代わりに、作成されたバンドルは、コンシューマー(エンドユーザーアプリケーション)の環境にその依存関係が存在することを前提とします。この機能は、通常、ライブラリ開発者にとって最も役立ちますが、さまざまな用途があります。
string | object | function | RegExp | Array<string | object | function | RegExp>
バンドリングの防止 特定の `import` されたパッケージのバンドルを防止し、代わりに実行時にこれらの *外部依存関係* を取得します。
たとえば、バンドルする代わりにCDNからjQuery を含める場合
index.html
これにより、依存モジュールは変更されません。つまり、下記のコードは引き続き機能します。
上記の rspack.config.js
の externals
で指定されたプロパティ名 jquery
は、import $ from 'jquery'
のモジュール jquery
をバンドルから除外することを示します。このモジュールを置き換えるために、値 jQuery
を使用してグローバル jQuery
変数を取得します。これは、デフォルトの外部ライブラリタイプが var
であるためです(externalsType を参照)。
上記ではグローバル変数の外部ライブラリを使用する例を示しましたが、実際にはグローバル変数、CommonJS、AMD、ES2015モジュールなど、さまざまな形式で外部ライブラリを使用できます。externalsTypeで詳細を確認してください。
externalsType によって、グローバル変数の名前('global'
、'this'
、'var'
、'window'
を参照)、またはモジュールの名前(amd
、commonjs
、module
、umd
を参照)になります。
外部ライブラリを1つだけ定義する場合は、ショートカット構文を使用できます。
これは次と同じです。
${externalsType} ${libraryName}
構文を使用して、外部ライブラリに外部ライブラリタイプを指定できます。externalsType オプションで指定されたデフォルトの外部ライブラリタイプを上書きします。
たとえば、外部ライブラリがCommonJSモジュールの場合、次のように指定できます。
subtract: ['./math', 'subtract']
を使用すると、モジュールの部分を指定できます。./math
がモジュールで、バンドルでは subtract
変数以下のサブセットのみが必要です。
externalsType
が commonjs
の場合、この例は require('./math').subtract;
に変換されます。externalsType
が window
の場合、この例は window["./math"]["subtract"];
に変換されます。
文字列構文 と同様に、配列の最初の要素に ${externalsType} ${libraryName}
構文を使用して外部ライブラリタイプを指定できます。たとえば、
{ root, amd, commonjs, ... }
を含むオブジェクトは、libraryTarget: 'umd'
と externalsType: 'umd'
の場合にのみ許可されます。他のライブラリターゲットでは許可されません。
この構文は、外部ライブラリを利用可能にするあらゆる方法を記述するために使用されます。 ここでは、lodash
は AMD および CommonJS モジュールシステムでは lodash
として、グローバル変数形式では _
として利用可能です。 subtract
は、グローバル math
オブジェクトのプロパティ subtract
を介して利用可能です (例: window['math']['subtract']
)。
function ({ context, request, contextInfo, getResolve }, callback)
function ({ context, request, contextInfo, getResolve }) => promise
Rspack から外部化したいものの動作を制御するために、独自の関数を定義することが役立つ場合があります。 例えば、webpack-node-externals は、node_modules
ディレクトリからすべてのモジュールを除外します。また、パッケージを許可リストに追加するオプションも提供します。
関数が受け取ることができる引数
ctx
(object
): ファイルの詳細を含むオブジェクト。
ctx.context
(string
): import を含むファイルのディレクトリ。ctx.request
(string
): 要求された import パス。ctx.contextInfo
(object
): 発行者に関する情報 (例: レイヤーとコンパイラ) を含みます。ctx.getResolve
: 現在の resolver オプションを使用して resolve 関数を取得します。callback
(function (err, result, type)
): モジュールをどのように外部化するべきかを示すために使用されるコールバック関数。コールバック関数は3つの引数を取ります
err
(Error
): import の外部化中にエラーが発生したかどうかを示すために使用されます。 エラーが発生した場合は、このパラメータのみを使用する必要があります。result
(string | string[] | object
): 他の外部形式(string
、string[]
、またはobject
) を使用して外部モジュールを記述します。type
(string
): モジュールの外部型を示すオプションのパラメータ(result
パラメータですでに示されていない場合)。例として、import パスが正規表現と一致するすべてのimportを外部化するには、次の手順を実行します。
異なるモジュール形式を使用したその他の例
指定された正規表現と一致するすべての依存関係が出力バンドルから除外されます。
この場合、jQuery
(大文字小文字を問わず)、または$
という名前の依存関係はすべて外部化されます。
上記の構文を組み合わせて使用したい場合があります。これは、次の方法で行うことができます。
型を指定せずにexternals
を指定する場合(例:externals: { react: 'react' }
ではなくexternals: { react: 'commonjs-module react' }
)、デフォルトの型が使用されます。
string
'var'
外部のデフォルトの型を指定します。 amd
、umd
、system
、jsonp
外部は、output.libraryTarget
が同じ値に設定されている場合にのみ依存します。 例えば、amd
ライブラリ内では amd
外部のみを使用できます。
サポートされている型
'amd'
'amd-require'
'assign'
- 'var'
と同じ'commonjs'
'commonjs-module'
'global'
'module'
'import'
- ネイティブな EcmaScript モジュール(非同期モジュール)の読み込みに import()
を使用します。'module-import'
'jsonp'
'node-commonjs'
'promise'
- 'var'
と同じですが、結果を待機します(非同期モジュール)。'self'
'system'
'script'
'this'
'umd'
'umd2'
'var'
'window'
外部のデフォルトの型を 'commonjs'
として指定します。 Rspack は、モジュールで使用される外部に対して const X = require('...')
のようなコードを生成します。
例
次のようなものに変換されます。
出力バンドルには require()
が含まれることに注意してください。
外部のデフォルトの型を 'global'
として指定します。 Rspack は、globalObject
上のグローバル変数として外部を読み取ります。
例
次のようなものに変換されます。
外部のデフォルトの型を 'module'
として指定します。 Rspack は、モジュールで使用される外部に対して import * as X from '...'
のようなコードを生成します。
最初にexperiments.outputModule
を有効にしてください。 そうしないと、Rspack はエラーをスローします。
例
次のようなものに変換されます。
出力バンドルには import
ステートメントが含まれることに注意してください。
外部のデフォルトの型を 'import'
として指定します。 Rspack は、モジュールで使用される外部に対して import('...')
のようなコードを生成します。
例
次のようなものに変換されます。
出力バンドルには import()
ステートメントが含まれることに注意してください。
'module'
と'import'
を組み合わせます。 Rspack は、静的インポートの場合は 'module'
に、動的インポートの場合は 'import'
にインポート構文の型を自動的に検出します。
静的インポートが存在する場合は、最初にexperiments.outputModule
を有効にしてください。 そうしないと、Rspack はエラーをスローします。
例
次のようなものに変換されます。
出力バンドルには import
または import()
ステートメントが含まれることに注意してください。
モジュールが import
または import()
を介してインポートされない場合、Rspack はフォールバックとして "module"
外部型を使用します。 フォールバックとして異なるタイプの外部を使用する場合は、externals
オプションで関数を使用して指定できます。 例えば
外部のデフォルトの型を 'node-commonjs'
として指定します。 Rspack は、createRequire
を 'module'
からインポートして、モジュールで使用される外部を読み込むための require 関数を構築します。
例
次のようなものに変換されます。
出力バンドルには import
ステートメントが含まれることに注意してください。
外部のデフォルトの型を 'promise'
として指定します。 Rspack は、外部をグローバル変数として読み取り('var'
と同様)、それを await
します。
例
次のようなものに変換されます。
外部のデフォルトの型を 'self'
として指定します。 Rspack は、self
オブジェクト上のグローバル変数として外部を読み取ります。
例
次のようなものに変換されます。
外部のデフォルトの型を 'script'
として指定します。 Rspack は、HTML <script>
要素を使用して、事前に定義されたグローバル変数を公開するスクリプトとして外部を読み込みます。 スクリプトが読み込まれた後、<script>
タグは削除されます。
構文
プロパティを指定しない場合は、ショートカット構文を使用することもできます。
output.publicPath
は、提供された URL に追加されないことに注意してください。
例
CDN から lodash
を読み込んでみましょう
そして、コードで使用します
上記の例のプロパティを指定する方法を次に示します。
lodash
を import
すると、ローカル変数 head
とグローバル window._
の両方が公開されます。
HTML <script>
タグを使用してコードを読み込む場合、Rspack ランタイムは、src
属性と一致する既存の <script>
タグ、または特定の data-webpack
属性を持つタグを検索しようとします。 チャンクの読み込みでは、data-webpack
属性の値は '[output.uniqueName]:chunk-[chunkId]'
になり、外部スクリプトの場合は '[output.uniqueName]:[global]'
になります。
output.chunkLoadTimeout
、output.crossOriginLoading
、output.scriptType
のようなオプションも、このように読み込まれた外部スクリプトに影響します。
外部のデフォルトの型を 'this'
として指定します。 Rspack は、this
オブジェクト上のグローバル変数として外部を読み取ります。
例
次のようなものに変換されます。
外部のデフォルトの型を 'var'
として指定します。 Rspack は、グローバル変数として外部を読み取ります。
例
次のようなものに変換されます。
外部のデフォルトの型を 'window'
として指定します。 Rspack は、window
オブジェクト上のグローバル変数として外部を読み取ります。
例
次のようなものに変換されます。
object
特定のターゲットの外部プリセットを有効にします。
型: boolean
メインコンテキストとプリロードコンテキストで、electron
、ipc
、shell
などの一般的な Electron 組み込みモジュールを外部として扱い、使用時に require()
を介して読み込みます。
型: boolean
メインコンテキストで、app
、ipc-main
、shell
などの Electron 組み込みモジュールを外部として扱い、使用時に require()
を介して読み込みます。
型: boolean
プリロードコンテキストで、web-frame
、ipc-renderer
、shell
などの Electron 組み込みモジュールを外部として扱い、使用時に require()
を介して読み込みます。
型: boolean
レンダラーコンテキストで、web-frame
、ipc-renderer
、shell
などの Electron 組み込みモジュールを外部として扱い、使用時に require()
を介して読み込みます。
型: boolean
fs
、path
、vm
などの Node.js 組み込みモジュールを外部として扱い、使用時に require()
を介して読み込みます。
型: boolean
NW.js
のレガシー nw.gui
モジュールを外部として扱い、使用時に require()
を介して読み込みます。
型: boolean
http(s)://...
と std:...
への参照を外部として扱い、使用時に import
を介して読み込みます。(これは、外部がチャンク内の他のコードよりも前に実行されるため、実行順序を変更することに注意してください)。
型: boolean
http(s)://...
と std:...
への参照を外部として扱い、使用時に async import()
を介して読み込みます。(この外部型は非同期モジュールであるため、実行にさまざまな影響を与えることに注意してください)。
Node.js関連のプリセットを使用してESモジュールを出力する場合、RspackはデフォルトのexternalsType
をnode-commonjs
に設定します。これにより、require()
を使用する代わりに、createRequire
を使用してrequire関数が構築されます。
例
node
プリセットを使用すると、組み込みモジュールはバンドルされず、外部モジュールとして扱われ、require()
を使用してロードされます。