加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 黄冈站长网 (http://www.0713zz.com/)- 数据应用、建站、人体识别、智能机器人、语音技术!
当前位置: 首页 > 运营中心 > 建站资源 > 优化 > 正文

浅谈 Webpack 背后的运行机制

发布时间:2019-08-15 21:36:41 所属栏目:优化 来源:Alan
导读:副标题#e# 在平时开发中我们经常会用到 Webpack这个时下最流行的前端打包工具。它打包开发代码,输出能在各种浏览器运行的代码,提升了开发至发布过程的效率。 我们知道一份 Webpack配置文件主要包含入口( entry)、输出文件( output)、模式、加载器( Loader

关于第一点,我们回忆一下之前 __webpack_require__.e 的内容,此时 chunk 还处于「加载中」的状态,也就是说对应的 installedChunks[chunkId] 的值此时为 [resolve, reject, promise]。而这里,chunk 已经加载,但 promise 还未决议,于是 webpackJsonpCallback 内部定义了一个 resolves 变量用来收集 installedChunks 上的 resolve 并执行它。

接下来说到第二点,就要涉及几个层面的缓存了。

首先是 chunk 层面,这里有两个相关操作,操作一将 installedChunks[chunkId] 置为 0 可以让 __webpack_require__.e 在第二次加载同一 chunk 时返回一个立即决议的 promise(Promise.all([]));操作二将 chunk data 添加进 window["webpackJsonp"] 数组,可以在多入口模式时,方便地拿到已加载过的 chunk 缓存。通过以下代码实现:

  1. /*** 缓存执行部分 ***/ 
  2. var jsonpArray = window["webpackJsonp"] = window["webpackJsonp"] || []; 
  3. // ... 
  4. for (var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]); 
  5. var parentJsonpFunction = oldJsonpFunction; 
  6. /*** 缓存执行部分 ***/ 
  7. /*** 缓存添加部分 ***/ 
  8. function webpackJsonpCallback(data) { 
  9. //... 
  10. // 此处的 parentJsonpFunction 是 window["webpackJsonp"] 数组的原生 push 
  11. if (parentJsonpFunction) parentJsonpFunction(data); 
  12. //... 
  13. /*** 缓存添加部分 ***/ 

而在 modules 层面, chunk 中的 moreModules 被合入入口文件的 modules 中,可供下一个微任务中的 __webpack_require__ 同步加载模块。

  1. ({ 
  2. "./src/index.js": 
  3. (function (module, exports, __webpack_require__) { 
  4. console.log( Hello webpack! ); 
  5. window.setTimeout(() => { 
  6. __webpack_require__.e(0).then(__webpack_require__.bind(null, "./src/utils/math.js")).then(mathUtil => { 
  7. console.log( 1 + 2: + mathUtil.plus(1, 2)); 
  8. }); 
  9. }, 2000); 
  10. }) 
  11. }); 

__webpack_require__.e(0) 返回的 promise 决议后, __webpack_require__.bind(null,"./src/utils/math.js") 可以加载到 chunk 携带的模块,并返回模块作为下一个微任务函数的入参,接下来就是 Webpack Loader 翻译过的其他业务代码了。

现在让我们把异步流程梳理一下:

浅谈 Webpack 背后的运行机制

(编辑:PHP编程网 - 黄冈站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读