webpack——SplitChunksPlugin配置参数(十二)

代码分隔底层使用到了SplitChunksPlugin,所以接下来讲解一下SplitChunksPlugin参数的配置。
上一节执行异步代码的生成目录如下:
在这里插入图片描述
文件名为0.bundle.js,希望将文件名改为英文的可识别的名字,可以在异步加载组件当中加一段魔法注释:
//魔法注释: /* webpackChunkName: “lodash” */
src/index.js

function getComponent() {
    return import(/* webpackChunkName: "lodash" */ 'lodash').then(({ default: _ }) => {
        var ele = document.createElement('div')
        ele.innerHTML = _.join(['yang', 'yue'], '-')
        return ele
    })
}
getComponent().then(ele => {
    document.body.appendChild(ele)
})

再次运行npm run dev-build,生成的文件如下:
在这里插入图片描述

如果希望打包出来的文件名就叫lodash.bundle.js,没有前缀vendors~,需要改变微博怕吃苦.common.js中的配置:
参考链接: https://www.webpackjs.com/plugins/split-chunks-plugin/
webpack.common.js

//代码分割
    optimization: {
        splitChunks: {
            chunks: 'all',
            //添加的配置项
            cacheGroups: {
                vendors: false,
                default: false
            }
        },
    }

运行npm run dev-build,生成的文件如下:
在这里插入图片描述
则成功修改文件名字,
这就说明异步组件在做代码分割时,配置项可以对代码分割产生影响,添加cacheGroups配置项可以去掉文件名前缀vendors~。
就算

splitChunks: {}

运行npm run dev-build,打包的过程仍然正常运行。

这是因为splitChunks具有默认配置内容:

splitChunks: {
    chunks: "async",
    minSize: 30000,
    minChunks: 1,
    maxAsyncRequests: 5,
    maxInitialRequests: 3,
    automaticNameDelimiter: '~',
    name: true,
    cacheGroups: {
        vendors: {
            test: /[\\/]node_modules[\\/]/,
            priority: -10
        },
    default: {
            minChunks: 2,
            priority: -20,
            reuseExistingChunk: true
        }
    }
}

这个时候将webpack.common.js中splitChunks的内容更改如下:
webpack.common.js

splitChunks: {
            //对异步代码实现代码分割  //initial: 同步代码 //all: 对同步异步代码都进行代码分割
            chunks: "async", 
            minSize: 30000,  //大于该值做代码分割
            minChunks: 1,
            maxAsyncRequests: 5,
            maxInitialRequests: 3,
            automaticNameDelimiter: '~',
            name: true,
            cacheGroups: {
                vendors: false,
                default: false
            }
        }

运行npm run dev-build,是可以正常打包,说明chunks: "async"可以实现对异步代码代码分割。

接着将index.js文件中修改为同步代码:

//同步代码
import _ from 'lodash'
var ele = document.createElement('div')
ele.innerHTML = _.join(['yang', 'yue'], '-')
document.body.appendChild(ele)

如果按照源代码中chunks: "async"
运行npm run dev-build,发现对于同步代码引入lodash库都没有进行代码的分割

或者将webpack.common.js中splitChunks修改为 chunks: "all",也同样没有进行代码分割
在这里插入图片描述
原因是:
使用all对同步代码实现代码分割时,还会走cacheGroups这里,需要在这里做一些配置,才能实现同步的逻辑代码分割。
webpack.common.js

splitChunks: {
            //对异步代码实现代码分割  //initial: 同步代码 //all: 对同步异步代码都进行代码分割
            //使用all对同步代码实现代码分割时,还会走cacheGroups这里,需要在这里做一些配置
            chunks: "all", 
            minSize: 30000,  //大于该值做代码分割
            minChunks: 1,
            maxAsyncRequests: 5,
            maxInitialRequests: 3,
            automaticNameDelimiter: '~',
            name: true,
            cacheGroups: {
                vendors: {  //同步代码走这里
                    //引入的库文件是否在node_modules中,是就放在vendor组中
                    test: /[\\/]node_modules[\\/]/,  
                    priority: -10,
                },
                default: false
            }
        }

运行npm run dev-build,生成打包文件如下:
在这里插入图片描述
其中vendors~app.bundle.js的含义就是引入的库文件符合vendors组的要求,就会在前缀加上vendors组的组名。
希望把所有的库都打包到vendors.js里面,则加上filename

cacheGroups: {
                vendors: {  //同步代码走这里
                    //引入的库文件是否在node_modules中,是就放在vendor组中
                    test: /[\\/]node_modules[\\/]/,  
                    priority: -10,
                    filename: 'vendors.js'
                },
                default: false
            }

配置参数
1.minSize
接着继续说splitChunks中的配置项minSize:
minSize: 30000当引入的库文件大于该值3就做代码分割,小于就不做。

在src目录下新建一个test.js文件:
src/test.js

export default {
    name: 'yueyue'
}

src/index.js

import test from './test.js'
console.log(test.name)

并将webpaack.common.js中splitChunks配置项中的minSize: 0设置为0
运行npm run dev-build,发现并没有生成打包文件:
在这里插入图片描述
但其中test.js文件大小肯定是大于0的,原因是同步代码会走cacheGroups中vendors,发现test.js并不存在于node_modules中,就会走默认配置,而此时default: false,应该修改为:

cacheGroups: {
                vendors: {  //同步代码走这里
                    //引入的库文件是否在node_modules中,是就放在vendor组中
                    test: /[\\/]node_modules[\\/]/,  
                    priority: -10,
                    filename: 'vendors.js'
                },
                default: {     
                    priority: -20,
                    reuseExistingChunk: true,
                }
            }

完整splitChunks代码:

splitChunks: {
            //对异步代码实现代码分割  //initial: 同步代码 //all: 对同步异步代码都进行代码分割
            //使用all对同步代码实现代码分割时,还会走cacheGroups这里,需要在这里做一些配置
            chunks: "all", 
            minSize: 0,  //大于该值做代码分割
            minChunks: 1,
            maxAsyncRequests: 5,
            maxInitialRequests: 3,
            automaticNameDelimiter: '~',
            name: true,
            cacheGroups: {
                vendors: {  //同步代码走这里
                    //引入的库文件是否在node_modules中,是就放在vendor组中
                    test: /[\\/]node_modules[\\/]/,  
                    priority: -10,
                    filename: 'vendors.js'
                },
                default: {     
                    priority: -20,
                    reuseExistingChunk: true,
                }
            }
        }

运行npm run dev-build,生成打包文件如下:
在这里插入图片描述
2.minChunks
接着继续说splitChunks中的配置项minChunks:当一个模块至少被用了多少次后才对它进行代码分割,如果minChunks: 2,改为2时,运行npm run dev-build,发现就不会进行代码分隔了,因为入口文件里只引入了模块一次

3.maxAsyncRequests 和 maxInitialRequests

maxAsyncRequests: 5,   //同时加载的模块数最多5,对前5个做代码分割,超过5个不做代码分割
maxInitialRequests: 3, //入口文件引入的文件做代码分隔最多三个
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值