2023-5-31 webpack (代码分离)

82 阅读2分钟

image.png

1.entry配置手动分离

image.png

entry写成对象配置为多入口的形式,[name]则为entry中的key

image.png

2.方式一: Entry Dependencies 入口依赖(不推荐): image.png

如图:将loadash单独打一个包,然后让index.js和main.js再分别引用loadash,避免打包出来的两个bundle.js引用两个loadash

image.png

image.png

方式二. optimization中通过splitChunks插件(webpack已经集成)设置splitChunks.chunks,帮助我们抽离依赖

image.png

image.png

image.png

如图entry中的分包都引用了lodash和dayjs, 通过splitChunks.chunks设置为all,打包后的依赖则会被抽离到232.bundle.js,而不会被打包在两个bundle.js

image.png

具体属性:

minSize(如果大于minSize才进行拆分)

maxSize(将大于maxSize的包,拆分成不小于minSize的包)

minChunks(如果引用次数大于minChunks,则进行拆分)

为什么默认的打包能够将第三方库拆分出来,就是因为cacheGroup里面定义了vendor这个缓存组,test设置为?/[/]node_modules[/]/?表示只筛选从node_modul文件夹下引入的模块,所以所有第三方模块才会被拆分出来。除此之外还有一个default缓存组,会将至少有两个chunk引入的模块进行拆分

如果一个包既匹配上vendor中的test(属于node_modules),又被最小引入了两次,那么会根据priority优先级来判断分包到哪个组(vendor组或default组)

总结: 一般开发中只需要设置chunks: "all"即可

image.png

无论splitChunks如何设置,只要是异步导入(import懒加载)的代码,webpack都会进行代码分离

image.png

image.png

如图: entry中我们设置了main和index,那么打包出来的[name]就是main和index,但是如果我们没做设置,那么打包出来的bundle.js名称则会采用chunkIds指定的算法

optimization.chunkIds在开发环境推荐named,生产环境推荐deterministic

image.png

filename: 设置初始代码(同步代码,包括import xxx from xxx)打包出来的文件名

chunkFilename: 设置异步代码(import懒加载等)打包出来的文件名

一般filename我们用[name].bundle.js, chunkFilename我们用[name].chunk.js

image.png

image.png

在懒加载前面添加魔法注释,则webpack在进行代码分离的时候会为异步代码设置不同的名字而不会用id