/**

* 对于没有代码分割的,webpack会打包生成main.js一个大的自执行函数

* 函数参数是一个对象,键值分别是路径和模块的函数

* 函数内部定义了一些方法,包括__webpack_require__

* 函数内部执行逻辑会从一个入口开始进行webpackrequire按内部依赖的逻辑来执行函数

*

*/

/*

对于有代码分割的内容,webpack除了main.js还会生成0.js,1.js...等

20191026补充注:

此分析时,使用了dynamic-import-webpack插件,实际webpack4可以不引入这个插件,不引入的话,动态import('xx.js').then(中直接拿到的是module,而不是下面分析中直接拿到的可执行函数名,后文整个分析流程和动态包的加载逻辑没有变化。

原始代码:

index.js:

show.js:

sb.js:

show-child.js:

打包生成的main.js里的大自执行函数的函数参数是这样的:

(./src/index.js是入口)

下面的自执行函数是这样的:

被转换成了

先执行__webpack_require__.e然后在then里面resolve(__webpack_require__(‘./src/show.js))

__webpack_require__.e是干什么的:

webpack_require__.e内部声明了一个空数组promises

功能:

1.该函数会修改在大自执行函数中定义的installedChunks (显示安装chunk的状态)

2.创建了一个installedChunkData对象 是installedChunks[chunkId]

对象的结构是[resolve,reject,promise]

3.如果正在加载

会执行

promises.push(installedChunkData[2]);   <- - -这里的[2]就是promise对象

否则 创建一个新promise对象

4.创建script标签:

__webpack_require__.e函数创建了一个script标签,引入0.js..等 插入到head标签的后面

返回一个promise,promise.then里面可以拿到一个数组,[]数组中内容是           ( return Promise.all(promises)    // Promise {<pending>}

__webpack_require__.e函数最终返回的是一个promise     (  这个promise后面then的调用时机是——promises数组里所有promise对象都确定了完成状态

总结:  __webpack_require__.e是创建一个script标签,然后异步加载, 函数最后返回一个promise ,当promise被resolve或reject的时候(即,require__.e创建的promises数组里所有元素都有了确定状态时)可以被后面的.then接收到

当创建的script标签加载完成了,promise就会被resolve或reject,

看一下创建的标签的内容:

2.js内容:

创建的这个script标签(异步加载)的内容是什么呢,拿2.js来分析一下:

window.webpackJsonp数组 中使用push方法 : [[2],{‘….’:{  }}]

此时的push方法已经被改写了:

window下jsonpArray的push方法是webpackJsonpCallback

于是调用 webpackJsonpCallback([[2],{‘…’{}}]

执行:

该方法会将chunk们的加载状态记录管理,将moreModules装载到modules中

后面的resolves.shift()()会导致_webpack_require__.e里产生的promise对象resolve出来,

到这里一个chunk加载完成,将会执行_webpack_require__.e.then后面的逻辑

流程:创建script标签加载chunk

chunk 指一个要异步加载的大数据块 在这个例子中0.js,1.js,2.js就是chunk

然后chunk里面一般是这样的 然后调用被改写过的window.webpackJsonp.push方法进行加载,将chunk们的加载状态记录管理,将moreModules装载到modules中

总结:__webpack_require__.e 会创建script标签src地址是依赖的js文件,将这个script标签插入到head标签后面,最终返回一个promise对象

被创建好的script标签内容是一段会被立即执行的表达式,使用window.webpackJsonp.push(被改写过的一个方法)方法来装载管理chunk安装状态,并将moremodules插入 到modules中。 还调用到了__webpack_require__.e中创建的promise的resolve()方法 ,当resolve结束后,__webpack_require__.e 的promise对象的.then方法也会被触发。(因为__webpack_require__.e中最终返回的是Promise.all([…]))

仓库地址 https://github.com/eret9616/webpack-bundle.js

分支 asyncloading syncloading

直接以dist目录启动服务

附:

webpack_require__.r  将这个module标记为esModule ,重写Symbol.toStringTag接口,添加__esModule属性

webpack_require__.t  当import('...xxx.js')动态引入一个commonjs模块的时候,会创建一个对象,将这个对象标记为esModule,将commonjs模块转换得到等价的esModule的内容输出

webpack打包文件解析的更多相关文章

  1. 成功解决react+webpack打包文件过大的问题

    最近在学习并使用webpack+react+antd写了一个小项目,也可以说是demo,待全部开发完成后发现webpack的打包文件足足有将近13.3MB,快吓死宝宝了,经过连续几天的学习,和调试最后 ...

  2. webpack打包文件中的@符号表示什么意思

    在看使用webpack打包的项目代码时,经常会看到在路径中引用@符号 import one from '@/views/one.vue' 那这里的@符号到底表示什么意思呢? 这其实利用了webpack ...

  3. webpack打包文件

    npm init -y//生成package.json npm install webpack webpack-cli --save-dev//安装webpack和webpack-cli根据入口文件. ...

  4. vue+webpack 打包文件 404 页面空白

    最近用vue-cli+vue-router+webpack建立项目,其中的遇到的三个问题,整理如下: vue-cli+ webpack 建立的项目,cnpm run build 打包项目之后,需要放在 ...

  5. 解决 webpack 打包文件体积过大

    webpack 把我们所有的文件都打包成一个 JS 文件,这样即使你是小项目,打包后的文件也会非常大.下面就来讲下如何从多个方面进行优化. 去除不必要的插件 刚开始用 webpack 的时候,开发环境 ...

  6. 彻底解决 webpack 打包文件体积过大

    http://www.jianshu.com/p/a64735eb0e2b https://segmentfault.com/q/1010000006018592?_ea=985024 http:// ...

  7. 如何降低Vue.js项目中Webpack打包文件的大小?

    https://blog.csdn.net/maray/article/details/50988500?utm_source=blogxgwz0 import Blur from ‘vux/src/ ...

  8. webpack打包经验——处理打包文件体积过大的问题

    前言 最近对一个比较老的公司项目做了一次优化,处理的主要是webpack打包文件体积过大的问题. 这里就写一下对于webpack打包优化的一些经验. 主要分为以下几个方面: 去掉开发环境下的配置 Ex ...

  9. 提升webpack打包速度

    webpack打包文件体积过大,怎么提升速度? 借助webpack visualizer可视化插件,来看构建的情况.这个问题要具体情况具体分析,看看打包文件有哪些块头比较大,哪些不常改变,最好列一个l ...

随机推荐

  1. pip 安装超时解决方案

    已经使用梯子,安装某依赖时仍然超时. 首先检查pip的版本是否需要更新,如果不是最新版本运行命令更新: python -m pip install --upgrade pip 如果仍然超时错误,则运行 ...

  2. 什么是file_sort?如何避免file_sort

    阿里巴巴编码规范有这么一例 [推荐]如果有order by场景,请注意利用索引的有序性. order by最后的字段是组合索引的一部分,并且放在索引组合顺序的最后,避免出现file_sort的情况,影 ...

  3. axios 请求常用组件,及其错误

    1. var nodeModules = path.join(processPath, 'node_modules') var querystring = require(nodeModules + ...

  4. Vim安装插件支持 MarkDown 语法、实时预览等

    使用 markdown-preview.vim 插件可以实时通过浏览器预览 markdown 文件 使用该插件需要 vim 支持py2/py3 安装 使用 vim-plug: 在 .vimrc 或 i ...

  5. AIX中的服务管理

    1.SRC AIX系统使用资源控制器(SRC,system   resource  controller),控制各种服务子系统,包括启动,停止进程,搜集进程状态信息等.   AIX系统中服务有子系统组 ...

  6. (转) Weblogic 12c 集群部署和session复制

    1.启动服务 首先在weblogic12c控制台,启动受托管服务server1.server2.server3. 2.将要部署的应用打包成war文件. 我用的是MyEclipse做的开发,可以用其自带 ...

  7. Caffe学习使用__运行caffe自带的两个简单例子

    为了程序的简洁,在caffe中是不带练习数据的,因此需要自己去下载.但在caffe根目录下的data文件夹里,作者已经为我们编写好了下载数据的脚本文件,我们只需要联网,运行这些脚本文件就行了. 注意: ...

  8. MySQL 表的增删查改

    一.插入数据 1. INSERT ... VALUES ... INSERT INTO <表名> [ <列名1> [ , … <列名n>] ] VALUES (值1 ...

  9. H5手机端开发问题汇总及解决方案

    前言 少侠,请留步,相见必是缘分,赠与你一部<踏坑秘籍> 扎马步 踏坑第一式 ios竖屏拍照上传,图片被旋转问题 解决方案 // 几个步骤 // 1.通过第三方插件exif-js获取到图片 ...

  10. 八、asynicio模块以及爬虫应用asynicio模块(高性能爬虫)

    asynicio模块以及爬虫应用asynicio模块(高性能爬虫) 一.背景知识 爬虫的本质就是一个socket客户端与服务端的通信过程,如果我们有多个url待爬取,只用一个线程且采用串行的方式执行, ...