DefinePlugin
會在編譯時間用其他值或運算式取代程式碼中的變數。這對於允許開發組建和製作組建之間有不同的行為很有用。如果您在開發組建中進行記錄,但在製作組建中沒有進行記錄,則可以使用全域常數來確定是否進行記錄。這就是 DefinePlugin
發揮作用的地方,設定它並忘記它,以進行開發和製作組建。
new webpack.DefinePlugin({
// Definitions...
});
傳遞到 DefinePlugin
的每個金鑰都是識別碼,或多個識別碼使用 .
結合。
typeof
,則它只會定義給 typeof
呼叫。這些值將內嵌到程式碼中,允許最小化傳遞移除多餘的條件式。
new webpack.DefinePlugin({
PRODUCTION: JSON.stringify(true),
VERSION: JSON.stringify('5fa3b9'),
BROWSER_SUPPORTS_HTML5: true,
TWO: '1+1',
'typeof window': JSON.stringify('object'),
'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV),
});
console.log('Running App version ' + VERSION);
if (!BROWSER_SUPPORTS_HTML5) require('html5shiv');
if (!PRODUCTION) {
console.log('Debug info');
}
if (PRODUCTION) {
console.log('Production log');
}
在未縮小的 webpack 中傳遞後,結果為
if (!true) {
console.log('Debug info');
}
if (true) {
console.log('Production log');
}
然後在縮小後,結果為
console.log('Production log');
使用功能旗標在生產/開發建置中啟用/停用功能。
new webpack.DefinePlugin({
NICE_FEATURE: JSON.stringify(true),
EXPERIMENTAL_FEATURE: JSON.stringify(false),
});
在生產/開發建置中使用不同的服務 URL
new webpack.DefinePlugin({
SERVICE_URL: JSON.stringify('https://dev.example.com'),
});
runtimeValue
的執行時期值函式 (getterFunction, [字串] | true | 物件) => getterFunction()
可以定義值依賴於檔案的變數,且當檔案系統中的此類檔案變更時,將重新評估這些值。這表示 webpack 會在這些監控的檔案變更時重新建置。
webpack.DefinePlugin.runtimeValue
函式有兩個引數
第一個引數是 function(module, key, version)
,它應該傳回要指定給定義的值。
第二個引數可以是監控的檔案路徑陣列,或 true
來將模組標示為無法快取。自 5.26.0 起,它也可以採用具有下列屬性的物件引數
fileDependencies?: string[]
函式所依賴的檔案清單。contextDependencies?: string[]
函式所依賴的目錄清單。missingDependencies?: string[]
函式所依賴但不存在的檔案清單。buildDependencies?: string[]
函式所依賴的建置依賴項清單。version?: string | () => string
函式的版本。const fileDep = path.resolve(__dirname, 'sample.txt');
new webpack.DefinePlugin({
BUILT_AT: webpack.DefinePlugin.runtimeValue(Date.now, {
fileDependencies: [fileDep],
}),
});
BUILT_AT
的值會是檔案系統中 'sample.txt'
最後更新的時間,例如 1597953013291
。