maxAsyncRequests和maxInitialRequests有相似之处,它俩都是用来限制拆分数量的,maxInitialRequests是用来限制入口的拆分数量而maxAsyncRequests是用来限制异步模块内部的并行最大请求数的,说白了你可以理解为是每个import()它里面的最大并行请求数量。

  这其中要注意以下几点:

  1、import()文件本身算一个请求

  2、并不算js以外的公共资源请求比如css

  3、如果同时有两个模块满足cacheGroup的规则要进行拆分,但是maxInitialRequests的值只能允许再拆分一个模块,那尺寸更大的模块会被拆分出来

  我们还是通过一个例子来解释一下,我定义三个入口文件entry1.js、entry2.js和entry3,entry1.js里面动态加载page1.js

  webpack的配置如下:

  因为默认的maxAsyncRequests为5太大了,不方便测试,所以改为了3

  

  entry1.js:

import React from 'react'
import ReactDOM from 'react-dom' const App = () => {
let Page1 = null import(/* webpackChunkName: "page1" */'./routes/page1').then(comp => {
Page1 = comp
}) return (
<div>
<div>App</div>
<Page1 />
</div>
)
} ReactDOM.render(<App />, document.getElementById('root'))

  entry2.js

import React from 'react'
import ReactDOM from 'react-dom'
import $ from './assets/jquery'
const App = () => {
console.log($)
return (
<div>
<div>entry2</div>
</div>
)
} ReactDOM.render(<App />, document.getElementById('root'))

  entry3.js

import React from 'react'
import ReactDOM from 'react-dom'
import OrgChart from './assets/orgchart' const App = () => {
return (
<div>
<div>App</div>
</div>
)
} ReactDOM.render(<App />, document.getElementById('root'))

  page1.js

import React from 'react'
import _ from 'lodash'
import $ from '../assets/jquery'
import OrgChart from '../assets/orgchart' const Page1 = () => {
return (
<div>
<div>Page1</div>
</div>
)
} export default Page1

  打包结果:

  让我们分享一下打包结果,主要是看和page1有关的,因为page1是通过import()动态引入的

  1、vendors~page1.chunkhash.chunk.js是page1里面引入的第三方库lodash,这个是根据cacheGroups进行拆分的,如果不明白可以去看我之前的文章《理解webpack4.splitChunks之cacheGroups》

  2、page1.chunkhash.chunk.js是page1.js文件本身,这个也没问题,如果不明白为啥import()的文件会被拆分可以去看我的第一篇文章《理解webpack.splitChunks》

  3、default~entry2~page1.chunkhash.js这个拆分的entry2和page1的共用文件jquery.js,这个是根据cacheGroups进行拆分的,如果不明白可以去看我之前的文章《理解webpack4.splitChunks之cacheGroups》

  那么page1这个异步模块的并发请求数正好是设置的最大值3,符合maxAsyncRequests

  这里我们发现除了jquery.js之外page1.js和entry3.js还共同引入了orgchart.js文件,但是却没有被拆分出来,这就是因为maxAsyncRequests的限制,如果我们把值改为4呢?

  改为4后进行打包,打包的结果如下:

  

  我们发现orgchart.js被打包出来了,这个时候page1.js的最大请求数量也变成了4个。

  注意: 这里有一个小问题,为啥是jquery.js被拆分了而不是orgchart.js?

  仔细看文章的小伙伴应该会发现我在文章开头提到的需要注意的几个点中最后一点,在匹配maxAsyncRequests这个条件进行拆分的时候尺寸大的包会先被拆分

  

  由上图我们知道jquery.js的尺寸远远大于orgchart.js的尺寸,所以它被先拆分了。

  

  PS:至于vendors~page1.chunkhash.chunk.js为啥没有把react拆出来可以去看我的最后一篇博客《理解webpack之其余要点》

  

理解webpack4.splitChunks之maxAsyncRequests的更多相关文章

  1. 理解webpack4.splitChunks

    一.前言 之前一直也没有研究过webpack4是基于怎样的规则去拆分模块的,现在正好有时间打算好好了解一下,看了官方文档也陆陆续续的看了看网上别人写的文章,感觉大部分都是将官方文档翻译了一遍,很多问题 ...

  2. 理解webpack4.splitChunks之其余要点

    splitChunks除了之前文章提到的规则外,还有一些要点或是叫疑惑因为没有找到官方文档的明确说明,所以是通过我自己测试总结出来的,只代表我自己的测试结果,不一定正确. splitChunks.ca ...

  3. 理解webpack4.splitChunks之maxInitialRequests

    maxInitialRequests是splitChunks里面比较难以理解的点之一,它表示允许入口并行加载的最大请求数,之所以有这个配置也是为了对拆分数量进行限制,不至于拆分出太多模块导致请求数量过 ...

  4. 理解webpack4.splitChunks之cacheGroups

    cacheGroups其实是splitChunks里面最核心的配置,一开始我还认为cacheGroups是可有可无的,这是完全错误的,splitChunks就是根据cacheGroups去拆分模块的, ...

  5. 理解webpack4.splitChunks之chunks

    上回说到按照默认的splitChunks配置,入口里面的第三方依赖没有打包出来,这个是因为chunks属性的原因,下面我们就介绍chunks属性的意义和用法. chunks的含义是拆分模块的范围,它有 ...

  6. Webpack4 splitChunks配置,代码分离逻辑

    博客不知道啥时候写的了,一直在草稿箱没写完,突然感觉今年过去大半了,又没怎么写博客.写写完,有始有终 1.代码分离升级 原来项目代码分离是通过下面的配置,基于bundle-loader插件,通过rou ...

  7. webpack4分包方案

    webpack4放弃了 commonsChunkPlugin,使用更方便灵活智能的 splitChunks 来做分包的操作. 下面有几个例子,并且我们假设所有的chunks大小至少为30kb(采用sp ...

  8. 再谈 webpack build 及 加载优化

    之前项目多,事情忙,一直没时间写博客,现在空闲下来了,总结一下 之前讲过了关于 build 压缩文件的方法,有兴趣的可以看下: 点击查看 现在讲讲一个页面的首屏加载速度该如何提升 提前说明 需要 we ...

  9. 必备技能一、webpack

    https://cloud.tencent.com/developer/section/1477376----->配置很重要 一.基本安装 mkdir webpack-demo &&am ...

随机推荐

  1. python 第一天学习(画个正方体)

    import turtleturtle.goto(200,0)turtle.goto(200,200)turtle.goto(0,200)turtle.goto(0,0)turtle.penup()t ...

  2. js的window对象

    js的window对象 1.子窗口方法 function testOpen(){ window.open('son.html','newwindow','height=400, width=600, ...

  3. [BZOJ 5072][Lydsy1710月赛]小A的树

    传送门 \(\color{green}{solution}\) 嗯...其实我也不太会,所以大胆猜个结论吧(后来证了一下,然后放弃了...). 我们发现如果要使一个联通块的黑点数量为\(k\)的方案最 ...

  4. 关于Matlab串口发送HEX格式字符

    终于想起来更新一下关于使用Matlab串口发送HEX格式字符.这个用法主要来自于我使用Matlab对机器人进行实时轨迹跟踪的绘制,由于底层限制,自己又不想在中间增加转换模块,就需要直接发送HEX格式指 ...

  5. Flutter框架概览

    前言:进入新框架的开发前,有必要整体了解框架设计及特点,对该框架初步认识,此文对Flutter框架进行浅显梳理,以备查阅: Flutter框架   从该架构图可知,Flutter框架可分为Framew ...

  6. 关于Java的权限修饰符(public,private,protected,默认friendly)

    以前对访问修饰符总是模棱两可,让自己仔细解释也是经常说不很清楚.这次要彻底的搞清楚. 现在总结如下: 一.概括总结 各个访问修饰符对不同包及其子类,非子类的访问权限 Java访问权限修饰符包含四个:p ...

  7. (转)Python数学函数

    原文:https://www.cnblogs.com/lpl1/p/7793645.html PYTHON-基础-内置函数小结----------http://www.wklken.me/posts/ ...

  8. Java并发编程——阻塞队列BlockingQueue

    Java 并发编程系列文章 Java 并发基础——线程安全性 Java 并发编程——Callable+Future+FutureTask java 并发编程——Thread 源码重新学习 java并发 ...

  9. 解决Ubuntu系统的每次开机重启后,resolv.conf清空的问题和DNS域名解析问题(图文详解)

    不多说,直接上干货! 问题情况描述如下: 普及知识:   /etc/resolv.conf ,其实是一个Link .它其实指向的是 /run/resolvconf/resolv.conf.  Ubun ...

  10. 【Qt开发】QTime类

    QTime类为用户提供一系列时间的函数,封装的很全面,几乎满足了各种时间的需求. 常用方法介绍 1.QTime addMSecs(int ms) const 当前时间增加毫秒,ms可为负 2.QTim ...