æ¬ç« èæ¶µçäºä½¿ç¨ webpack ç¼è¯ä»£ç çæææ¹æ³ãå¨ webpack æå åºç¨ç¨åºæ¶ï¼ä½ å¯ä»¥éæ©åç§æ¨¡åè¯æ³é£æ ¼ï¼å æ¬ ES6ï¼CommonJS å AMDã
尽管 webpack æ¯æå¤ç§æ¨¡åè¯æ³ï¼ä½æä»¬è¿æ¯å»ºè®®å°½é使ç¨ä¸è´çè¯æ³ï¼ä»¥æ¤é¿å
ä¸äºå¥æªçè¡ä¸ºå bugãäºå®ä¸ï¼å½è·ç¦»æè¿ç package.json æä»¶ä¸å
å«å¼ä¸º "module" æ "commonjs" ç "type" åæ®µæ¶ï¼webpack ä¼å¯ç¨è¯æ³ä¸è´æ§æ£æ¥ã请大家å¨é
读åï¼æ³¨ææ¤æ
åµï¼
package.json ä¸ä¸º .mjs æ .js 设置 "type": "module"requireï¼module.exports æ exportsimport './src/App.mjs'ï¼èé import './src/App'ï¼ä½ å¯ä»¥éè¿è®¾ç½® Rule.resolve.fullySpecified æ¥ç¦ç¨æ¤è§å)package.json ä¸ä¸º .cjs æ .js 设置 "type": "commonjs"import å export åä¸å¯ç¨package.json ä¸ä¸º .wasm 设置 "type": "module"webpack 2 æ¯æåçç ES6 模åè¯æ³ï¼æå³çä½ æ é¡»é¢å¤å¼å
¥ babel è¿æ ·çå·¥å
·ï¼å°±å¯ä»¥ä½¿ç¨ import å exportã使¯æ³¨æï¼å¦æä½¿ç¨å
¶ä»ç ES6+ ç¹æ§ï¼ä»ç¶éè¦å¼å
¥ babelãwebpack æ¯æä»¥ä¸çæ¹æ³ï¼
éè¿ import 以éæçæ¹å¼å¯¼å
¥å¦ä¸ä¸ªéè¿ export 导åºç模åã
import MyModule from './my-module.js';
import { NamedExport } from './other-module.js';ä½ ä¹éè¿ import æ¥å¼å
¥ Data URIï¼
import 'data:text/javascript;charset=utf-8;base64,Y29uc29sZS5sb2coJ2lubGluZSAxJyk7';
import {
number,
fn,
} from 'data:text/javascript;charset=utf-8;base64,ZXhwb3J0IGNvbnN0IG51bWJlciA9IDQyOwpleHBvcnQgY29uc3QgZm4gPSAoKSA9PiAiSGVsbG8gd29ybGQiOw==';é»è®¤å¯¼åºæ´ä¸ªæ¨¡åæå
·åå¯¼åºæ¨¡åã
// å
·å导åº
export var Count = 5;
export function Multiply(a, b) {
return a * b;
}
// é»è®¤å¯¼åº
export default {
// Some data...
};function(string path):Promise
卿çå 载模åãè°ç¨ import çä¹å¤ï¼è¢«è§ä¸ºåå²ç¹ï¼æææ¯ï¼è¢«è¯·æ±ç模ååå®å¼ç¨çææå模åï¼ä¼åå²å°ä¸ä¸ªåç¬ç chunk ä¸ã
if (module.hot) {
import('lodash').then((_) => {
// Do something with lodash (a.k.a '_')...
});
}ä¸è½ä½¿ç¨å®å
¨å¨æç import è¯å¥ï¼ä¾å¦ import(foo)ãæ¯å 为 foo å¯è½æ¯ç³»ç»æé¡¹ç®ä¸ä»»ä½æä»¶çä»»ä½è·¯å¾ã
import() å¿
é¡»è³å°å
å«ä¸äºå
³äºæ¨¡åçè·¯å¾ä¿¡æ¯ãæå
å¯ä»¥éå®äºä¸ä¸ªç¹å®çç®å½ææä»¶éï¼ä»¥ä¾¿äºå¨ä½¿ç¨å¨æè¡¨è¾¾å¼æ¶ - å
æ¬å¯è½å¨ import() è°ç¨ä¸è¯·æ±çæ¯ä¸ªæ¨¡åãä¾å¦ï¼ import(`./locale/${language}.json`) 伿 .locale ç®å½ä¸çæ¯ä¸ª .json æä»¶æå
å°æ°ç chunk ä¸ãå¨è¿è¡æ¶ï¼è®¡ç®å®åé language åï¼å°±å¯ä»¥ä½¿ç¨å english.json æ german.json ç任使件ã
// æ³è±¡æä»¬æä¸ä¸ªä» cookies æå
¶ä»åå¨ä¸è·åè¯è¨çæ¹æ³
const language = detectVisitorLanguage();
import(`./locale/${language}.json`).then((module) => {
// do something with the translations
});å èæ³¨é使è¿ä¸ç¹æ§å¾ä»¥å®ç°ãéè¿å¨ import 䏿·»å 注éï¼æä»¬å¯ä»¥è¿è¡è¯¸å¦ç» chunk å½åæéæ©ä¸å模å¼çæä½ã
// åä¸ªç®æ
import(
/* webpackChunkName: "my-chunk-name" */
/* webpackMode: "lazy" */
/* webpackExports: ["default", "named"] */
'module'
);
// å¤ä¸ªå¯è½çç®æ
import(
/* webpackInclude: /\.json$/ */
/* webpackExclude: /\.noimport\.json$/ */
/* webpackChunkName: "my-chunk-name" */
/* webpackMode: "lazy" */
/* webpackPrefetch: true */
/* webpackPreload: true */
`./locale/${language}`
);import(/* webpackIgnore: true */ 'ignored-module.js');webpackIgnoreï¼è®¾ç½®ä¸º true æ¶ï¼ç¦ç¨å¨æå¯¼å
¥è§£æã
webpackChunkName: æ° chunk çåç§°ã ä» webpack 2.6.0 å¼å§ï¼å ä½ç¬¦ [index] å [request] å嫿¯æéå¢çæ°åæå®é
çè§£ææä»¶åã æ·»å æ¤æ³¨éåï¼å°åç¬çç»æä»¬ç chunk å½å为 [my-chunk-name].js è䏿¯ [id].jsã
webpackModeï¼ä» webpack 2.6.0 å¼å§ï¼å¯ä»¥æå®ä»¥ä¸åçæ¨¡å¼è§£æå¨æå¯¼å
¥ãæ¯æä»¥ä¸é项ï¼
'lazy' (é»è®¤å¼)ï¼ä¸ºæ¯ä¸ª import() 导å
¥ç模åçæä¸ä¸ªå¯å»¶è¿å è½½ï¼lazy-loadableï¼ç chunkã'lazy-once'ï¼çæä¸ä¸ªå¯ä»¥æ»¡è¶³ææ import() è°ç¨çå个å¯å»¶è¿å è½½ï¼lazy-loadableï¼ç chunkãæ¤ chunk å°å¨ç¬¬ä¸æ¬¡ import() æ¶è°ç¨æ¶è·åï¼éåç import() å使ç¨ç¸åçç½ç»ååºã注æï¼è¿ç§æ¨¡å¼ä»
å¨é¨å卿è¯å¥ä¸ææä¹ï¼ä¾å¦ import(`./locales/${language}.json`)ï¼å
¶ä¸å¯è½å«æå¤ä¸ªè¢«è¯·æ±ç模åè·¯å¾ã'eager'ï¼ä¸ä¼çæé¢å¤ç chunkãææçæ¨¡åé½è¢«å½åç chunk å¼å
¥ï¼å¹¶ä¸æ²¡æé¢å¤çç½ç»è¯·æ±ã使¯ä»ä¼è¿åä¸ä¸ª resolved ç¶æç Promiseãä¸éæå¯¼å
¥ç¸æ¯ï¼å¨è°ç¨ import() 宿ä¹åï¼è¯¥æ¨¡åä¸ä¼è¢«æ§è¡ã'weak'ï¼å°è¯å 载模åï¼å¦æè¯¥æ¨¡å彿°å·²ç»ä»¥å
¶ä»æ¹å¼å è½½ï¼ï¼å³å¦ä¸ä¸ª chunk 导å
¥è¿æ¤æ¨¡åï¼æå
嫿¨¡åçèæ¬è¢«å è½½ï¼ãä»ä¼è¿å Promiseï¼ ä½æ¯åªæå¨å®¢æ·ç«¯ä¸å·²ç»æè¯¥ chunk æ¶æä¼æåè§£æãå¦æè¯¥æ¨¡åä¸å¯ç¨ï¼åè¿å rejected ç¶æç Promiseï¼ä¸ç½ç»è¯·æ±æ°¸è¿é½ä¸ä¼æ§è¡ãå½éè¦ç chunks å§ç»å¨ï¼åµå
¥å¨é¡µé¢ä¸çï¼åå§è¯·æ±ä¸æå¨æä¾ï¼è䏿¯å¨åºç¨ç¨åºå¯¼èªå¨æå没ææä¾ç模å导å
¥çæ
åµä¸è§¦åï¼è¿å¯¹äºéç¨æ¸²æï¼SSRï¼æ¯é常æç¨çãwebpackPrefetchï¼åè¯æµè§å¨å°æ¥å¯è½éè¦è¯¥èµæºæ¥è¿è¡æäºå¯¼èªè·³è½¬ãæ¥çæåï¼äºè§£æå
³æ´å¤ä¿¡æ¯ how webpackPrefetch worksã
webpackPreloadï¼åè¯æµè§å¨å¨å½åå¯¼èªæé´å¯è½éè¦è¯¥èµæºã æ¥é
æåï¼äºè§£æå
³çæ´å¤ä¿¡æ¯ how webpackPreload worksã
webpackIncludeï¼å¨å¯¼å
¥è§£æï¼import resolutionï¼è¿ç¨ä¸ï¼ç¨äºå¹é
çæ£å表达å¼ãåªæå¹é
å°ç模åæä¼è¢«æå
ã
webpackExcludeï¼å¨å¯¼å
¥è§£æï¼import resolutionï¼è¿ç¨ä¸ï¼ç¨äºå¹é
çæ£å表达å¼ãææå¹é
å°ç模åé½ä¸ä¼è¢«æå
ã
webpackExports: åç¥ webpack åªæå»ºæå®åºå£ç卿 import() 模åãå®å¯ä»¥åå° chunk ç大å°ãä» webpack 5.0.0-beta.18 èµ·å¯ç¨ã
CommonJS çç®æ æ¯ä¸ºæµè§å¨ä¹å¤ç JavaScript æå®ä¸ä¸ªçæç³»ç»ãwebpack æ¯æä»¥ä¸ CommonJS çæ¹æ³ï¼
requirerequire(dependency: String);ä»¥åæ¥çæ¹å¼æ£ç´¢å ¶ä»æ¨¡åç导åºãç¼è¯å¨ï¼compilerï¼ä¼ç¡®ä¿ä¾èµé¡¹å¨è¾åº bundle ä¸å¯ç¨ã
var $ = require('jquery');
var myModule = require('my-module');ä¹å¯ä»¥ä¸º require å¯ç¨éæ³æ³¨éï¼è¯·åé
module.parser.javascript.commonjsMagicComments äºè§£æ´å¤ã
require.resolve(dependency: String);ä»¥åæ¥çæ¹å¼è·å模åç IDãç¼è¯å¨ï¼compilerï¼ä¼ç¡®ä¿ä¾èµé¡¹å¨æç»è¾åº bundle ä¸å¯ç¨ã建议å°å
¶è§ä¸ºä¸éæå¼ï¼åªè½ä¸ require.cache[id] æ __webpack_require__(id) é
å使ç¨ï¼æå¥½é¿å
è¿ç§ç¨æ³ï¼ã
æå
³æ´å¤æ¨¡åçä¿¡æ¯ï¼è¯¦è§ module.idã
å¤å¤å¼ç¨å䏿¨¡åï¼æç»åªä¼äº§ç䏿¬¡æ¨¡åæ§è¡å䏿¬¡å¯¼åºãæä»¥ï¼ä¼å¨è¿è¡æ¶ï¼runtimeï¼ä¸ä¼ä¿åä¸ä»½ç¼åãå 餿¤ç¼åï¼åä¼äº§çæ°çæ¨¡åæ§è¡åæ°ç导åºã
var d1 = require('dependency');
require('dependency') === d1;
delete require.cache[require.resolve('dependency')];
require('dependency') !== d1;// in file.js
require.cache[module.id] === module;
require('./file.js') === module.exports;
delete require.cache[module.id];
require.cache[module.id] === undefined;
require('./file.js') !== module.exports; // çè®ºä¸æ¯ä¸ç¸ççï¼å®é
è¿è¡ä¸ï¼åä¼å¯¼è´å æ æº¢åº
require.cache[module.id] !== module;require.ensure(
dependencies: String[],
callback: function(require),
errorCallback: function(error),
chunkName: String
)ç»å® dependencies åæ°ï¼å°å
¶å¯¹åºçæä»¶æåå°ä¸ä¸ªåç¬ç bundle ä¸ï¼æ¤ bundle ä¼è¢«å¼æ¥å è½½ãå½ä½¿ç¨ CommonJS 模åè¯æ³æ¶ï¼è¿æ¯å¨æå è½½ä¾èµé¡¹çå¯ä¸æ¹æ³ãè¿æå³çï¼å¯ä»¥å¨æ¨¡åæ§è¡æ¶æå
许代ç ï¼åªæå¨æ»¡è¶³ç¹å®æ¡ä»¶æ¶æä¼å è½½ dependenciesã
var a = require('normal-dep');
if (module.hot) {
require.ensure(['b'], function (require) {
var c = require('c');
// Do something special...
});
}æç
§ä¸é¢æå®ç顺åºï¼require.ensure æ¯æä»¥ä¸åæ°ï¼
dependenciesï¼å符串æ°ç»ï¼å£°æ callback åè°å½æ°ä¸æéè¦çæææ¨¡åãcallbackï¼å½ä¾èµé¡¹å è½½å®æåï¼webpack å°ä¼æ§è¡æ¤å½æ°ï¼require 彿°çå®ç°ï¼ä½ä¸ºåæ°ä¼ å
¥æ¤å½æ°ä¸ãå½ç¨åºè¿è¡éè¦ä¾èµæ¶ï¼å¯ä»¥ä½¿ç¨ require() æ¥å è½½ä¾èµã彿°ä½å¯ä»¥ä½¿ç¨æ¤åæ°ï¼æ¥è¿ä¸æ¥æ§è¡ require() 模åãerrorCallbackï¼å½ webpack å è½½ä¾èµå¤±è´¥æ¶ä¼æ§è¡æ¤å½æ°ãchunkNameï¼ç± require.ensure å建ç chunk çåç§°ãéè¿å°ç¸å chunkName ä¼ éç»ä¸åç require.ensure è°ç¨ï¼æä»¬å¯ä»¥å°å
¶ä»£ç åå¹¶å°ä¸ä¸ªåç¬ç chunk ä¸ï¼ä»èåªäº§çä¸ä¸ªæµè§å¨å¿
é¡»å è½½ç bundleãAMDï¼Asynchronous Module Definitionï¼æ¯ä¸ç§å®ä¹äºç¨äºç¼ååå è½½æ¨¡åæ¥å£ç JavaScript è§èã
define([name: String], [dependencies: String[]], factoryMethod: function(...))妿æä¾äº dependencies åæ°ï¼å°±ä¼è°ç¨ factoryMethod æ¹æ³ï¼å¹¶ï¼ä»¥ç¸åç顺åºï¼å¯¼åºæ¯ä¸ªä¾èµé¡¹ãå¦ææªæä¾ dependencies åæ°ï¼è°ç¨ factoryMethod æ¹æ³æ¶ä¼ä¼ å
¥ require , exports å moduleï¼ç¨äºå
¼å®¹ï¼ï¼ãå¦ææ¤æ¹æ³è¿åä¸ä¸ªå¼ï¼åè¿åå¼ä¼ä½ä¸ºæ¤æ¨¡åç导åºãç±ç¼è¯å¨ï¼compilerï¼æ¥ç¡®ä¿ä¾èµé¡¹å¨æç»è¾åºç bundle ä¸å¯ç¨ã
define(['jquery', 'my-module'], function ($, myModule) {
// ä½¿ç¨ $ å myModule åä¸äºæä½...
// 导åºä¸ä¸ªå½æ°
return function doSomething() {
// ...
};
});define(value: !Function)è¿ç§æ¹å¼åªå°æä¾ç value 导åºãè¿éç value å¯ä»¥æ¯é¤å½æ°ä»¥å¤çä»»ä½å¼ã
define({
answer: 42,
});require(dependencies: String[], [callback: function(...)])ä¸ require.ensure 类似ï¼ç»å® dependencies åæ°ï¼å°å
¶å¯¹åºçæä»¶æåå°ä¸ä¸ªåç¬ç bundle ä¸ï¼æ¤ bundle ä¼è¢«å¼æ¥å è½½ãç¶åä¼è°ç¨ callback åè°å½æ°ï¼å¹¶ä¼ å
¥ dependencies æ°ç»ä¸çæ¯ä¸ªé¡¹å¯¼åºã
require(['b'], function (b) {
var c = require('c');
});webpack å
ç½®ç LabeledModulesPlugin æä»¶ï¼å
è®¸ä½ ä½¿ç¨ä¸é¢çæ¹æ³å¯¼åºå导å
¥æ¨¡åï¼
导åºç»å®ç valueãæ ç¾å¯ä»¥åºç°å¨å½æ°å£°ææåé声æä¹åã彿°åæåé忝坼åºå¼çæ è¯ç¬¦ã
export: var answer = 42;
export: function method(value) {
// Do something...
};å¨å½åä½ç¨åä¸ï¼ä¾èµé¡¹çææå¯¼åºåå¯ç¨ãrequire æ ç¾å¯ä»¥æ¾ç½®å¨ä¸ä¸ªå符串ä¹åãä¾èµæ¨¡åå¿
é¡»ä½¿ç¨ export æ ç¾å¯¼åºå¼ãCommonJS æ AMD æ¨¡åæ æ³éè¿è¿ç§æ¹å¼ä½¿ç¨ã
some-dependency.js
export: var answer = 42;
export: function method(value) {
// Do something...
};require: 'some-dependency';
console.log(answer);
method(...);é¤äºä¸è¿°æ¨¡åè¯æ³ä¹å¤ï¼è¿å 许使ç¨ä¸äº webpack ç¹å®çæ¹æ³ï¼
require.context(
(directory: String),
(includeSubdirs: Boolean) /* å¯éçï¼é»è®¤å¼æ¯ true */,
(filter: RegExp) /* å¯éçï¼é»è®¤å¼æ¯ /^\.\/.*$/ï¼æææä»¶ */,
(mode: String) /* å¯éçï¼ 'sync' | 'eager' | 'weak' | 'lazy' | 'lazy-once'ï¼é»è®¤å¼æ¯ 'sync' */
)æå®ä¸ç³»åä¾èµé¡¹ï¼éè¿ä½¿ç¨ directory çè·¯å¾ï¼ä»¥å includeSubdirs ï¼filter é项ï¼è¿è¡æ´ç»ç²åº¦ç模åå¼å
¥ï¼ä½¿ç¨ mode å®ä¹å è½½æ¹å¼ã以æ¤å¯ä»¥å¾å®¹æçè§£ææ¨¡åï¼
var context = require.context('components', true, /\.html$/);
var componentA = context.resolve('componentA');妿 mode 设置为 lazyï¼åºç¡æ¨¡åå°ä»¥å¼æ¥æ¹å¼å è½½ï¼
var context = require.context('locales', true, /\.json$/, 'lazy');
context('localeA').then((locale) => {
// do something with locale
});mode çå¯ç¨æ¨¡å¼å说æç宿´åè¡¨å¨ import() ææ¡£ä¸è¿è¡äºæè¿°ã
require.include((dependency: String));å¼å
¥ä¸ä¸ªä¸éè¦æ§è¡ç dependencyï¼è¿æ ·å¯ä»¥ç¨äºä¼åè¾åº chunk ä¸ä¾èµæ¨¡åçä½ç½®ã
require.include('a');
require.ensure(['a', 'b'], function (require) {
/* ... */
});
require.ensure(['a', 'c'], function (require) {
/* ... */
});è¿ä¼äº§ç以ä¸è¾åºï¼
file.js and abcä¸ä½¿ç¨ require.include('a')ï¼è¾åºç两个å¿å chunk é½ä¼ææ¨¡å aã
ä¸ require.resolve 类似ï¼ä½æ¯ä¸ä¼æ module å¼å
¥å° bundle ä¸ãè¿å°±æ¯æè°çâå¼±ï¼weakï¼âä¾èµã
if (__webpack_modules__[require.resolveWeak('module')]) {
// 彿¨¡åå¯ç¨æ¶ï¼æ§è¡ä¸äºæä½â¦â¦
}
if (require.cache[require.resolveWeak('module')]) {
// 卿¨¡åå è½½å®æä¹åï¼æ§è¡ä¸äºæä½â¦â¦
}
// ä½ å¯ä»¥åæ§è¡å
¶ä» require/import æ¹æ³ä¸æ ·ï¼
// æ§è¡å¨æè§£æä¸ä¸æ resolves ("context")ã
const page = 'Foo';
__webpack_modules__[require.resolveWeak(`./page/${page}`)];å¦ææ¨¡åæºç å 嫿 æ³éæåæç requireï¼åä¼ååºå ³é®ä¾èµé¡¹è¦åã
示ä¾ä»£ç ï¼
someFn(require);
require.bind(null);
require(variable);