Skip to content
On this page

Webpack Runtime

webpack 的 runtime,也就是 webpack 最后生成的代码,做了以下三件事:

  1. __webpack_modules__: 维护一个所有模块的数组。将入口模块解析为 AST,根据 AST 深度优先搜索所有的模块,并构建出这个模块数组。每个模块都由一个包裹函数 (module, module.exports, __webpack_require__) 对模块进行包裹构成。
  2. __webpack_require__(moduleId): 手动实现加载一个模块的函数。对已加载过的模块进行缓存,存在__webpack_module_cache__中,对未加载过的模块,执行 id 定位到 __webpack_modules__ 中的包裹函数,执行并返回 module.exports,并缓存
  3. __webpack_require__(0): 运行第一个模块,即运行入口模块
js
var __webpack_modules__ = [
	// 入口模块
	() => {
		const sum = __webpack_require__(1);
		sum(3, 8);
	},
    // 第一个模块
	(module) => {
		module.exports = (...args) => args.reduce((x, y) => x + y, 0);
  	},
];
/************************************************************************/
// 模块缓存
var __webpack_module_cache__ = {};
// 模块请求函数
function __webpack_require__(moduleId) {
	// 从缓存中获取模块
	var cachedModule = __webpack_module_cache__[moduleId];
	// 找到模块,直接返回模块导出的内容
	if (cachedModule !== undefined) {
		return cachedModule.exports;
	}
	// 找不到模块,初始化模块信息,并加入缓存
	var module = (__webpack_module_cache__[moduleId] = {
		exports: {},
	});
	// 在模块数组中找到对应的模块,并运行
   __webpack_modules__[moduleId](module,module.exports,__webpack_require__);
	// 返回模块执行后的结果
	return module.exports;
}

// ?
var __webpack_exports__ = {};

// 运行入口模块
__webpack_require__(0);

webpack runtime 做进一步的精简,代码如下

js
const __webpack_modules__ = [() => {}];
const __webpack_require__ = (id) => {
  const module = { exports: {} };
  const m = __webpack_modules__[id](module, __webpack_require__);
  return module.exports;
};

__webpack_require__(0);

另外,当涉及到多个 chunk 的打包方式中,比如 code spliting,webpack 中会有 jsonp 加载 chunk 的运行时代码。

MIT Licensed | Copyright © 2021 - 2022