Brief Analysis of Web Packing Codes
Come to the point
1. Packing a single module
webpack.config.js
module.exports = {
entry:"./chunk1.js",
output: {
path: __dirname + '/dist',
filename: '[name].js'
},
};
chunk1.js
var chunk1=1;
exports.chunk1=chunk1;
After packaging, main. JS (some comments generated by webpack have been removed)
(function(modules) { // webpackBootstrap
// The module cache
var installedModules = {};
// The require function
function __webpack_require__(moduleId) {
// Check if module is in cache
if(installedModules[moduleId])
return installedModules[moduleId].exports;
// Create a new module (and put it into the cache)
var module = installedModules[moduleId] = {
exports: {},
id: moduleId,
loaded: false
};
// Execute the module function
modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
// Flag the module as loaded
module.loaded = true;
// Return the exports of the module
return module.exports;
}
// expose the modules object (__webpack_modules__)
__webpack_require__.m = modules;
// expose the module cache
__webpack_require__.c = installedModules;
// __webpack_public_path__
__webpack_require__.p = "";
// Load entry module and return exports
return __webpack_require__(0);
})([function(module, exports) {
var chunk1=1;
exports.chunk1=chunk1;
}]);
This is actually an immediate execution function, simplified as follows:
(function(module){})([function(){},function(){}]);
OK, take a look at what's going on inside the self-running anonymous function:
function(modules) { // webpackBootstrap
// Modules are arrays, elements are function bodies, modules we declare
var installedModules = {};
// The require function
function __webpack_require__(moduleId) {
...
}
// expose the modules object (__webpack_modules__)
__webpack_require__.m = modules;
// expose the module cache
__webpack_require__.c = installedModules;
// __webpack_public_path__
__webpack_require__.p = "";
// Load entry module and return exports
return __webpack_require__(0);
}
The whole function declares a variable installedModules and a function _webpack_require_ and adds an m,c,p attribute to the function. The m attribute stores the incoming module array, the C attribute stores the installedModules variable, and the P is an empty string. Finally, the _webpack_require_ function is executed with zero parameters and the execution result is returned. Let's look at what _webpack_require_ does:
function __webpack_require__(moduleId) {
//moduleId is the 0 that the call is passed in.
// Installed Modules [0] is undefined, go on
if(installedModules[moduleId])
return installedModules[moduleId].exports;
// module is {exports: {},id: 0,loaded: false}
var module = installedModules[moduleId] = {
exports: {},
id: moduleId,
loaded: false
};
// Next, I'll analyze this.
modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
// Indicates that the module has been loaded
module.loaded = true;
// Return module.exports (note that module.exports will be modified when modules[moduleId].call)
return module.exports;
}
Next, take a look at modules [moduleId]. call (module. exports, module. exports, webpack_require), which is actually
modules[moduleId].call({}, module, module.exports, __webpack_require__)
Understanding calls can certainly be considered like this (but not equivalent, call ensures that when this is used in a module, this is directed to module.exports):
function a(module, exports) {
var chunk1=1;
exports.chunk1=chunk1;
}
a(module, exports,__webpack_require__);
The module passed in is {exports: {},id: 0,loaded: false}, exports is {}, _webpack_require_ is the declared _webpack_require_ function (what's the use of passing in this function, section 2 will introduce);
After running module.exports is {chunk1:1}. So when we use the chunk1 module (such as var chunk1=require("chunk1"), we get an object {chunk1:1}. If there is no exports.chunk1=chunk1 or module.exports=chunk1 in the module, you get an empty object {}
2. Use modules
Now that we have analyzed how webpack packages a module (the entry file is a module), let's look at using a module and then using the module file as the entry file.
webpack.config.js
module.exports = {
entry:"./main.js",
output: {
path: __dirname + '/dist',
filename: '[name].js'
}
};
main.js
var chunk1=require("./chunk1");
console.log(chunk1);
After packing
(function (modules) { // webpackBootstrap
// The module cache
var installedModules = {};
// The require function
function __webpack_require__(moduleId) {
// Check if module is in cache
if (installedModules[moduleId])
return installedModules[moduleId].exports;
// Create a new module (and put it into the cache)
var module = installedModules[moduleId] = {
exports: {},
id: moduleId,
loaded: false
};
// Execute the module function
modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
// Flag the module as loaded
module.loaded = true;
// Return the exports of the module
return module.exports;
}
// expose the modules object (__webpack_modules__)
__webpack_require__.m = modules;
// expose the module cache
__webpack_require__.c = installedModules;
// __webpack_public_path__
__webpack_require__.p = "";
// Load entry module and return exports
return __webpack_require__(0);
})([function (module, exports, __webpack_require__) {
var chunk1=__webpack_require__(1);
console.log(chunk1);
}, function (module, exports) {
var chunk1 = 1;
exports.chunk1 = chunk1;
}]);
The difference is that the parameters of the self-executing function are
[function(module, exports) { var chunk1=1; exports.chunk1=chunk1;}]
Turn into
[function (module, exports, __webpack_require__) {
var chunk1=__webpack_require__(1);
console.log(chunk1);
}, function (module, exports) {
var chunk1 = 1;
exports.chunk1 = chunk1;
}]
In fact, there is an additional main module, but this module does not export items, and this module relies on chunk1 module. So when running _webpack_require_ (0), main module is cached on installedModules[0], module [0]. call (that is, call main module), chunk1 is cached on installedModules[1], and export object {chunk1:1} to module main to use.
3. Reuse module
webpack.config.js
module.exports = {
entry:"./main.js",
output: {
path: __dirname + '/dist',
filename: '[name].js'
}
};
main.js
var chunk1=require("./chunk1");
var chunk2=require(".chunlk2");
console.log(chunk1);
console.log(chunk2);
chunk1.js
var chunk2=require("./chunk2");
var chunk1=1;
exports.chunk1=chunk1;
chunk2.js
var chunk2=1;
exports.chunk2=chunk2;
After packing
(function (modules) { // webpackBootstrap
// The module cache
var installedModules = {};
// The require function
function __webpack_require__(moduleId) {
// Check if module is in cache
if (installedModules[moduleId])
return installedModules[moduleId].exports;
// Create a new module (and put it into the cache)
var module = installedModules[moduleId] = {
exports: {},
id: moduleId,
loaded: false
};
// Execute the module function
modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
// Flag the module as loaded
module.loaded = true;
// Return the exports of the module
return module.exports;
}
// expose the modules object (__webpack_modules__)
__webpack_require__.m = modules;
// expose the module cache
__webpack_require__.c = installedModules;
// __webpack_public_path__
__webpack_require__.p = "";
// Load entry module and return exports
return __webpack_require__(0);
})([function (module, exports, __webpack_require__) {
var chunk1 = __webpack_require__(1);
var chunk2 = __webpack_require__(2);
console.log(chunk1);
console.log(chunk2);
}, function (module, exports, __webpack_require__) {
__webpack_require__(2);
var chunk1 = 1;
exports.chunk1 = chunk1;
}, function (module, exports) {
var chunk2 = 1;
exports.chunk2 = chunk2;
}]);
It's not hard to find that when you need to reuse modules, the cached variable installedModules works.
4. Multiple Packaging Entrances
Whether it's a single module or a duplicate module, it's the same as the two above.
5. Entry parameters are arrays
webpack.config.js
module.exports = {
entry:['./main.js','./main1.js'],
output: {
path: __dirname + '/dist',
filename: '[name].js'
}
};
After packing
[
/* 0 */
/***/ function(module, exports, __webpack_require__) {
__webpack_require__(1);
module.exports = __webpack_require__(3);
/***/ },
/* 1 */
/***/ function(module, exports, __webpack_require__) {
var chunk1=__webpack_require__(2);
console.log(chunk1);
/***/ },
/* 2 */
/***/ function(module, exports) {
var chunk1=1;
exports.chunk1=chunk1;
/***/ },
/* 3 */
/***/ function(module, exports, __webpack_require__) {
var chunk1=__webpack_require__(2);
/***/ }
/******/ ]
Here, only the parameters that execute anonymous functions are intercepted, because other code is the same as before. You can see that mainsilent module, chunk1 module, 3 mian1 module, 0's function is to run the module mian,mian1, and then export the main1 module (there is no export item in main1, so to export {}). Summarize: the entry parameter is a string whether multiple or single entry, and finally export the export item of the entry module, and export {} without exporting item, and then export {} without exporting item. If the entry parameter is an array, the last module will be exported.
6. Use the Commons Chunk Plugin plug-in
webpack.config.js
var CommonsChunkPlugin = require("webpack/lib/optimize/CommonsChunkPlugin");
module.exports = {
entry: {
main: './main.js',
main1: './main1.js',
},
output: {
path: __dirname + '/dist',
filename: '[name].js'
},
plugins: [
new CommonsChunkPlugin({
name: "common"
})
]
};
Chunk1 is require d in main mian1, so chunk1 is packaged into common.
After packaging, common.js
(function (modules) { // webpackBootstrap
// install a JSONP callback for chunk loading
var parentJsonpFunction = window["webpackJsonp"];
window["webpackJsonp"] = function webpackJsonpCallback(chunkIds, moreModules) {
// add "moreModules" to the modules object,
// then flag all "chunkIds" as loaded and fire callback
var moduleId, chunkId, i = 0, callbacks = [];
for (; i < chunkIds.length; i++) {
chunkId = chunkIds[i];
if (installedChunks[chunkId])
callbacks.push.apply(callbacks, installedChunks[chunkId]);
installedChunks[chunkId] = 0;
}
for (moduleId in moreModules) {
modules[moduleId] = moreModules[moduleId];
}
if (parentJsonpFunction) parentJsonpFunction(chunkIds, moreModules);
while (callbacks.length)
callbacks.shift().call(null, __webpack_require__);
if (moreModules[0]) {
installedModules[0] = 0;
return __webpack_require__(0);
}
};
// The module cache
var installedModules = {};
// object to store loaded and loading chunks
// "0" means "already loaded"
// Array means "loading", array contains callbacks
var installedChunks = {
2: 0
};
// The require function
function __webpack_require__(moduleId) {
// Check if module is in cache
if (installedModules[moduleId])
return installedModules[moduleId].exports;
// Create a new module (and put it into the cache)
var module = installedModules[moduleId] = {
exports: {},
id: moduleId,
loaded: false
};
// Execute the module function
modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
// Flag the module as loaded
module.loaded = true;
// Return the exports of the module
return module.exports;
}
// This file contains only the entry chunk.
// The chunk loading function for additional chunks
__webpack_require__.e = function requireEnsure(chunkId, callback) {
// "0" is the signal for "already loaded"
if (installedChunks[chunkId] === 0)
return callback.call(null, __webpack_require__);
// an array means "currently loading".
if (installedChunks[chunkId] !== undefined) {
installedChunks[chunkId].push(callback);
} else {
// start chunk loading
installedChunks[chunkId] = [callback];
var head = document.getElementsByTagName('head')[0];
var script = document.createElement('script');
script.type = 'text/javascript';
script.charset = 'utf-8';
script.async = true;
script.src = __webpack_require__.p + "" + chunkId + "." + ({ "0": "main", "1": "main1" }[chunkId] || chunkId) + ".js";
head.appendChild(script);
}
};
// expose the modules object (__webpack_modules__)
__webpack_require__.m = modules;
// expose the module cache
__webpack_require__.c = installedModules;
// __webpack_public_path__
__webpack_require__.p = "";
})([, function (module, exports) {
var chunk1 = 1;
exports.chunk1 = chunk1;
}]);
main.js
webpackJsonp([0],[function(module, exports, __webpack_require__) {
var chunk1=__webpack_require__(1);
console.log(chunk1);
}]);
main1.js
webpackJsonp([1],[function(module, exports, __webpack_require__) {
var chunk1=__webpack_require__(1);
console.log(chunk1);
}]);
Compared with the previous ones, there are more webpack Jsonp functions, and the anonymous function that executes immediately does not call _webpack_require_ (0) immediately. Take a look at webpack Jsonp:
var parentJsonpFunction = window["webpackJsonp"];
window["webpackJsonp"] = function webpackJsonpCallback(chunkIds, moreModules) {
//More Modules are stand-alone chunk code, and chunkIds mark the uniqueness of stand-alone chunks to avoid repeated loading on demand
//Take the code in main.js as an example, chunkIds is [0],moreModules is
//[function(module, exports, __webpack_require__) {
// var chunk1=__webpack_require__(1);
// console.log(chunk1);
//}]
var moduleId, chunkId, i = 0, callbacks = [];
for (; i < chunkIds.length; i++) {
chunkId = chunkIds[i];//chunkId=0
if (installedChunks[chunkId])
callbacks.push.apply(callbacks,installedChunks[chunkId]);//0 push into callbacks (using requireEnsure is no longer 0)
//The assignment of 0 indicates that chunk has loaded
installedChunks[chunkId] = 0;
}
for (moduleId in moreModules) {
//modules[0] will be overwritten
modules[moduleId] = moreModules[moduleId];
}
//Parent JsonpFunction has not been undefined in the current situation
if (parentJsonpFunction) parentJsonpFunction(chunkIds, moreModules);
//callbacks=[]
while (callbacks.length)
callbacks.shift().call(null, __webpack_require__);
if (moreModules[0]) {
installedModules[0] = 0;
return __webpack_require__(0);
}
};
// Cache module, accessible by closure reference (window ["webpack Jsonp"]
var installedModules = {};
//2 is the unique ID of the public chunk, 0 means loaded
var installedChunks = {
2: 0
};
// The require function
function __webpack_require__(moduleId) {
// Check if module is in cache
if (installedModules[moduleId])
return installedModules[moduleId].exports;
// Create a new module (and put it into the cache)
var module = installedModules[moduleId] = {
exports: {},
id: moduleId,
loaded: false
};
// Execute the module function
modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
// Flag the module as loaded
module.loaded = true;
// Return the exports of the module
return module.exports;
}
//On-demand loading
__webpack_require__.e = function requireEnsure(chunkId, callback) {
// "0" is the signal for "already loaded"
if (installedChunks[chunkId] === 0)
return callback.call(null, __webpack_require__);
// an array means "currently loading".
if (installedChunks[chunkId] !== undefined) {
installedChunks[chunkId].push(callback);
} else {
// start chunk loading
installedChunks[chunkId] = [callback];
var head = document.getElementsByTagName('head')[0];
var script = document.createElement('script');
script.type = 'text/javascript';
script.charset = 'utf-8';
script.async = true;
script.src = __webpack_require__.p + "" + chunkId + "." + ({ "0": "main", "1": "main1" }[chunkId] || chunkId) + ".js";
head.appendChild(script);
}
};
I don't seem to see anything... Modify
webpack.config.js
var CommonsChunkPlugin = require("webpack/lib/optimize/CommonsChunkPlugin");
module.exports = {
entry: {
main: './main.js',
main1: './main1.js',
chunk1:["./chunk1"]
},
output: {
path: __dirname + '/dist2',
filename: '[name].js'
},
plugins: [
new CommonsChunkPlugin({
name: ["chunk1"],
filename:"common.js",
minChunks:3,
})
]
};
Main and main1 require chunk1 and chunk2 respectively, and then pack chunk1 into common modules (minChunks:3, chunk2 will not be packaged into common modules). Self-running anonymous functions are at the end of the day.
return __webpack_require__(0);
Then installedModules[0] is already loaded. Look at common.js, installedModules[1] will also be loaded.
main.js
webpackJsonp([1], [function (module, exports, __webpack_require__) {
var chunk1 = __webpack_require__(1);
var chunk2 = __webpack_require__(2);
exports.a = 1;
console.log(chunk1);
}, , function (module, exports) {
var chunk2 = 1;
exports.chunk2 = chunk2;
}
]);
main1.js
webpackJsonp([2], [function (module, exports, __webpack_require__) {
var chunk1 = __webpack_require__(1);
var chunk2 = __webpack_require__(2);
exports.a = 1;
console.log(chunk1);
}, , function (module, exports) {
var chunk2 = 1;
exports.chunk2 = chunk2;
}
]);
common.js modules:
[function (module, exports, __webpack_require__) {
module.exports = __webpack_require__(1);
}, function (module, exports) {
var chunk1 = 1;
exports.chunk1 = chunk1;
}]
Take the main.js code as an example, call webpack Jsonp, pass in parameters chunkIds as [1], more Modules as [1].
[function (module, exports, __webpack_require__) {
var chunk1 = __webpack_require__(1);
var chunk2 = __webpack_require__(2);
exports.a = 1;
console.log(chunk1);
}, , function (module, exports) {
var chunk2 = 1;
exports.chunk2 = chunk2;
}]
var moduleId, chunkId, i = 0, callbacks = [];
for (; i < chunkIds.length; i++) {
chunkId = chunkIds[i];//1
//false, assignment0Later or later false
if (installedChunks[chunkId])
callbacks.push.apply(callbacks, installedChunks[chunkId]);
installedChunks[chunkId] = 0;
}
//Three modules
for (moduleId in moreModules) {
//moduleId:0,1,2 moreModules[1]Empty module, parameters of self-executing function(Common module)It will be overwritten, but the corresponding module in the parameter has been loaded And caching
modules[moduleId] = moreModules[moduleId];
}
if (parentJsonpFunction) parentJsonpFunction(chunkIds, moreModules);
while (callbacks.length)
callbacks.shift().call(null, __webpack_require__);
if (moreModules[0]) {
//installedModules[0]It will be renewed load,however load Yes. moreModules[0],because modules[0]It has been covered. moreModules[0]Dependence on
//modules[1],modules[2],modules[1]Already loaded
installedModules[0] = 0;
return __webpack_require__(0);
}
Look again at the following:
common.js self-executing function parameter (common module) (no return webpack_require(0))
[,function(module, exports, __webpack_require__) {
var chunk1=1;
var chunk2=__webpack_require__(2);
exports.chunk1=chunk1;
},function(module, exports) {
var chunk2=1;
exports.chunk2=chunk2;
}]
main.js
webpackJsonp([0],[
/* 0 */
/***/ function(module, exports, __webpack_require__) {
var chunk1=__webpack_require__(1);
var chunk2=__webpack_require__(2);
exports.a=1;
console.log(chunk1);
//main
/***/ }
]);
Call analysis with main
var moduleId, chunkId, i = 0, callbacks = [];
for(;i < chunkIds.length; i++) {
chunkId = chunkIds[i];//0
if(installedChunks[chunkId])
callbacks.push.apply(callbacks, installedChunks[chunkId]);
installedChunks[chunkId] = 0;//Indicates that the unique index is0Of chunk Already loaded
}
for(moduleId in moreModules) {
//More Modules has only one element, so modules[1],modules[2]Not covered
modules[moduleId] = moreModules[moduleId];
}
if(parentJsonpFunction) parentJsonpFunction(chunkIds, moreModules);
while(callbacks.length)
callbacks.shift().call(null, __webpack_require__);
if(moreModules[0]) {
installedModules[0] = 0;
//moreModules[0]Namely modules[0]rely on modules[1],Namely modules[2](Not covered is critical.)
return __webpack_require__(0);
}
There is also this packing situation:
common.js does not contain a common module, i.e., the parameter of the self-executing function is [].
main.js
webpackJsonp([0,1],[
function(module, exports, __webpack_require__) {
var chunk1=__webpack_require__(1);
var chunk2=__webpack_require__(2);
exports.a=1;
console.log(chunk1);
},function(module, exports) {
var chunk1=1;
exports.chunk1=chunk1;
},function(module, exports) {
var chunk2=1;
exports.chunk2=chunk2;
}]);
Call analysis with main
var moduleId, chunkId, i = 0, callbacks = [];
for(;i < chunkIds.length; i++) {
chunkId = chunkIds[i];//0,1
if(installedChunks[chunkId])
callbacks.push.apply(callbacks, installedChunks[chunkId]);
installedChunks[chunkId] = 0;
}
for(moduleId in moreModules) {
//More Modules are all transferred to modules
modules[moduleId] = moreModules[moduleId];
}
if(parentJsonpFunction) parentJsonpFunction(chunkIds, moreModules);
while(callbacks.length)
callbacks.shift().call(null, __webpack_require__);
if(moreModules[0]) {
//Module [0] is the chunk file run code
installedModules[0] = 0;
return __webpack_require__(0);
}
7. On-demand loading
webpack.config.json
module.exports = {
entry: './main.js',
output: {
filename: 'bundle.js'
}
};
main.js
require.ensure(['./a'], function(require) {
var content = require('./a');
document.open();
document.write('<h1>' + content + '</h1>');
document.close();
});
a.js
module.exports = 'Hello World';
After packing
bundle.js
/******/ (function(modules) { // webpackBootstrap
/******/ // install a JSONP callback for chunk loading
/******/ var parentJsonpFunction = window["webpackJsonp"];
/******/ window["webpackJsonp"] = function webpackJsonpCallback(chunkIds, moreModules) {
/******/ // add "moreModules" to the modules object,
/******/ // then flag all "chunkIds" as loaded and fire callback
/******/ var moduleId, chunkId, i = 0, callbacks = [];
/******/ for(;i < chunkIds.length; i++) {
/******/ chunkId = chunkIds[i];
/******/ if(installedChunks[chunkId])
/******/ callbacks.push.apply(callbacks, installedChunks[chunkId]);
/******/ installedChunks[chunkId] = 0;
/******/ }
/******/ for(moduleId in moreModules) {
/******/ modules[moduleId] = moreModules[moduleId];
/******/ }
/******/ if(parentJsonpFunction) parentJsonpFunction(chunkIds, moreModules);
/******/ while(callbacks.length)
/******/ callbacks.shift().call(null, __webpack_require__);
/******/ };
/******/ // The module cache
/******/ var installedModules = {};
/******/ // object to store loaded and loading chunks
/******/ // "0" means "already loaded"
/******/ // Array means "loading", array contains callbacks
/******/ var installedChunks = {
/******/ 0:0
/******/ };
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/ // Check if module is in cache
/******/ if(installedModules[moduleId])
/******/ return installedModules[moduleId].exports;
/******/ // Create a new module (and put it into the cache)
/******/ var module = installedModules[moduleId] = {
/******/ exports: {},
/******/ id: moduleId,
/******/ loaded: false
/******/ };
/******/ // Execute the module function
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/ // Flag the module as loaded
/******/ module.loaded = true;
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/ // This file contains only the entry chunk.
/******/ // The chunk loading function for additional chunks
/******/ __webpack_require__.e = function requireEnsure(chunkId, callback) {
/******/ // "0" is the signal for "already loaded"
/******/ if(installedChunks[chunkId] === 0)
/******/ return callback.call(null, __webpack_require__);
/******/ // an array means "currently loading".
/******/ if(installedChunks[chunkId] !== undefined) {
/******/ installedChunks[chunkId].push(callback);
/******/ } else {
/******/ // start chunk loading
/******/ installedChunks[chunkId] = [callback];
/******/ var head = document.getElementsByTagName('head')[0];
/******/ var script = document.createElement('script');
/******/ script.type = 'text/javascript';
/******/ script.charset = 'utf-8';
/******/ script.async = true;
/******/ script.src = __webpack_require__.p + "" + chunkId + ".bundle.js";
/******/ head.appendChild(script);
/******/ }
/******/ };
/******/ // expose the modules object (__webpack_modules__)
/******/ __webpack_require__.m = modules;
/******/ // expose the module cache
/******/ __webpack_require__.c = installedModules;
/******/ // __webpack_public_path__
/******/ __webpack_require__.p = "";
/******/ // Load entry module and return exports
/******/ return __webpack_require__(0);
/******/ })
/************************************************************************/
/******/ ([
/* 0 */
/***/ function(module, exports, __webpack_require__) {
__webpack_require__.e/* nsure */(1, function(require) {
var content = __webpack_require__(1);
document.open();
document.write('<h1>' + content + '</h1>');
document.close();
});
/***/ }
/******/ ]);
1.bundle.js
webpackJsonp([1],[
/* 0 */,
/* 1 */
/***/ function(module, exports) {
module.exports = 'Hello World';
/***/ }
]);
The difference in packaging with Commons Chunk Plugin is that
/******/ // This file contains only the entry chunk.
/******/ // The chunk loading function for additional chunks
/******/ __webpack_require__.e = function requireEnsure(chunkId, callback) {
/******/ // "0" is the signal for "already loaded"
/******/ if(installedChunks[chunkId] === 0)
/******/ return callback.call(null, __webpack_require__);
/******/ // an array means "currently loading".
/******/ if(installedChunks[chunkId] !== undefined) {
/******/ installedChunks[chunkId].push(callback);
/******/ } else {
/******/ // start chunk loading
/******/ installedChunks[chunkId] = [callback];
/******/ var head = document.getElementsByTagName('head')[0];
/******/ var script = document.createElement('script');
/******/ script.type = 'text/javascript';
/******/ script.charset = 'utf-8';
/******/ script.async = true;
/******/ script.src = __webpack_require__.p + "" + chunkId + ".bundle.js";
/******/ head.appendChild(script);
/******/ }
/******/ };
The id of module main is 0, and that of module a is 1. return webpack_require(0), then load the main module.
Modules [0]. Call (module. exports, module. exports, webpack_require) calls the function
function(module, exports, __webpack_require__) {
__webpack_require__.e/* nsure */(1, function(require) {
var content = __webpack_require__(1);
document.open();
document.write('<h1>' + content + '</h1>');
document.close();
}
/******/ // This file contains only the entry chunk.
/******/ // The chunk loading function for additional chunks
/******/ __webpack_require__.e = function requireEnsure(chunkId, callback) {
//Installed Chunks [1] is undefined
/******/ // "0" is the signal for "already loaded"
/******/ if(installedChunks[chunkId] === 0)
/******/ return callback.call(null, __webpack_require__);
/******/ // an array means "currently loading".
/******/ if(installedChunks[chunkId] !== undefined) {
/******/ installedChunks[chunkId].push(callback);
/******/ } else {
/******/ // start chunk loading
/******/ installedChunks[chunkId] = [callback];//Installed Chunks [1] is an array indicating current loading
/******/ var head = document.getElementsByTagName('head')[0];
/******/ var script = document.createElement('script');
/******/ script.type = 'text/javascript';
/******/ script.charset = 'utf-8';
/******/ script.async = true;
/******/ script.src = __webpack_require__.p + "" + chunkId + ".bundle.js";
/******/ head.appendChild(script);
//Call directly after loading
/******/webpackJsonp([1],[
/******//* 0 */,
/******//* 1 */
/******//***/ function(module, exports) {
/******/
/******/ module.exports = 'Hello World';
/******/
/******/
/******//***/ }
/******/]);
/******/ }
/******/ };
//Installed Chunks [1] is called in webpack Jsonp
Installed Chunks [1] is an array, and the element is the execution code of the main module.
/******/ window["webpackJsonp"] = function webpackJsonpCallback(chunkIds, moreModules) {
//More Modules is the code for module a
/******/ // add "moreModules" to the modules object,
/******/ // then flag all "chunkIds" as loaded and fire callback
/******/ var moduleId, chunkId, i = 0, callbacks = [];
/******/ for(;i < chunkIds.length; i++) {
/******/ chunkId = chunkIds[i];
/******/ if(installedChunks[chunkId])//Installed Chunks [0]== 0, and installed Chunks [1] as arrays
/******/ callbacks.push.apply(callbacks, installedChunks[chunkId]);//callbacks execute code for module main, not arrays
/******/ installedChunks[chunkId] = 0;//Installed Chunks [1] is not an array, indicating that it has been loaded
/******/ }
/******/ for(moduleId in moreModules) {
/******/ modules[moduleId] = moreModules[moduleId];
/******/ }
/******/ if(parentJsonpFunction) parentJsonpFunction(chunkIds, moreModules);
/******/ while(callbacks.length)
/******/ callbacks.shift().call(null, __webpack_require__);
/******/ };