output
ä½äºå¯¹è±¡æé¡¶çº§é®(key)ï¼å
æ¬äºä¸ç»éé¡¹ï¼æç¤º webpack å¦ä½å»è¾åºã以åå¨åªéè¾åºä½ çãbundleãasset åå
¶ä»ä½ ææå
æä½¿ç¨ webpack è½½å
¥çä»»ä½å
容ãã
string = '[hash][ext][query]'
ä¸ output.filename
ç¸åï¼ä¸è¿åºç¨äº Asset Modulesã
坹仿°æ® URI æ¿æ¢æå»ºçéæèµæºï¼[name]
, [file]
, [query]
, [fragment]
, [base]
ä¸ [path]
为空å符串ã
boolean = true
å建æéå è½½ç弿¥ chunkã
webpack.config.js
module.exports = {
//...
output: {
//...
asyncChunks: true,
},
};
string
object
å¨å output.library
å output.libraryTarget
ä¸èµ·ä½¿ç¨æ¶ï¼æ¤é项å
è®¸ç¨æ·å导åºå®¹å¨(export wrapper)䏿å
¥æ³¨éãè¦ä¸º libraryTarget
æ¯ç§ç±»å齿å
¥ç¸åçæ³¨éï¼å° auxiliaryComment
设置为ä¸ä¸ªå符串ï¼
webpack.config.js
module.exports = {
//...
output: {
library: 'someLibName',
libraryTarget: 'umd',
filename: 'someLibName.js',
auxiliaryComment: 'Test Comment',
},
};
å°ä¼çæå¦ä¸ï¼
someLibName.js
(function webpackUniversalModuleDefinition(root, factory) {
// Test Comment
if (typeof exports === 'object' && typeof module === 'object')
module.exports = factory(require('lodash'));
// Test Comment
else if (typeof define === 'function' && define.amd)
define(['lodash'], factory);
// Test Comment
else if (typeof exports === 'object')
exports['someLibName'] = factory(require('lodash'));
// Test Comment
else root['someLibName'] = factory(root['_']);
})(this, function (__WEBPACK_EXTERNAL_MODULE_1__) {
// ...
});
å¯¹äº libraryTarget
æ¯ç§ç±»åçæ³¨éè¿è¡æ´ç»ç²åº¦å°æ§å¶ï¼è¯·ä¼ å
¥ä¸ä¸ªå¯¹è±¡ï¼
webpack.config.js
module.exports = {
//...
output: {
//...
auxiliaryComment: {
root: 'Root Comment',
commonjs: 'CommonJS Comment',
commonjs2: 'CommonJS2 Comment',
amd: 'AMD Comment',
},
},
};
boolean = true
åè¯ webpack 为 HTML ç <script>
æ ç¾æ·»å charset="utf-8"
æ è¯ã
string = '[id].js'
function (pathData, assetInfo) => string
æ¤é项å³å®äºéåå§ï¼non-initialï¼chunk æä»¶çåç§°ãæå
³å¯åçå¼ç详ç»ä¿¡æ¯ï¼è¯·æ¥ç output.filename
é项ã
注æï¼è¿äºæä»¶åéè¦å¨è¿è¡æ¶æ ¹æ® chunk åéç请æ±å»çæãå æ¤ï¼éè¦å¨ webpack runtime è¾åº bundle 弿¶ï¼å° chunk id çå¼å¯¹åºæ å°å°å ä½ç¬¦(å¦ [name]
å [chunkhash]
)ãè¿ä¼å¢å æä»¶å¤§å°ï¼å¹¶ä¸å¨ä»»ä½ chunk çå ä½ç¬¦å¼ä¿®æ¹åï¼é½ä¼ä½¿ bundle 失æã
é»è®¤ä½¿ç¨ [id].js
æä» output.filename
䏿¨æåºçå¼ï¼[name]
ä¼è¢«é¢å
æ¿æ¢ä¸º [id]
æ [id].
ï¼ã
webpack.config.js
module.exports = {
//...
output: {
//...
chunkFilename: '[id].js',
},
};
Usage as a function:
webpack.config.js
module.exports = {
//...
output: {
chunkFilename: (pathData) => {
return pathData.chunk.name === 'main' ? '[name].js' : '[name]/[name].js';
},
},
};
false
string: 'array-push' | 'commonjs' | 'module' | <any string>
chunk çæ ¼å¼ï¼formats é»è®¤å
å« 'array-push'
(web/WebWorker)ã'commonjs'
(node.js)ã'module'
(ESM)ï¼è¿æå
¶ä»æ
åµå¯ç±æä»¶æ·»å ï¼ã
webpack.config.js
module.exports = {
//...
output: {
//...
chunkFormat: 'commonjs',
},
};
number = 120000
chunk 请æ±å°æä¹åçæ¯«ç§æ°ï¼é»è®¤ä¸º 120000ãä» webpack 2.6.0 å¼å§æ¯ææ¤é项ã
webpack.config.js
module.exports = {
//...
output: {
//...
chunkLoadTimeout: 30000,
},
};
string = 'webpackChunkwebpack'
webpack ç¨äºå è½½ chunk çå ¨å±åéã
webpack.config.js
module.exports = {
//...
output: {
//...
chunkLoadingGlobal: 'myCustomFunc',
},
};
false
string: 'jsonp' | 'import-scripts' | 'require' | 'async-node' | 'import' | <any string>
å è½½ chunk çæ¹æ³ï¼é»è®¤å¼æ 'jsonp'
(web)ã'import'
(ESM)ã'importScripts'
(WebWorker)ã'require'
(sync node.js)ã'async-node'
(async node.js)ï¼è¿æå
¶ä»å¼å¯ç±æä»¶æ·»å )ã
webpack.config.js
module.exports = {
//...
output: {
//...
chunkLoading: 'async-node',
},
};
boolean
{ dry?: boolean, keep?: RegExp | string | ((filename: string) => boolean) }
module.exports = {
//...
output: {
clean: true, // å¨çææä»¶ä¹åæ¸
空 output ç®å½
},
};
module.exports = {
//...
output: {
clean: {
dry: true, // æå°è䏿¯å é¤åºè¯¥ç§»é¤çéæèµæº
},
},
};
module.exports = {
//...
output: {
clean: {
keep: /ignored\/dir\//, // ä¿ç 'ignored/dir' ä¸çéæèµæº
},
},
};
// æè
module.exports = {
//...
output: {
clean: {
keep(asset) {
return asset.includes('ignored/dir');
},
},
},
};
ä½ ä¹å¯ä»¥ä½¿ç¨é©å彿°ï¼
webpack.CleanPlugin.getCompilationHooks(compilation).keep.tap(
'Test',
(asset) => {
if (/ignored\/dir\//.test(asset)) return true;
}
);
boolean = true
åç¥ webpack å¨åå ¥å°è¾åºæä»¶ç³»ç»æ¶æ£æ¥è¾åºçæä»¶æ¯å¦å·²ç»åå¨å¹¶ä¸æ¥æç¸åå 容ã
module.exports = {
//...
output: {
compareBeforeEmit: false,
},
};
boolean = false
string: 'anonymous' | 'use-credentials'
åè¯ webpack å¯ç¨ cross-origin 屿§ å è½½ chunkãä»
å¨ target
设置为 'web'
æ¶çæï¼éè¿ä½¿ç¨ JSONP æ¥æ·»å èæ¬æ ç¾ï¼å®ç°æéå 载模åã
'anonymous'
- ä¸å¸¦åæ®(credential) å¯ç¨è·¨åå è½½'use-credentials'
- æºå¸¦åæ®(credential) å¯ç¨è·¨åå è½½string
function (info)
å½ä¸é¢ç模æ¿å符串æå½æ°äº§çé夿¶ä½¿ç¨çå¤ç¨å 容ã
æ¥ç output.devtoolModuleFilenameTemplate
ã
string = 'webpack://[namespace]/[resource-path]?[loaders]'
function (info) => string
æ¤é项ä»
å¨ ãdevtool
使ç¨äºéè¦æ¨¡ååç§°çéé¡¹ãæ¶ä½¿ç¨ã
èªå®ä¹æ¯ä¸ª source map ç sources
æ°ç»ä¸ä½¿ç¨çåç§°ãå¯ä»¥éè¿ä¼ 鿍¡æ¿å符串(template string)æè
彿°æ¥å®æãä¾å¦ï¼å½ä½¿ç¨ devtool: 'eval'
ï¼é»è®¤å¼æ¯ï¼
webpack.config.js
module.exports = {
//...
output: {
devtoolModuleFilenameTemplate:
'webpack://[namespace]/[resource-path]?[loaders]',
},
};
模æ¿å符串(template string)ä¸å以䏿¿æ¢ï¼éè¿ webpack å
é¨ç ModuleFilenameHelpers
ï¼ï¼
Template | Description |
---|---|
[absolute-resource-path] | ç»å¯¹è·¯å¾æä»¶å |
[all-loaders] | èªå¨åæ¾å¼ç loaderï¼å¹¶ä¸åæ°åå³äºç¬¬ä¸ä¸ª loader åç§° |
[hash] | æ¨¡åæ è¯ç¬¦ç hash |
[id] | æ¨¡åæ è¯ç¬¦ |
[loaders] | æ¾å¼ç loaderï¼å¹¶ä¸åæ°åå³äºç¬¬ä¸ä¸ª loader åç§° |
[resource] | ç¨äºè§£ææä»¶çè·¯å¾åç¨äºç¬¬ä¸ä¸ª loader çä»»ææ¥è¯¢åæ° |
[resource-path] | ä¸å¸¦ä»»ä½æ¥è¯¢åæ°ï¼ç¨äºè§£ææä»¶çè·¯å¾ |
[namespace] | 模åå½å空é´ãå¨æå»ºæä¸ºä¸ä¸ª library ä¹åï¼é叏乿¯ library åç§°ï¼å¦å为空 |
å½ä½¿ç¨ä¸ä¸ªå½æ°ï¼åæ ·çé项è¦éè¿ info
åæ°å¹¶ä½¿ç¨é©¼å³°å¼(camel-cased)ï¼
module.exports = {
//...
output: {
devtoolModuleFilenameTemplate: (info) => {
return `webpack:///${info.resourcePath}?${info.loaders}`;
},
},
};
妿å¤ä¸ªæ¨¡å产çç¸åçåç§°ï¼ä½¿ç¨ output.devtoolFallbackModuleFilenameTemplate
æ¥ä»£æ¿è¿äºæ¨¡åã
string
æ¤éé¡¹ç¡®å® output.devtoolModuleFilenameTemplate
使ç¨ç模åå称空é´ãæªæå®æ¶çé»è®¤å¼ä¸ºï¼output.uniqueName
ãå¨å è½½å¤ä¸ªéè¿ webpack æå»ºç library æ¶ï¼ç¨äºé²æ¢ source map 䏿ºæä»¶è·¯å¾å²çªã
ä¾å¦ï¼å¦æä½ æä¸¤ä¸ª libraryï¼åå«ä½¿ç¨å½åç©ºé´ library1
å library2
ï¼å¹¶ä¸é½æä¸ä¸ªæä»¶ ./src/index.js
ï¼å¯è½å
·æä¸åå
容ï¼ï¼å®ä»¬ä¼å°è¿äºæä»¶æ´é²ä¸º webpack://library1/./src/index.js
å webpack://library2/./src/index.js
ã
output.enabledChunkLoadingTypes
[string: 'jsonp' | 'import-scripts' | 'require' | 'async-node' | <any string>]
å è®¸å ¥å£ç¹ä½¿ç¨ç chunk å 载类åå表ãå°è¢« webpack èªå¨å¡«å ãåªæå½ä½¿ç¨ä¸ä¸ªå½æ°ä½ä¸ºå ¥å£é 置项并ä»é£éè¿å chunkLoading é ç½®é¡¹æ¶æéè¦ã
webpack.config.js
module.exports = {
//...
output: {
//...
enabledChunkLoadingTypes: ['jsonp', 'require'],
},
};
output.enabledLibraryTypes
[string]
å ¥å£ç¹å¯ç¨ç library ç±»åå表.
module.exports = {
//...
output: {
enabledLibraryTypes: ['module'],
},
};
output.enabledWasmLoadingTypes
[string]
ç¨äºè®¾ç½®å ¥å£æ¯æç wasm å 载类åçå表ã
module.exports = {
//...
output: {
enabledWasmLoadingTypes: ['fetch'],
},
};
## `output.environment` $#outputenvironment$
åè¯ webpack å¨çæçè¿è¡æ¶ä»£ç ä¸å¯ä»¥ä½¿ç¨åªä¸ªçæ¬ç ES ç¹æ§ã
```javascript
module.exports = {
output: {
environment: {
// The environment supports arrow functions ('() => { ... }').
arrowFunction: true,
// The environment supports BigInt as literal (123n).
bigIntLiteral: false,
// The environment supports const and let for variable declarations.
const: true,
// The environment supports destructuring ('{ a, b } = obj').
destructuring: true,
// The environment supports an async import() function to import EcmaScript modules.
dynamicImport: false,
// The environment supports 'for of' iteration ('for (const x of array) { ... }').
forOf: true,
// The environment supports ECMAScript Module syntax to import ECMAScript modules (import ... from '...').
module: false,
// The environment supports optional chaining ('obj?.a' or 'obj?.()').
optionalChaining: true,
// The environment supports template literals.
templateLiteral: true,
},
},
};
string
function (pathData, assetInfo) => string
æ¤é项å³å®äºæ¯ä¸ªè¾åº bundle çåç§°ãè¿äº bundle å°åå
¥å° output.path
é项æå®çç®å½ä¸ã
对äºå个å
¥å£
èµ·ç¹ï¼filename 伿¯ä¸ä¸ªéæåç§°ã
webpack.config.js
module.exports = {
//...
output: {
filename: 'bundle.js',
},
};
ç¶èï¼å½éè¿å¤ä¸ªå ¥å£èµ·ç¹(entry point)ãä»£ç æå(code splitting)æåç§æä»¶(plugin)å建å¤ä¸ª bundleï¼åºè¯¥ä½¿ç¨ä»¥ä¸ä¸ç§æ¿æ¢æ¹å¼ï¼æ¥èµäºæ¯ä¸ª bundle ä¸ä¸ªå¯ä¸çåç§°â¦â¦
使ç¨å ¥å£åç§°ï¼
webpack.config.js
module.exports = {
//...
output: {
filename: '[name].bundle.js',
},
};
使ç¨å é¨ chunk id
webpack.config.js
module.exports = {
//...
output: {
filename: '[id].bundle.js',
},
};
使ç¨ç±çæçå 容产çç hashï¼
webpack.config.js
module.exports = {
//...
output: {
filename: '[contenthash].bundle.js',
},
};
ç»åå¤ä¸ªæ¿æ¢ç»å使ç¨ï¼
webpack.config.js
module.exports = {
//...
output: {
filename: '[name].[contenthash].bundle.js',
},
};
使ç¨å½æ°è¿å filenameï¼
webpack.config.js
module.exports = {
//...
output: {
filename: (pathData) => {
return pathData.chunk.name === 'main' ? '[name].js' : '[name]/[name].js';
},
},
};
请确ä¿å·²é è¯»è¿ æå - ç¼å ç详ç»ä¿¡æ¯ãè¿éæ¶åæ´å¤æ¥éª¤ï¼ä¸ä» ä» æ¯è®¾ç½®æ¤é项ã
æ³¨ææ¤é项被称为æä»¶åï¼ä½æ¯ä½ è¿æ¯å¯ä»¥ä½¿ç¨å 'js/[name]/bundle.js'
è¿æ ·çæä»¶å¤¹ç»æã
注æï¼æ¤é项ä¸ä¼å½±åé£äºãæéå è½½ chunkãçè¾åºæä»¶ãå®åªå½±åæåå è½½çè¾åºæä»¶ãå¯¹äºæéå è½½ç chunk æä»¶ï¼è¯·ä½¿ç¨ output.chunkFilename
éé¡¹æ¥æ§å¶è¾åºãéè¿ loader å建çæä»¶ä¹ä¸åå½±åãå¨è¿ç§æ
åµä¸ï¼ä½ å¿
é¡»å°è¯ loader ç¹å®çå¯ç¨é项ã
å¯ä»¥ä½¿ç¨ä»¥ä¸æ¿æ¢æ¨¡æ¿å符串ï¼éè¿ webpack å
é¨çTemplatedPathPlugin
ï¼:
å¯å¨ç¼è¯å±é¢è¿è¡æ¿æ¢çå 容ï¼
æ¨¡æ¿ | æè¿° |
---|---|
[fullhash] | compilation 宿´ç hash å¼ |
[hash] | åä¸ï¼ä½å·²å¼ç¨ |
å¯å¨ chunk å±é¢è¿è¡æ¿æ¢çå 容ï¼
æ¨¡æ¿ | æè¿° |
---|---|
[id] | æ¤ chunk ç ID |
[name] | å¦æè®¾ç½®ï¼åä¸ºæ¤ chunk çåç§°ï¼å¦åä½¿ç¨ chunk ç ID |
[chunkhash] | æ¤ chunk ç hash å¼ï¼å å«è¯¥ chunk çææå ç´ |
[contenthash] | æ¤ chunk ç hash å¼ï¼åªå
æ¬è¯¥å
容类åçå
ç´ ï¼å optimization.realContentHash å½±åï¼ |
å¯å¨æ¨¡åå±é¢æ¿æ¢çå 容ï¼
æ¨¡æ¿ | æè¿° |
---|---|
[id] | 模åç ID |
[moduleid] | åä¸ï¼ä½å·²å¼ç¨ |
[hash] | 模åç Hash å¼ |
[modulehash] | åä¸ï¼ä½å·²å¼ç¨ |
[contenthash] | 模åå 容ç Hash å¼ |
å¯å¨æä»¶å±é¢æ¿æ¢çå 容ï¼
æ¨¡æ¿ | æè¿° |
---|---|
[file] | filename åè·¯å¾ï¼ä¸å« query æ fragment |
[query] | 带åç¼ ? ç query |
[fragment] | 带åç¼ # ç fragment |
[base] | åªæ filenameï¼å 嫿©å±åï¼ï¼ä¸å« path |
[filebase] | åä¸ï¼ä½å·²å¼ç¨ |
[path] | åªæ pathï¼ä¸å« filename |
[name] | åªæ filenameï¼ä¸å«æ©å±åæ path |
[ext] | 带åç¼ . çæ©å±åï¼å¯¹ output.filename ä¸å¯ç¨ï¼ |
å¯å¨ URL å±é¢æ¿æ¢çå 容ï¼
模å | æè¿° |
---|---|
[url] | URL |
[hash]
ï¼[contenthash]
æè
[chunkhash]
çé¿åº¦å¯ä»¥ä½¿ç¨ [hash:16]
ï¼é»è®¤ä¸º 20ï¼æ¥æå®ãæè
ï¼éè¿æå®output.hashDigestLength
å¨å
¨å±é
ç½®é¿åº¦ã
å½ä½ è¦å¨å®é
æä»¶åä¸ä½¿ç¨å ä½ç¬¦æ¶ï¼webpack ä¼è¿æ»¤åºéè¦æ¿æ¢çå ä½ç¬¦ãä¾å¦ï¼è¾åºä¸ä¸ªæä»¶ [name].js
ï¼ ä½ å¿
é¡»éè¿å¨æ¬å·ä¹é´æ·»å åææ æ¥è½¬ä¹[name]
å ä½ç¬¦ã å æ¤ï¼[\name\]
çæ [name]
è䏿¯ name
ã
ä¾å¦ï¼[\id\]
çæ [id]
è䏿¯ id
ã
妿å°è¿ä¸ªé项设为ä¸ä¸ªå½æ°ï¼å½æ°å°è¿åä¸ä¸ªå å«ä¸é¢è¡¨æ ¼ä¸å«ææ¿æ¢ä¿¡æ¯æ°æ®çå¯¹è±¡ã æ¿æ¢ä¹ä¼è¢«åºç¨å°è¿åçå符串ä¸ã ä¼ éç对象å°å ·æå¦ä¸ç±»åï¼åå³äºä¸ä¸æç屿§ï¼ï¼
type PathData = {
hash: string;
hashWithLength: (number) => string;
chunk: Chunk | ChunkPathData;
module: Module | ModulePathData;
contentHashType: string;
contentHash: string;
contentHashWithLength: (number) => string;
filename: string;
url: string;
runtime: string | SortableSet<string>;
chunkGraph: ChunkGraph;
};
type ChunkPathData = {
id: string | number;
name: string;
hash: string;
hashWithLength: (number) => string;
contentHash: Record<string, string>;
contentHashWithLength: Record<string, (number) => string>;
};
type ModulePathData = {
id: string | number;
hash: string;
hashWithLength: (number) => string;
};
string = 'self'
å½è¾åºä¸º library æ¶ï¼å°¤å
¶æ¯å½ libraryTarget
为 'umd'
æ¶ï¼æ¤é项å°å³å®ä½¿ç¨åªä¸ªå
¨å±å¯¹è±¡æ¥æè½½ libraryã为äºä½¿ UMD æå»ºå¨æµè§å¨å Node.js ä¸åå¯ç¨ï¼åºå° output.globalObject
é项设置为 'this'
ã对äºç±»ä¼¼ web çç®æ ï¼é»è®¤ä¸º self
ã
å
¥å£ç¹çè¿åå¼å°ä¼ä½¿ç¨ output.library.name
èµå¼ç»å
¨å±å¯¹è±¡ãä¾èµäº target
é
置项ï¼å
¨å±å¯¹è±¡å°ä¼åç对åºçæ¹åï¼ä¾å¦ï¼self
, global
æè
globalThis
ã
示ä¾ï¼
webpack.config.js
module.exports = {
// ...
output: {
library: 'myLib',
libraryTarget: 'umd',
filename: 'myLib.js',
globalObject: 'this',
},
};
string = 'hex'
å¨çæ hash æ¶ä½¿ç¨çç¼ç æ¹å¼ãæ¯æ Node.js hash.digest
çææç¼ç ã对æä»¶åä½¿ç¨ 'base64'
ï¼å¯è½ä¼åºç°é®é¢ï¼å 为 base64 åæ¯è¡¨ä¸å
·æ /
è¿ä¸ªå符(character)ãåæ ·çï¼'latin1'
è§å®å¯ä»¥å«æä»»ä½å符(character)ã
number = 20
æ£åæè¦çåç¼é¿åº¦ã
string = 'md4'
function
æ£åç®æ³ãæ¯æ Node.JS crypto.createHash
çææåè½ãä» 4.0.0-alpha2
å¼å§ï¼hashFunction
ç°å¨å¯ä»¥æ¯ä¸ä¸ªè¿åèªå®ä¹ hash çæé 彿°ãåºäºæ§è½åå ï¼ä½ å¯ä»¥æä¾ä¸ä¸ªä¸å å¯çåå¸å½æ°(non-crypto hash function)ã
module.exports = {
//...
output: {
hashFunction: require('metrohash').MetroHash64,
},
};
ç¡®ä¿ hash 彿°æå¯è®¿é®ç update
å digest
æ¹æ³ã
ä¸ä¸ªå¯éçå çå¼ï¼éè¿ Node.JS hash.update
æ¥æ´æ°åå¸ã
string = '[id].[fullhash].hot-update.js'
èªå®ä¹çæ´æ° chunk çæä»¶åãå¯éçå¼ç详ç»ä¿¡æ¯ï¼è¯·æ¥ç output.filename
é项ã
å
¶ä¸å¼å¯ä¸çå ä½ç¬¦æ¯ [id]
å [fullhash]
ï¼å
¶é»è®¤ä¸ºï¼
webpack.config.js
module.exports = {
//...
output: {
hotUpdateChunkFilename: '[id].[fullhash].hot-update.js',
},
};
string
åªå¨ target
设置为 'web'
æ¶ä½¿ç¨ï¼ç¨äºå è½½çæ´æ°(hot update)ç JSONP 彿°ã
JSONP 彿°ç¨äºå¼æ¥å è½½(async load)çæ´æ°(hot-update) chunkã
欲äºè§£è¯¦æ
ï¼è¯·æ¥é
output.chunkLoadingGlobal
ã
string = '[runtime].[fullhash].hot-update.json'
function
èªå®ä¹çæ´æ°ç主æä»¶å(main filename)ã[fullhash]
å [runtime]
åå¯ä½ä¸ºå ä½ç¬¦ã
output.iife
boolean = true
åè¯ webpack æ·»å IIFE å¤å±å 裹çæç代ç .
module.exports = {
//...
output: {
iife: true,
},
};
string = 'import'
å
é¨ import()
彿°çåç§°. å¯ç¨äº polyfilling, ä¾å¦ éè¿ dynamic-import-polyfill
.
webpack.config.js
module.exports = {
//...
output: {
importFunctionName: '__import__',
},
};
è¾åºä¸ä¸ªåºï¼ä¸ºä½ çå ¥å£å导åºã
string | string[] | object
ä¸èµ·æ¥çä¸ä¸ªç®åç示ä¾ã
webpack.config.js
module.exports = {
// â¦
entry: './src/index.js',
output: {
library: 'MyLibrary',
},
};
åè®¾ä½ å¨ src/index.js
çå
¥å£ä¸å¯¼åºäºå¦ä¸å½æ°ï¼
export function hello(name) {
console.log(`hello ${name}`);
}
æ¤æ¶ï¼åé MyLibrary
å°ä¸ä½ çå
¥å£æä»¶æå¯¼åºçæä»¶è¿è¡ç»å®ï¼ä¸é¢æ¯å¦ä½ä½¿ç¨ webpack æå»ºçåºçå®ç°ï¼
<script src="https://example.org/path/to/my-library.js"></script>
<script>
MyLibrary.hello('webpack');
</script>
å¨ä¸é¢çä¾åä¸ï¼æä»¬ä¸º entry
设置äºä¸ä¸ªå
¥å£æä»¶ï¼ç¶è webpack å¯ä»¥æ¥å å¤ä¸ªå
¥å£ï¼ä¾å¦ä¸ä¸ª array
æè
ä¸ä¸ª object
ã
å¦æä½ å° entry
设置为ä¸ä¸ª array
ï¼é£ä¹åªææ°ç»ä¸çæåä¸ä¸ªä¼è¢«æ´é²ã
module.exports = {
// â¦
entry: ['./src/a.js', './src/b.js'], // åªæå¨ b.js ä¸å¯¼åºçå
容æä¼è¢«æ´é²
output: {
library: 'MyLibrary',
},
};
å¦æä½ å° entry
设置为ä¸ä¸ª object
ï¼æä»¥å
¥å£é½å¯ä»¥éè¿ library
ç array
è¯æ³æ´é²ï¼
module.exports = {
// â¦
entry: {
a: './src/a.js',
b: './src/b.js',
},
output: {
filename: '[name].js',
library: ['MyLibrary', '[name]'], // name is a placeholder here
},
};
å设 a.js
ä¸ b.js
导åºå为 hello
ç彿°ï¼è¿å°±æ¯å¦ä½ä½¿ç¨è¿äºåºçæ¹æ³ï¼
<script src="https://example.org/path/to/a.js"></script>
<script src="https://example.org/path/to/b.js"></script>
<script>
MyLibrary.a.hello('webpack');
MyLibrary.b.hello('webpack');
</script>
æ¥ç ç¤ºä¾ è·åæ´å¤å 容ã
请注æï¼å¦æä½ æç®å¨æ¯ä¸ªå ¥å£ç¹é ç½® library é 置项çè¯ï¼ä»¥ä¸é ç½®å°ä¸è½æç §é¢ææ§è¡ãè¿éæ¯å¦ä½ 卿¯ä¸ªå ¥å£ç¹ä¸ åçæ¹æ³ï¼
module.exports = {
// â¦
entry: {
main: {
import: './src/index.js',
library: {
// `output.library` ä¸çææé
置项å¯ä»¥å¨è¿é使ç¨
name: 'MyLibrary',
type: 'umd',
umdNamedDefine: true,
},
},
another: {
import: './src/another.js',
library: {
name: 'AnotherLibrary',
type: 'commonjs2',
},
},
},
};
module.exports = {
// â¦
output: {
library: {
name: 'MyLibrary',
},
},
};
æå®åºçåç§°ã
ç±»åï¼
string | string[] | {amd?: string, commonjs?: string, root?: string | string[]}
é ç½®å°åºæ´é²çæ¹å¼ã
ç±»åï¼string
ç±»åé»è®¤å
æ¬ 'var'
ã 'module'
ã 'assign'
ã 'assign-properties'
ã 'this'
ã 'window'
ã 'self'
ã 'global'
ã 'commonjs'
ã 'commonjs2'
ã 'commonjs-module'
ã 'commonjs-static'
ã 'amd'
ã 'amd-require'
ã 'umd'
ã 'umd2'
ã 'jsonp'
以å 'system'
ï¼é¤æ¤ä¹å¤ä¹å¯ä»¥éè¿æä»¶æ·»å ã
å¯¹äºæ¥ä¸æ¥ç示ä¾ï¼æä»¬å°ä¼ä½¿ç¨ _entry_return_
表示被å
¥å£ç¹è¿åçå¼ã
These options assign the return value of the entry point (e.g. whatever the entry point exported) to the name provided by output.library.name
at whatever scope the bundle was included at.
module.exports = {
// â¦
output: {
library: {
name: 'MyLibrary',
type: 'var',
},
},
};
è®©ä½ çåºå è½½ä¹åï¼å ¥å£èµ·ç¹çè¿åå¼ å°ä¼è¢«èµå¼ç»ä¸ä¸ªåéï¼
var MyLibrary = _entry_return_;
// å¨å è½½äº `MyLibrary` çåç¬èæ¬ä¸
MyLibrary.doSomething();
module.exports = {
// â¦
output: {
library: {
name: 'MyLibrary',
type: 'assign',
},
},
};
è¿å°çæä¸ä¸ªéå«çå ¨å±åéï¼å®æå¯è½éæ°åé ä¸ä¸ªç°æçå¼ï¼è¯·è°¨æ 使ç¨ï¼ï¼
MyLibrary = _entry_return_;
请注æï¼å¦æ MyLibrary
没æå¨ä½ çåºä¹åå®ä¹ï¼é£ä¹å®å°ä¼è¢«è®¾ç½®å¨å
¨å±ä½ç¨åã
module.exports = {
// â¦
output: {
library: {
name: 'MyLibrary',
type: 'assign-properties',
},
},
};
ä¸ type: 'assign'
ç¸ä¼¼ä½æ¯æ´å®å
¨ï¼å ä¸ºå¦æ MyLibrary
å·²ç»åå¨çè¯ï¼å®å°è¢«éç¨ï¼
// ä»
å¨å½å
¶ä¸å卿¯å建 MyLibrary
MyLibrary = typeof MyLibrary === 'undefined' ? {} : MyLibrary;
// ç¶åå¤å¶è¿åå¼å° MyLibrary
// ä¸ Object.assign è¡ä¸ºç±»ä¼¼
// ä¾å¦ï¼ä½ åä¸é¢è¿æ ·å¨ä½ çå
¥å£å¯¼åºä¸ä¸ª `hello` 彿°
export function hello(name) {
console.log(`Hello ${name}`);
}
// å¨å¦å¤ä¸ä¸ªå·²ç»å è½½ MyLibrary çèæ¬ä¸
// ä½ å¯ä»¥åè¿æ ·è¿è¡ `hello` 彿°
MyLibrary.hello('World');
è¿äºé
置项åé
å
¥å£ç¹çè¿åå¼ï¼ä¾å¦ï¼æ 论å
¥å£ç¹å¯¼åºçä»ä¹å
容ï¼å°ä¸ä¸ªå为 output.library.name
ç对象ä¸ã
module.exports = {
// â¦
output: {
library: {
name: 'MyLibrary',
type: 'this',
},
},
};
å
¥å£èµ·ç¹çè¿åå¼ å°ä¼è¢«èµå¼ç» this 对象ä¸ç output.library.name
屿§ãthis
çå«ä¹åå³äºä½ ï¼
this['MyLibrary'] = _entry_return_;
// å¨ä¸ä¸ªåç¬çèæ¬ä¸
this.MyLibrary.doSomething();
MyLibrary.doSomething(); // 妿 `this` 为 window 对象
module.exports = {
// â¦
output: {
library: {
name: 'MyLibrary',
type: 'window',
},
},
};
å
¥å£èµ·ç¹çè¿åå¼ å°ä¼è¢«èµå¼ç» window
对象ä¸ç output.library.name
ã
window['MyLibrary'] = _entry_return_;
window.MyLibrary.doSomething();
module.exports = {
// â¦
output: {
library: {
name: 'MyLibrary',
type: 'global',
},
},
};
å
¥å£èµ·ç¹çè¿åå¼ å°ä¼è¢«å¤å¶ç»å
¨å±å¯¹è±¡ä¸ç output.library.name
ãåå³äº target
å¼ï¼å
¨å±å¯¹è±¡å¯ä»¥å嫿¹å,ä¾å¦ï¼self
ãglobal
æè
globalThis
ã
global['MyLibrary'] = _entry_return_;
global.MyLibrary.doSomething();
module.exports = {
// â¦
output: {
library: {
name: 'MyLibrary',
type: 'commonjs',
},
},
};
å
¥å£èµ·ç¹çè¿åå¼ å°ä½¿ç¨ output.library.name
èµå¼ç» exports
对象ã顾åæä¹ï¼è¿æ¯å¨ CommonJS ç¯å¢ä¸ä½¿ç¨ã
exports['MyLibrary'] = _entry_return_;
require('MyLibrary').doSomething();
è¿äºé
置项å°çæä¸ä¸ªå¸¦æå®æ´ header ç bundleï¼ä»¥ç¡®ä¿ä¸åç§æ¨¡åç³»ç»å
¼å®¹ãoutput.library.name
é
置项å¨ä¸åç output.library.type
䏿ä¸åçå«ä¹ã
module.exports = {
// â¦
experiments: {
outputModule: true,
},
output: {
library: {
// do not specify a `name` here
type: 'module',
},
},
};
è¾åº ES 模åã
ç¶èè¯¥ç¹æ§ä»ç¶æ¯å®éªæ§çï¼å¹¶ä¸æ²¡æå®å ¨æ¯æï¼æä»¥è¯·ç¡®ä¿äºå å¯ç¨ experiments.outputModuleã餿¤ä¹å¤ï¼ä½ å¯ä»¥å¨ è¿é 追踪å¼åè¿åº¦ã
module.exports = {
// â¦
output: {
library: {
// note there's no `name` here
type: 'commonjs2',
},
},
};
å
¥å£èµ·ç¹çè¿åå¼ å°ä¼è¢«èµå¼ç» module.exports
ã顾åæä¹ï¼è¿æ¯å¨ Node.jsï¼CommonJSï¼ç¯å¢ä¸ä½¿ç¨çï¼
module.exports = _entry_return_;
require('MyLibrary').doSomething();
妿æä»¬æå® output.library.name
为 type: commmonjs2
ï¼ä½ çå
¥å£èµ·ç¹çè¿åå¼å°ä¼è¢«èµå¼ç» module.exports.[output.library.name]
ã
module.exports = {
// â¦
output: {
library: {
// note there's no `name` here
type: 'commonjs-static',
},
},
};
å个导åºå°è¢«è®¾ç½®ä¸º module.exports
ä¸ç屿§ãåç§°ä¸ç "static" æ¯æè¾åºæ¯éæå¯åæçï¼å æ¤å
·å导åºå¯ä»¥éè¿ Node.js 导å
¥å° ESM ä¸ï¼
è¾å ¥ï¼
export function doSomething() {}
è¾åºï¼
function doSomething() {}
// â¦
exports.doSomething = __webpack_exports__.doSomething;
Consumption (CommonJS):
const { doSomething } = require('./output.cjs'); // doSomething => [Function: doSomething]
Consumption (ESM):
import { doSomething } from './output.cjs'; // doSomething => [Function: doSomething]
å¯ä»¥å°ä½ çåºæ´é²ä¸º AMD 模åã
AMD module è¦æ±å
¥å£ chunkï¼ä¾å¦ï¼ç¬¬ä¸ä¸ªéè¿ <script>
æ ç¾å è½½çèæ¬ï¼ä½¿ç¨ç¹å®ç屿§æ¥å®ä¹, ä¾å¦ define
ä¸ require
ï¼è¿éå¸¸ç± RequireJS æä»»ä½å
¼å®¹ç loaderï¼å¦ almondï¼æä¾ãå¦åï¼ç´æ¥å 载产çç AMD bundle å°å¯¼è´ä¸ä¸ªé误ï¼å¦ define is not defined
ã
æç §ä¸é¢çé ç½®
module.exports = {
//...
output: {
library: {
name: 'MyLibrary',
type: 'amd',
},
},
};
çæçè¾åºå°è¢«å®ä¹ä¸º "MyLibrary"
ï¼ä¾å¦ï¼
define('MyLibrary', [], function () {
return _entry_return_;
});
该 bundle å¯ä»¥ä½¿ç¨ script æ ç¾å¼å ¥ï¼å¹¶ä¸å¯ä»¥è¢«è¿æ ·å¼å ¥ï¼
require(['MyLibrary'], function (MyLibrary) {
// Do something with the library...
});
å¦ææ²¡æå®ä¹ output.library.name
çè¯ï¼ä¼çæä»¥ä¸å
容ã
define(function () {
return _entry_return_;
});
å¦æä½¿ç¨ä¸ä¸ª <script>
æ ç¾ç´æ¥å è½½ãå®åªè½éè¿ RequireJS å
¼å®¹ç弿¥æ¨¡å loader éè¿æä»¶çå®é
è·¯å¾å·¥ä½ï¼æä»¥å¨è¿ç§æ
åµä¸ï¼å¦æ output.path
ä¸ output.filename
ç´æ¥å¨æå¡ç«¯æ´é²ï¼é£ä¹å¯¹äºè¿ç§ç¹æ®è®¾ç½®å¯è½ä¼åå¾å¾éè¦ã
module.exports = {
//...
output: {
library: {
name: 'MyLibrary',
type: 'amd-require',
},
},
};
å®ä¼ç¨ä¸ä¸ªç«å³æ§è¡ç AMD require(dependencies, factory)
å
è£
卿¥æå
è¾åºã
'amd-require'
ç±»åå
è®¸ä½¿ç¨ AMD çä¾èµï¼èä¸éè¦åç¬çåç»è°ç¨ãä¸ 'amd'
ç±»å䏿 ·ï¼è¿åå³äºå¨å è½½ webpack è¾åºçç¯å¢ä¸éå½ç require
彿° æ¯å¦å¯ç¨ã
使ç¨è¯¥ç±»åçè¯ï¼ä¸è½ä½¿ç¨åºçåç§°ã
è¿å°å¨æææ¨¡åå®ä¹ä¸æ´é²ä½ çåº, å 许å®ä¸ CommonJSãAMD åä½ä¸ºå ¨å±åéå·¥ä½ãå¯ä»¥æ¥ç UMD Repository è·åæ´å¤å 容ã
å¨è¿ç§æ
åµä¸ï¼ä½ éè¦ä½¿ç¨ library.name
屿§å½åä½ çæ¨¡åï¼
module.exports = {
//...
output: {
library: {
name: 'MyLibrary',
type: 'umd',
},
},
};
æç»çè¾åºä¸ºï¼
(function webpackUniversalModuleDefinition(root, factory) {
if (typeof exports === 'object' && typeof module === 'object')
module.exports = factory();
else if (typeof define === 'function' && define.amd) define([], factory);
else if (typeof exports === 'object') exports['MyLibrary'] = factory();
else root['MyLibrary'] = factory();
})(global, function () {
return _entry_return_;
});
请注æï¼æ ¹æ® 对象èµå¼é¨åï¼çç¥ library.name
å°å¯¼è´å
¥å£èµ·ç¹è¿åçææå±æ§ç´æ¥èµå¼ç»æ ¹å¯¹è±¡ã示ä¾ï¼
module.exports = {
//...
output: {
libraryTarget: 'umd',
},
};
è¾åºå°ä¼æ¯ï¼
(function webpackUniversalModuleDefinition(root, factory) {
if (typeof exports === 'object' && typeof module === 'object')
module.exports = factory();
else if (typeof define === 'function' && define.amd) define([], factory);
else {
var a = factory();
for (var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];
}
})(global, function () {
return _entry_return_;
});
ä½ å¯ä»¥ä¸º library.name
æå®ä¸ä¸ªå¯¹è±¡ï¼æ¯ä¸ªç®æ çåç§°ä¸åï¼
module.exports = {
//...
output: {
library: {
name: {
root: 'MyLibrary',
amd: 'my-library',
commonjs: 'my-common-library',
},
type: 'umd',
},
},
};
è¿å°ä¼æä½ çåºæ´é²ä¸ºä¸ä¸ª System.register
模åãè¿ä¸ªç¹æ§æåæ¯å¨ webpack 4.30.0 ä¸åå¸ã
System 模åè¦æ±å½ webpack bundle æ§è¡æ¶ï¼å
¨å±åé System
åºç°å¨æµè§å¨ä¸ãç¼è¯ç System.register
æ ¼å¼å
è®¸ä½ å¨æ²¡æé¢å¤é
ç½®çæ
åµä¸ä½¿ç¨ System.import('/bundle.js')
ï¼å¹¶å°ä½ ç webpack bundle å è½½å°ç³»ç»æ¨¡å注å表ä¸ã
module.exports = {
//...
output: {
library: {
type: 'system',
},
},
};
è¾åºï¼
System.register([], function (__WEBPACK_DYNAMIC_EXPORT__, __system_context__) {
return {
execute: function () {
// ...
},
};
});
é¤äºè®¾ç½® output.library.type
为 system
ï¼è¿è¦å° output.library.name
æ·»å å°é
ç½®ä¸ï¼è¾åºç bundle å°ä»¥åºåä½ä¸º System.register
çåæ°ï¼
System.register(
'MyLibrary',
[],
function (__WEBPACK_DYNAMIC_EXPORT__, __system_context__) {
return {
execute: function () {
// ...
},
};
}
);
module.exports = {
// â¦
output: {
library: {
name: 'MyLibrary',
type: 'jsonp',
},
},
};
è¿å°æå ¥å£èµ·ç¹çè¿åå¼å è£ å° jsonp å è£ å¨ä¸ã
MyLibrary(_entry_return_);
ä½ çåºçä¾èµå°ç± externals
é
ç½®å®ä¹ã
æå®åªä¸ä¸ªå¯¼åºåºè¯¥è¢«æ´é²ä¸ºä¸ä¸ªåºã
string | string[]
é»è®¤ä¸º undefined
ï¼å°ä¼å¯¼åºæ´ä¸ªï¼å½å空é´ï¼å¯¹è±¡ãä¸é¢çä¾åæ¼ç¤ºäºä½¿ç¨ output.library.type: 'var'
é
置项产ççä½ç¨ã
module.exports = {
output: {
library: {
name: 'MyLibrary',
type: 'var',
export: 'default',
},
},
};
å ¥å£èµ·ç¹çé»è®¤å¯¼åºå°ä¼è¢«èµå¼ä¸ºåºåç§°ï¼
// 妿å
¥å£æä¸ä¸ªé»è®¤å¯¼åº
var MyLibrary = _entry_return_.default;
ä½ ä¹å¯ä»¥å output.library.export
ä¼ éä¸ä¸ªæ°ç»ï¼å®å°è¢«è§£æä¸ºä¸ä¸ªè¦åé
ç»åºåçæ¨¡åçè·¯å¾ï¼
module.exports = {
output: {
library: {
name: 'MyLibrary',
type: 'var',
export: ['default', 'subModule'],
},
},
};
è¿éå°±æ¯åºä»£ç ï¼
var MyLibrary = _entry_return_.default.subModule;
å¨ UMD å è£ å¨ä¸æ·»å 注éã
string | { amd?: string, commonjs?: string, commonjs2?: string, root?: string }
为æ¯ä¸ª umd
ç±»åæå
¥ç¸åçæ³¨éï¼å° auxiliaryComment
设置为 stringã
module.exports = {
// â¦
mode: 'development',
output: {
library: {
name: 'MyLibrary',
type: 'umd',
auxiliaryComment: 'Test Comment',
},
},
};
è¿å°äº§ç以ä¸ç»æï¼
(function webpackUniversalModuleDefinition(root, factory) {
//Test Comment
if (typeof exports === 'object' && typeof module === 'object')
module.exports = factory();
//Test Comment
else if (typeof define === 'function' && define.amd) define([], factory);
//Test Comment
else if (typeof exports === 'object') exports['MyLibrary'] = factory();
//Test Comment
else root['MyLibrary'] = factory();
})(self, function () {
return _entry_return_;
});
对äºç»ç²åº¦æ§å¶ï¼å¯ä»¥ä¼ éä¸ä¸ªå¯¹è±¡ï¼
module.exports = {
// â¦
mode: 'development',
output: {
library: {
name: 'MyLibrary',
type: 'umd',
auxiliaryComment: {
root: 'Root Comment',
commonjs: 'CommonJS Comment',
commonjs2: 'CommonJS2 Comment',
amd: 'AMD Comment',
},
},
},
};
boolean
å½ä½¿ç¨ output.library.type: "umd"
æ¶ï¼å° output.library.umdNamedDefine
设置为 true
å°ä¼æ AMD 模åå½å为 UMD æå»ºãå¦å使ç¨å¿å define
ã
module.exports = {
//...
output: {
library: {
name: 'MyLibrary',
type: 'umd',
umdNamedDefine: true,
},
},
};
AMD module å°ä¼æ¯è¿æ ·ï¼
define('MyLibrary', [], factory);
string
[string]
éè¿é
ç½® libraryTarget
å³å®æ´é²åªäºæ¨¡åãé»è®¤æ
åµä¸ä¸º undefined
ï¼å¦æä½ å° libraryTarget
设置为空å符串ï¼åä¸é»è®¤æ
åµå
·æç¸åçè¡ä¸ºãä¾å¦ï¼å¦æè®¾ç½®ä¸º ''
ï¼å°å¯¼åºæ´ä¸ªï¼å½å空é´ï¼å¯¹è±¡ãä¸è¿° demo æ¼ç¤ºäºå½è®¾ç½® libraryTarget: 'var'
æ¶çææã
æ¯æä»¥ä¸é ç½®ï¼
libraryExport: 'default'
- å
¥å£çé»è®¤å¯¼åºå°åé
ç» library targetï¼
// if your entry has a default export of `MyDefaultModule`
var MyDefaultModule = _entry_return_.default;
libraryExport: 'MyModule'
- è¿ä¸ª ç¡®å®ç模å å°è¢«åé
ç» library targetï¼
var MyModule = _entry_return_.MyModule;
libraryExport: ['MyModule', 'MySubModule']
- æ°ç»å°è¢«è§£æä¸ºè¦åé
ç» library target ç æ¨¡åè·¯å¾ï¼
var MySubModule = _entry_return_.MyModule.MySubModule;
使ç¨ä¸è¿°æå®ç libraryExport
é
ç½®æ¶ï¼library çç»æå¯ä»¥è¿æ ·ä½¿ç¨ï¼
MyDefaultModule.doSomething();
MyModule.doSomething();
MySubModule.doSomething();
output.libraryTarget
string = 'var'
é
ç½®å¦ä½æ´é² libraryãå¯ä»¥ä½¿ç¨ä¸é¢çé项ä¸çä»»æä¸ä¸ªã注æï¼æ¤é项ä¸åé
ç» output.library
çå¼ä¸å使ç¨ã对äºä¸é¢çææç¤ºä¾ï¼é½åå®å° output.library
çå¼é
置为 MyLibrary
ã
è¿äºé项å°å
¥å£èµ·ç¹çè¿åå¼ï¼ä¾å¦ï¼å
¥å£èµ·ç¹çä»»ä½å¯¼åºå¼ï¼ï¼å¨ bundle å
æå¼å
¥çä½ç½®ï¼èµå¼ç» output.library
æä¾çåéåã
å½ library å è½½å®æï¼å ¥å£èµ·ç¹çè¿åå¼å°åé ç»ä¸ä¸ªåéï¼
var MyLibrary = _entry_return_;
// å¨ä¸ä¸ªåç¬ç script...
MyLibrary.doSomething();
è¿å°äº§çä¸ä¸ªéå«çå ¨å±åéï¼å¯è½ä¼æ½å¨å°éæ°åé å°å ¨å±ä¸å·²åå¨çå¼ï¼è°¨æ 使ç¨ï¼ï¼
MyLibrary = _entry_return_;
注æï¼å¦æ MyLibrary
å¨ä½ç¨å䏿ªå¨åé¢ä»£ç è¿è¡å®ä¹ï¼åä½ ç library å°è¢«è®¾ç½®å¨å
¨å±ä½ç¨åå
ã
å¦æç®æ 对象åå¨ï¼åå°è¿åå¼ copy å°ç®æ 对象ï¼å¦åå åå»ºç®æ 对象ï¼
// 妿ä¸åå¨çè¯å°±åå»ºç®æ 对象
MyLibrary = typeof MyLibrary === 'undefined' ? {} : MyLibrary;
// ç¶åå¤å¶è¿åå¼å° MyLibrary
// ä¸ Object.assign è¡ä¸ºç±»ä¼¼
// ä¾å¦ï¼ä½ å¨å
¥å£å¯¼åºäºä¸ä¸ª `hello` 彿°
export function hello(name) {
console.log(`Hello ${name}`);
}
// å¨å¦ä¸ä¸ªèæ¬ä¸è¿è¡ MyLibrary
// ä½ å¯ä»¥åè¿æ ·è¿è¡ `hello` 彿°
MyLibrary.hello('World');
è¿äºé项å°å
¥å£èµ·ç¹çè¿åå¼ï¼ä¾å¦ï¼å
¥å£èµ·ç¹çä»»ä½å¯¼åºå¼ï¼èµå¼ç»ä¸ä¸ªç¹å®å¯¹è±¡ç屿§ï¼æ¤åç§°ç± output.library
å®ä¹ï¼ä¸ã
妿 output.library
æªèµå¼ä¸ºä¸ä¸ªé空å符串ï¼åé»è®¤è¡ä¸ºæ¯ï¼å°å
¥å£èµ·ç¹è¿åçææå±æ§é½èµå¼ç»ä¸ä¸ªå¯¹è±¡ï¼æ¤å¯¹è±¡ç± output.libraryTarget
ç¹å®ï¼ï¼éè¿å¦ä¸ä»£ç çæ®µï¼
(function (e, a) {
for (var i in a) {
e[i] = a[i];
}
})(output.libraryTarget, _entry_return_);
å
¥å£èµ·ç¹çè¿åå¼å°åé
ç» this çä¸ä¸ªå±æ§ï¼æ¤åç§°ç± output.library
å®ä¹ï¼ä¸ï¼this
çå«ä¹åå³äºä½ ï¼
this['MyLibrary'] = _entry_return_;
// å¨ä¸ä¸ªåç¬ç script...
this.MyLibrary.doSomething();
MyLibrary.doSomething(); // 妿 this æ¯ window
å
¥å£èµ·ç¹çè¿åå¼å°ä½¿ç¨ output.library
ä¸å®ä¹çå¼ï¼åé
ç» window
对象çè¿ä¸ªå±æ§ä¸ã
window['MyLibrary'] = _entry_return_;
window.MyLibrary.doSomething();
å
¥å£èµ·ç¹çè¿åå¼å°ä½¿ç¨ output.library
ä¸å®ä¹çå¼ï¼åé
ç» global
对象çè¿ä¸ªå±æ§ä¸ã
global['MyLibrary'] = _entry_return_;
global.MyLibrary.doSomething();
å
¥å£èµ·ç¹çè¿åå¼å°ä½¿ç¨ output.library
ä¸å®ä¹çå¼ï¼åé
ç» exports 对象ãè¿ä¸ªåç§°ä¹æå³çï¼æ¨¡åç¨äº CommonJS ç¯å¢ï¼
exports['MyLibrary'] = _entry_return_;
require('MyLibrary').doSomething();
è¿äºé项å°ä½¿å¾ bundle å¸¦ææ´å®æ´ç模å头ï¼ä»¥ç¡®ä¿ä¸åç§æ¨¡åç³»ç»çå
¼å®¹æ§ãæ ¹æ® output.libraryTarget
é项ä¸åï¼output.library
é项å°å
·æä¸åçå«ä¹ã
è¾åº ES 模åã请确ä¿äºå å¯ç¨ experiments.outputModuleã
éè¦æ³¨æçæ¯ï¼è¯¥åè½è¿æªå®å ¨æ¯æï¼è¯·å¨æ¤å¤è·è¿è¿åº¦ã
å
¥å£èµ·ç¹çè¿åå¼å°åé
ç» module.exports
对象ãè¿ä¸ªåç§°ä¹æå³ç模åç¨äº CommonJS ç¯å¢ï¼
module.exports = _entry_return_;
require('MyLibrary').doSomething();
注æï¼output.library
ä¸è½ä¸ output.libraryTarget
ä¸èµ·ä½¿ç¨ï¼å
·ä½åå 请åç
§æ¤ issueã
å°ä½ ç library æ´é²ä¸º AMD 模åã
AMD 模åè¦æ±å
¥å£ chunkï¼ä¾å¦ä½¿ç¨ <script>
æ ç¾å è½½ç第ä¸ä¸ªèæ¬ï¼éè¿ç¹å®ç屿§å®ä¹ï¼ä¾å¦ define
å require
ï¼å®ä»¬éå¸¸ç± RequireJS æä»»ä½å
¼å®¹ç模åå è½½å¨æä¾ï¼ä¾å¦ almondï¼ãå¦åï¼ç´æ¥å è½½çæç AMD bundle å°å¯¼è´æ¥éï¼å¦ define is not defined
ã
é ç½®å¦ä¸ï¼
module.exports = {
//...
output: {
library: 'MyLibrary',
libraryTarget: 'amd',
},
};
çæç output åç§°å°è¢«å®ä¹ä¸º "MyLibrary"ï¼
define('MyLibrary', [], function () {
return _entry_return_;
});
å¯ä»¥å¨ script æ ç¾ä¸ï¼å° bundle ä½ä¸ºä¸ä¸ªæ¨¡åæ´ä½å¼å ¥ï¼å¹¶ä¸å¯ä»¥åè¿æ ·è°ç¨ bundleï¼
require(['MyLibrary'], function (MyLibrary) {
// Do something with the library...
});
妿 output.library
æªå®ä¹ï¼å°ä¼çæä»¥ä¸å
容ã
define([], function () {
return _entry_return_;
});
å¦æç´æ¥å è½½ <script>
æ ç¾ï¼æ¤ bundle æ æ³æé¢æè¿è¡ï¼æè
æ ¹æ¬æ æ³æ£å¸¸è¿è¡ï¼å¨ almond loader ä¸ï¼ãåªè½éè¿æä»¶çå®é
è·¯å¾ï¼å¨ RequireJS å
¼å®¹ç弿¥æ¨¡åå è½½å¨ä¸è¿è¡ï¼å æ¤å¨è¿ç§æ
åµä¸ï¼å¦æè¿äºè®¾ç½®ç´æ¥æ´é²å¨æå¡å¨ä¸ï¼é£ä¹ output.path
å output.filename
对äºè¿ä¸ªç¹å®ç设置å¯è½åå¾å¾éè¦ã
è¿å°ä½¿ç¨ç«å³æ§è¡ç AMD require(dependencies, factory)
å
è£
å¨å
è£
æ¨çè¾åºã
'amd-require'
ç®æ ï¼targetï¼å
è®¸ä½¿ç¨ AMD ä¾èµé¡¹ï¼èæ éåç¬çåç»è°ç¨ãä¸ 'amd'
ç®æ ï¼targetï¼ä¸æ ·, è¿åå³äºå¨å è½½ webpack è¾åºçç¯å¢ä¸éå½å¯ç¨ç require
functionã
å¯¹äºæ¤ targetï¼åºåç§°å°è¢«å¿½ç¥ã
å°ä½ ç library æ´é²ä¸ºææç模åå®ä¹ä¸é½å¯è¿è¡çæ¹å¼ãå®å°å¨ CommonJS, AMD ç¯å¢ä¸è¿è¡ï¼æå°æ¨¡å导åºå° global ä¸çåéãäºè§£æ´å¤è¯·æ¥ç UMD ä»åºã
å¨è¿ä¸ªä¾åä¸ï¼ä½ éè¦ library
屿§æ¥å½åä½ çæ¨¡åï¼
module.exports = {
//...
output: {
library: 'MyLibrary',
libraryTarget: 'umd',
},
};
æç»çè¾åºç»æä¸ºï¼
(function webpackUniversalModuleDefinition(root, factory) {
if (typeof exports === 'object' && typeof module === 'object')
module.exports = factory();
else if (typeof define === 'function' && define.amd) define([], factory);
else if (typeof exports === 'object') exports['MyLibrary'] = factory();
else root['MyLibrary'] = factory();
})(typeof self !== 'undefined' ? self : this, function () {
return _entry_return_;
});
注æï¼çç¥ library
ä¼å¯¼è´å°å
¥å£èµ·ç¹è¿åçææå±æ§ï¼ç´æ¥èµå¼ç» root 对象ï¼å°±å对象åé
ç« èãä¾å¦ï¼
module.exports = {
//...
output: {
libraryTarget: 'umd',
},
};
è¾åºç»æå¦ä¸ï¼
(function webpackUniversalModuleDefinition(root, factory) {
if (typeof exports === 'object' && typeof module === 'object')
module.exports = factory();
else if (typeof define === 'function' && define.amd) define([], factory);
else {
var a = factory();
for (var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];
}
})(typeof self !== 'undefined' ? self : this, function () {
return _entry_return_;
});
ä» webpack 3.1.0 å¼å§ï¼ä½ å¯ä»¥å° library
æå®ä¸ºä¸ä¸ªå¯¹è±¡ï¼ç¨äºç»æ¯ä¸ª target èµ·ä¸åçåç§°ï¼
module.exports = {
//...
output: {
library: {
root: 'MyLibrary',
amd: 'my-library',
commonjs: 'my-common-library',
},
libraryTarget: 'umd',
},
};
è¿å°æ´é²ä½ ç library ä½ä¸ºä¸ä¸ªç± System.register
çæ¨¡åãæ¤ç¹æ§é¦æ¬¡åå¸äº webpack 4.30.0ã
å½ webpack bundle 被æ§è¡æ¶ï¼ç³»ç»æ¨¡åä¾èµå
¨å±çåé System
ãç¼è¯ä¸º System.register
å½¢å¼åï¼ä½ å¯ä»¥ä½¿ç¨ System.import('/bundle.js')
èæ éé¢å¤é
ç½®ï¼å¹¶ä¼å°ä½ ç webpack bundle å
å è½½å°ç³»ç»æ¨¡å注å表ä¸ã
module.exports = {
//...
output: {
libraryTarget: 'system',
},
};
è¾åºï¼
System.register([], function (_export) {
return {
setters: [],
execute: function () {
// ...
},
};
});
é¤äºå° output.libraryTarget
设置为 system
ä¹å¤ï¼è¿å¯å° output.library
æ·»å å°é
ç½®ä¸ï¼è¾åº bundle ç library åå°ä½ä¸º System.register
çåæ°ï¼
System.register('my-library', [], function (_export) {
return {
setters: [],
execute: function () {
// ...
},
};
});
ä½ å¯ä»¥éè¿ __system_context__
è®¿é® SystemJS contextï¼
// è®°å½å½åç³»ç»æ¨¡åç URL
console.log(__system_context__.meta.url);
// 导å
¥ä¸ä¸ªç³»ç»æ¨¡åï¼éè¿å°å½åçç³»ç»æ¨¡åç url ä½ä¸º parentUrl
__system_context__.import('./other-file.js').then((m) => {
console.log(m);
});
è¿å°æå ¥å£èµ·ç¹çè¿åå¼ï¼å 裹å°ä¸ä¸ª jsonp å è£ å®¹å¨ä¸
MyLibrary(_entry_return_);
ä½ ç library çä¾èµå°ç± externals
é
ç½®å®ä¹ã
boolean = false
以模åç±»åè¾åº JavaScript æä»¶ãç±äºæ¤åè½è¿å¤äºå®éªé¶æ®µï¼é»è®¤ç¦ç¨ã
å½å¯ç¨æ¶ï¼webpack ä¼å¨å
é¨å° output.iife
设置为 false
ï¼å° output.scriptType
为 'module'
ï¼å¹¶å° terserOptions.module
设置为 true
å¦æä½ éè¦ä½¿ç¨ webpack æå»ºä¸ä¸ªåºä»¥ä¾å«äººä½¿ç¨ï¼å½ output.module
为 true
æ¶ï¼ä¸å®è¦å° output.libraryTarget
设置为 'module'
ã
module.exports = {
//...
experiments: {
outputModule: true,
},
output: {
module: true,
},
};
string = path.join(process.cwd(), 'dist')
output ç®å½å¯¹åºä¸ä¸ªç»å¯¹è·¯å¾ã
webpack.config.js
const path = require('path');
module.exports = {
//...
output: {
path: path.resolve(__dirname, 'dist/assets'),
},
};
注æï¼[fullhash]
å¨åæ°ä¸è¢«æ¿æ¢ä¸ºç¼è¯è¿ç¨(compilation)ç hashã详ç»ä¿¡æ¯è¯·æ¥çæå - ç¼åã
boolean=true
string: 'verbose'
åç¥ webpack å¨ bundle ä¸å¼å
¥ãæå
嫿¨¡åä¿¡æ¯ãçç¸å
³æ³¨éãæ¤éé¡¹å¨ development
æ¨¡å¼æ¶çé»è®¤å¼ä¸º true
ï¼èå¨ production
æ¨¡å¼æ¶çé»è®¤å¼ä¸º false
ãå½å¼ä¸º 'verbose'
æ¶ï¼ä¼æ¾ç¤ºæ´å¤ä¿¡æ¯ï¼å¦ exportï¼è¿è¡æ¶ä¾èµä»¥å bailoutsã
webpack.config.js
module.exports = {
//...
output: {
pathinfo: true,
},
};
Type:
function
string
targets 设置为 web
ä¸ web-worker
æ¶ output.publicPath
é»è®¤ä¸º 'auto'
ï¼æ¥ç 该æå è·åå
¶ç¨ä¾
å¯¹äºæéå è½½(on-demand-load)æå è½½å¤é¨èµæº(external resources)ï¼å¦å¾çãæä»¶çï¼æ¥è¯´ï¼output.publicPath æ¯å¾éè¦çé项ã妿æå®äºä¸ä¸ªé误çå¼ï¼åå¨å è½½è¿äºèµæºæ¶ä¼æ¶å° 404 é误ã
æ¤é项æå®å¨æµè§å¨ä¸æå¼ç¨çãæ¤è¾åºç®å½å¯¹åºçå
¬å¼ URLããç¸å¯¹ URL(relative URL) ä¼è¢«ç¸å¯¹äº HTML 页é¢ï¼æ <base>
æ ç¾ï¼è§£æãç¸å¯¹äºæå¡ç URL(Server-relative URL)ï¼ç¸å¯¹äºåè®®ç URL(protocol-relative URL) æç»å¯¹ URL(absolute URL) ä¹å¯æ¯å¯è½ç¨å°çï¼æè
ææ¶å¿
é¡»ç¨å°ï¼ä¾å¦ï¼å½å°èµæºæç®¡å° CDN æ¶ã
该é项ç弿¯ä»¥ runtime(è¿è¡æ¶) æ loader(è½½å
¥æ¶) æåå»ºçæ¯ä¸ª URL çåç¼ãå æ¤ï¼å¨å¤æ°æ
åµä¸ï¼æ¤é项çå¼é½ä¼ä»¥ /
ç»æã
è§åå¦ä¸ï¼output.path
ä¸ç URL 以 HTML 页é¢ä¸ºåºåã
webpack.config.js
const path = require('path');
module.exports = {
//...
output: {
path: path.resolve(__dirname, 'public/assets'),
publicPath: 'https://cdn.example.com/assets/',
},
};
对äºè¿ä¸ªé ç½®ï¼
webpack.config.js
module.exports = {
//...
output: {
publicPath: '/assets/',
chunkFilename: '[id].chunk.js',
},
};
对äºä¸ä¸ª chunk 请æ±ï¼çèµ·æ¥åè¿æ · /assets/4.chunk.js
ã
对äºä¸ä¸ªè¾åº HTML ç loader å¯è½ä¼åè¿æ ·è¾åºï¼
<link href="/assets/spinner.gif" />
æè å¨å è½½ CSS çä¸ä¸ªå¾çæ¶ï¼
background-image: url(/assets/spinner.gif);
webpack-dev-server ä¹ä¼é»è®¤ä» publicPath
为åºåï¼ä½¿ç¨å®æ¥å³å®å¨åªä¸ªç®å½ä¸å¯ç¨æå¡ï¼æ¥è®¿é® webpack è¾åºçæä»¶ã
注æï¼åæ°ä¸ç [fullhash]
å°ä¼è¢«æ¿æ¢ä¸ºç¼è¯è¿ç¨(compilation) ç hashã详ç»ä¿¡æ¯è¯·æ¥çæå - ç¼åã
示ä¾ï¼
module.exports = {
//...
output: {
// One of the below
publicPath: 'auto', // It automatically determines the public path from either `import.meta.url`, `document.currentScript`, `<script />` or `self.location`.
publicPath: 'https://cdn.example.com/assets/', // CDNï¼æ»æ¯ HTTPS åè®®ï¼
publicPath: '//cdn.example.com/assets/', // CDNï¼åè®®ç¸åï¼
publicPath: '/assets/', // ç¸å¯¹äºæå¡(server-relative)
publicPath: 'assets/', // ç¸å¯¹äº HTML 页é¢
publicPath: '../assets/', // ç¸å¯¹äº HTML 页é¢
publicPath: '', // ç¸å¯¹äº HTML 页é¢ï¼ç®å½ç¸åï¼
},
};
å¨ç¼è¯æ¶(compile time)æ æ³ç¥éè¾åºæä»¶ç publicPath
çæ
åµä¸ï¼å¯ä»¥ç空ï¼ç¶åå¨å
¥å£æä»¶(entry file)å¤ä½¿ç¨èªç±åé(free variable) __webpack_public_path__
ï¼ä»¥ä¾¿å¨è¿è¡æ¶(runtime)è¿è¡å¨æè®¾ç½®ã
__webpack_public_path__ = myRuntimePublicPath;
// åºç¨ç¨åºå
¥å£çå
¶ä»é¨å
æå
³ __webpack_public_path__
çæ´å¤ä¿¡æ¯ï¼è¯·æ¥çæ¤è®¨è®ºã
string: 'module' | 'text/javascript'
boolean = false
è¿ä¸ªé
置项å
许使ç¨èªå®ä¹ script ç±»åå è½½å¼æ¥ chunkï¼ä¾å¦ <script type="module" ...>
ã
module.exports = {
//...
output: {
scriptType: 'module',
},
};
string = '[file].map[query]'
ä»
å¨ devtool
设置为 'source-map'
æ¶ææï¼æ¤é项ä¼å硬çåå
¥ä¸ä¸ªè¾åºæä»¶ã
å¯ä»¥ä½¿ç¨ #output-filename ä¸ç [name]
, [id]
, [hash]
å [chunkhash]
æ¿æ¢ç¬¦å·ã餿¤ä¹å¤ï¼è¿å¯ä»¥ä½¿ç¨ Template strings å¨ Filename-level 䏿¿æ¢ã
string = ''
ä¿®æ¹è¾åº bundle 䏿¯è¡çåç¼ã
webpack.config.js
module.exports = {
//...
output: {
sourcePrefix: '\t',
},
};
æç § ES Module è§èå¤ç module å è½½æ¶çé误ï¼ä¼ææ§è½æå¤±ã
boolean
module.exports = {
//...
output: {
strictModuleErrorHandling: true,
},
};
boolean = false
妿ä¸ä¸ªæ¨¡åæ¯å¨ require
æ¶æåºå¼å¸¸ï¼åè¯ webpack 仿¨¡åå®ä¾ç¼å(require.cache
)ä¸å é¤è¿ä¸ªæ¨¡åã
åºäºæ§è½åå ï¼é»è®¤ä¸º false
ã
å½è®¾ç½®ä¸º false
æ¶ï¼è¯¥æ¨¡åä¸ä¼ä»ç¼åä¸å é¤ï¼è¿å°é æä»
å¨ç¬¬ä¸æ¬¡ require
è°ç¨æ¶æåºå¼å¸¸ï¼ä¼å¯¼è´ä¸ node.js ä¸å
¼å®¹ï¼ã
ä¾å¦ï¼è®¾æ³ä¸ä¸ module.js
ï¼
throw new Error('error');
å° strictModuleExceptionHandling
设置为 false
ï¼åªæç¬¬ä¸ä¸ª require
æåºå¼å¸¸ï¼
// with strictModuleExceptionHandling = false
require('module'); // <- æåº
require('module'); // <- 䏿åº
ç¸åï¼å° strictModuleExceptionHandling
设置为 true
ï¼è¿ä¸ªæ¨¡åææç require
齿åºå¼å¸¸ï¼
// with strictModuleExceptionHandling = true
require('module'); // <- æåº
require('module'); // <- ä»ç¶æåº
boolean = false
string
object
æ§å¶ Trusted Types å
¼å®¹æ§ãå¯ç¨æ¶ï¼webpack å°æ£æµ Trusted Types æ¯æï¼å¦ææ¯æï¼åä½¿ç¨ Trusted Types çç¥å建å®å¨æå è½½çèæ¬ urlãå½åºç¨ç¨åºå¨ require-trusted-types-for
å
容å®å
¨çç¥æä»¤ä¸è¿è¡æ¶ä½¿ç¨ã
é»è®¤ä¸º false
ï¼ä¸å
¼å®¹ï¼èæ¬ URL 为å符串ï¼ã
true
æ¶ï¼webpack å°ä¼ä½¿ç¨ output.uniqueName
ä½ä¸º Trusted Types çç¥åç§°ãpolicyName
屿§ãwebpack.config.js
module.exports = {
//...
output: {
//...
trustedTypes: {
policyName: 'my-application#webpack',
},
},
};
boolean
å½ä½¿ç¨ libraryTarget: "umd"
æ¶ï¼è®¾ç½® output.umdNamedDefine
为 true
å°å½åç± UMD æå»ºç AMD 模åãå¦åå°ä½¿ç¨ä¸ä¸ªå¿åç define
ã
module.exports = {
//...
output: {
umdNamedDefine: true,
},
};
string
å¨å
¨å±ç¯å¢ä¸ä¸ºé²æ¢å¤ä¸ª webpack è¿è¡æ¶ å²çªæä½¿ç¨çå¯ä¸åç§°ãé»è®¤ä½¿ç¨ output.library
åç§°æè
ä¸ä¸æä¸ç package.json
ç å
åç§°(package name)ï¼ å¦æä¸¤è
é½ä¸åå¨ï¼å¼ä¸º ''
ã
output.uniqueName
å°ç¨äºçæå¯ä¸å
¨å±åé:
webpack.config.js
module.exports = {
// ...
output: {
uniqueName: 'my-package-xyz',
},
};
boolean = false
string
æ¤é项ç¨äºè®¾ç½®å è½½ WebAssembly 模åçæ¹å¼ãé»è®¤å¯ä½¿ç¨çæ¹å¼æ 'fetch'
ï¼web/WebWorkerï¼ï¼'async-node'
ï¼Node.jsï¼ï¼å
¶ä»é¢å¤æ¹å¼å¯ç±æä»¶æä¾ã
å
¶é»è®¤å¼ä¼æ ¹æ® target
çååèååï¼
target
设置为 'web'
ï¼'webworker'
ï¼'electron-renderer'
æ 'node-webkit'
å
¶ä¸ä¹ä¸ï¼å
¶é»è®¤å¼ä¸º 'fetch'
ãtarget
设置为 'node'
ï¼'async-node'
ï¼'electron-main'
æ 'electron-preload'
ï¼å
¶é»è®¤å¼ä¸º 'async-node'
ãmodule.exports = {
//...
output: {
wasmLoading: 'fetch',
},
};
output.workerChunkLoading
string: 'require' | 'import-scripts' | 'async-node' | 'import' | 'universal'
boolean: false
æ°é项 workerChunkLoading
ç¨äºæ§å¶ workder ç chunk å è½½ã
webpack.config.js
module.exports = {
//...
output: {
workerChunkLoading: false,
},
};