searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

webpack 的 runtime 运行流程

2024-07-15 09:44:55
7
0

Webpack Runtime

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

  1. __webpack_modules__: 维护一个所有模块的数组。将入口模块解析为 AST,根据 AST 深度优先搜索所有的模块,并构建出这个模块数组。每个模块都由一个包裹函数 (module, module.exports, __webpack_require__) 对模块进行包裹构成。
  2. __webpack_require__(moduleId): 手动实现加载一个模块。对已加载过的模块进行缓存,对未加载过的模块,执行 id 定位
  3. __webpack_modules__ 中的包裹函数,执行并返回 module.exports,并缓存
  4. __webpack_require__(0): 运行第一个模块,即运行入口模块

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

/******/ var __webpack_modules__ = ([
/* 0 */,
/* 1 */
/***/ ((module) => {

module.exports = (...args) => args.reduce((x, y) => x + y, 0)

/***/ })
/******/ ]);
/************************************************************************/
/******/ // The module cache
/******/ var __webpack_module_cache__ = {};
/******/ 
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/  // Check if module is in cache
/******/  var cachedModule = __webpack_module_cache__[moduleId];
/******/  if (cachedModule !== undefined) {
/******/   return cachedModule.exports;
/******/  }
/******/  // Create a new module (and put it into the cache)
/******/  var module = __webpack_module_cache__[moduleId] = {
/******/   // no module.id needed
/******/   // no module.loaded needed
/******/   exports: {}
/******/  };
/******/ 
/******/  // Execute the module function
/******/  __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
/******/ 
/******/  // Return the exports of the module
/******/  return module.exports;
/******/ }
/******/ 
/************************************************************************/
var __webpack_exports__ = {};
// This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk.
(() => {
const sum = __webpack_require__(1)

sum(3, 8)

})();

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

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

__webpack_require__(0)

 

0条评论
作者已关闭评论
姚****晨
3文章数
0粉丝数
姚****晨
3 文章 | 0 粉丝
姚****晨
3文章数
0粉丝数
姚****晨
3 文章 | 0 粉丝
原创

webpack 的 runtime 运行流程

2024-07-15 09:44:55
7
0

Webpack Runtime

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

  1. __webpack_modules__: 维护一个所有模块的数组。将入口模块解析为 AST,根据 AST 深度优先搜索所有的模块,并构建出这个模块数组。每个模块都由一个包裹函数 (module, module.exports, __webpack_require__) 对模块进行包裹构成。
  2. __webpack_require__(moduleId): 手动实现加载一个模块。对已加载过的模块进行缓存,对未加载过的模块,执行 id 定位
  3. __webpack_modules__ 中的包裹函数,执行并返回 module.exports,并缓存
  4. __webpack_require__(0): 运行第一个模块,即运行入口模块

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

/******/ var __webpack_modules__ = ([
/* 0 */,
/* 1 */
/***/ ((module) => {

module.exports = (...args) => args.reduce((x, y) => x + y, 0)

/***/ })
/******/ ]);
/************************************************************************/
/******/ // The module cache
/******/ var __webpack_module_cache__ = {};
/******/ 
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/  // Check if module is in cache
/******/  var cachedModule = __webpack_module_cache__[moduleId];
/******/  if (cachedModule !== undefined) {
/******/   return cachedModule.exports;
/******/  }
/******/  // Create a new module (and put it into the cache)
/******/  var module = __webpack_module_cache__[moduleId] = {
/******/   // no module.id needed
/******/   // no module.loaded needed
/******/   exports: {}
/******/  };
/******/ 
/******/  // Execute the module function
/******/  __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
/******/ 
/******/  // Return the exports of the module
/******/  return module.exports;
/******/ }
/******/ 
/************************************************************************/
var __webpack_exports__ = {};
// This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk.
(() => {
const sum = __webpack_require__(1)

sum(3, 8)

})();

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

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

__webpack_require__(0)

 

文章来自个人专栏
前端部署实战
3 文章 | 1 订阅
0条评论
作者已关闭评论
作者已关闭评论
0
0