Webpack性能优化 SplitChunksPlugin的使用详解
使用前景
在vue、react等使用webpack为项目打包工具的前端项目,在开发过程中,随着项目功能的逐渐增加,项目整体体积的不断增加,打包的时长和打包后部署的项目体积也在不停的增长,这样可能会导致一下两个问题:
- 使用自动化部署工具Jenkins部署时,Jenkins因内存不足而崩溃
- 打包产物过大,用户的首屏加载缓慢,网页响应用户操作时延较长,令用户感觉卡顿,整体体验不佳
解决方式
代码分片与公共模块提取
优点:
- 开发过程中减少重复模块打包,可以提升开发速度
- 减少整体资源体积
- 合理分片后的代码可以更有效地利用客户端缓存
使用插件
- 在webpack3中使用CommonChunksPlugin (不在这里展开说明)
- 在webpack4及之后的版本使用SplitChunksPlugin
CommonChunksPlugin
CommonsChunkPlugin是一个可选功能,它创建一个单独的文件(称为块),由多个入口点之间共享的公共模块组成。
通过将通用模块从bundle中分离出来,生成的块文件可以在最初加载一次,并存储在缓存中供以后使用。这可以优化页面速度,因为浏览器可以快速地从缓存中提供共享代码,而不是在访问新页面时强制加载更大的包。它具有以下优点
SplitChunksPlugin
最初,chunks(以及内部导入的模块)是通过内部 webpack 图谱中的父子关系关联的。CommonsChunkPlugin 曾被用来避免他们之间的重复依赖,但是不可能再做进一步的优化。
从 webpack v4 开始,移除了 CommonsChunkPlugin,取而代之的是 optimization.splitChunks。
SplitChunksPlugin 的配置
部分配置项说明
splitChunks.chunks
这表明将选择哪些 chunk 进行优化。当提供一个字符串,有效值为 all,async 和 initial。设置为 all 可能特别强大,因为这意味着 chunk 可以在异步和非异步 chunk 之间共享。
splitChunks.cacheGroups
缓存组可以继承和/或覆盖来自 splitChunks.* 的任何选项。但是 test、priority 和 reuseExistingChunk 只能在缓存组级别上进行配置。将它们设置为 false以禁用任何默认缓存组
splitChunks.cacheGroups.{cacheGroup}.reuseExistingChunk
默认值为 true
如果当前 chunk 包含已从主 bundle 中拆分出的模块,则它将被重用,而不是生成新的模块。这可能会影响 chunk 的结果文件名。
splitChunks.cacheGroups.{cacheGroup}.priority
一个模块可以属于多个缓存组。优化将优先考虑具有更高 priority(优先级)的缓存组。默认组的优先级为-20,以允许自定义组获得更高的优先级(自定义组的默认值为 0)。
注意:优先级值会影响html中打包后js的引入顺序
默认配置
optimization: {
splitChunks: {
chunks: 'async',
minSize: 20000,
minRemainingSize: 0,
minChunks: 1,
maxAsyncRequests: 30,
maxInitialRequests: 30,
enforceSizeThreshold: 50000,
cacheGroups: {
defaultVendors: {
test: /[\\/]node_modules[\\/]/,
priority: -10,
reuseExistingChunk: true,
},
default: {
minChunks: 2,
priority: -20,
reuseExistingChunk: true,
},
},
},
},
配置例子
optimization:{
splitChunks:{
chunks: "all",
minSize:20000,// 允许新拆出 chunk 的最小体积,也是异步 chunk 公共模块的强制拆分体积
maxAsyncRequests:6,// 每个异步加载模块最多能被拆分的数量
maxInitialRequests: 6,// 每个入口和它的同步依赖最多能被拆分的数量
enforceSizeThreshold:50000,// 强制执行拆分的体积阈值并忽略其他限制
cacheGroups:{
libs:{ // 第三方库
name: "chunk-libs",
test: /[\V/]node_modules[\\/]/,
priority: 10,
chunks:"initial”// 只打包初始时依赖的第三方
},
ckeditor5_document:{ // 第三方库
name:"chunk-ckeditor5-document",
test:/[\V/]assets[\V/]common[\V/]js[\V/]ckeditor5[\\/]ckeditor5-build-decoupled-document[\//]/,
priority: 20
},
ckeditor5_vue2:{ // 第三方库
name:"chunk-ckeditor5-vue2",
test:/[\V/]assets[\V/]common[\V/]js[\V/]ckeditor5[\\/]ckeditor5-vue2[\\/]/,
priority:20
},
elementUI:{ // elementuI 单独拆包
name:"chunk-elementUI",
test:/[\V/]node_modules[\V]element-ui[\/]/,
priority: 20 // 权重要大于 libs
},
echarts:{ // echarts 单独拆包
name:"chunk-echarts",
test: /[\\/]node_modules[\V/]echarts[\\/]/,
priority: 20 // 权重要大于 libs
},
src:{ // echarts 单独拆包
name:"chunk-src",
test: /[\V/]src[\\/]/,
chunks:'all',
priority: 10 // 权重要大于 libs
},
commons:{ // 公共模块包
name: `chunk-commons`,
minChunks:2,
priority: 0,
reuseExistingChunk:true //
}
}
]
}
配置前后打包对比
使用打包分析插件
webpack-bundle-analyzer:一个 plugin 和 CLI 工具,它将 bundle 内容展示为一个便捷的、交互式、可缩放的树状图形式。
安装
# NPM
npm install --save-dev webpack-bundle-analyzer
# Yarn
yarn add -D webpack-bundle-analyzer
用法(在webpack配置文件中)
const { BundleAnalyzerPlugin }= require('webpack-bundle-analyzer');
...
plugins: [
new BundleAnalyzerPlugin()
]
打包分析
使用配置前
使用配置后
使用前 | 使用后 | |
---|---|---|
包体积 | 24.69MB | 8.23MB |
文中使用的插件
CommonsChunkPlugin、SplitChunksPlugin
Webpack性能优化 SplitChunksPlugin的使用详解的更多相关文章
- mysql服务性能优化—my.cnf配置说明详解
MYSQL服务器my.cnf配置文档详解硬件:内存16G [client]port = 3306socket = /data/3306/mysql.sock [mysql]no-auto-rehash ...
- Tomcat 优化方案 和 配置详解(转)
转自 Tomcat 优化方案 和 配置详解 http://201605130349.iteye.com/blog/2298985 Server.xml配置文件用于对整个容器进行相关的配置. <S ...
- Java性能分析之线程栈详解与性能分析
Java性能分析之线程栈详解 Java性能分析迈不过去的一个关键点是线程栈,新的性能班级也讲到了JVM这一块,所以本篇文章对线程栈进行基础知识普及以及如何对线程栈进行性能分析. 基本概念 线程堆栈也称 ...
- Java生产环境下性能监控与调优详解视频教程 百度云 网盘
集数合计:9章Java视频教程详情描述:A0193<Java生产环境下性能监控与调优详解视频教程>软件开发只是第一步,上线后的性能监控与调优才是更为重要的一步本课程将为你讲解如何在生产环境 ...
- webpack性能优化——DLL
Webpack性能优化的方式有很多种,本文之所以将 dll 单独讲解,是因为 dll 是一种最简单粗暴并且极其有效的优化方式. 在通常的打包过程中,你所引用的诸如:jquery.bootstrap.r ...
- loadrunner 脚本优化-关联函数web_reg_save_param()函数详解
脚本优化-关联函数web_reg_save_param()函数详解 by:授客 QQ:1033553122 Insert->New Step,打开Add Step对话框 选择函数web_re ...
- (转)MySQL性能调优my.cnf详解
MySQL性能调优my.cnf详解 https://blog.linuxeye.cn/379.html http://blog.csdn.net/orichisonic/article/details ...
- webpack 性能优化 dll 分包
webpack 性能优化 dll 分包 html-webpack-externals-plugin DLLPlugin https://www.webpackjs.com/configuration/ ...
- Webpack 性能优化 (一)(使用别名做重定向)
前言 Webpack 是 OneAPM 前端技术栈中非常重要的一部分.它非常好用,假设你还不了解它,建议你阅读这篇Webpack 入门指迷,在 OneAPM 我们用它完毕静态资源打包.ES6 代码的转 ...
- webpack学习(五)配置详解
配置详解 //使用插件html-webpack-plugin打包合并html //使用插件extract-text-webpack-plugin打包独立的css //使用UglifyJsPlugin压 ...
随机推荐
- aspnetcore最最简单的接口权限认证
五月一眨眼就过去,就当凑个数吧. 场景: 一个小小的项目,需要一个后台,就展示几个列表,连用户表.角色表等都不需要设计. 之前有写过identityserver4和jwt4的demo (exercis ...
- 【Photoshop】切图保存小坑(选择png格式得到gif问题)
默认情况下:Photoshop 导出切片为[GIF]格式 当你很嗨皮的把[GIF]调整为[PNG]或[JPG]格式,并保存时: 你会发现,自己的图片格式莫名其妙还是[GIF]: 但,我们的期望是: 原 ...
- Python异步编程之web框架 异步vs同步 Redis并发对比
测试基本信息 主题:比较异步框架和同步框架在RedisIO操作的性能差异 python版本:python 3.8 数据库:redis 5.0.7 压测工具:locust web框架:同步:flask ...
- React后台管理系统(TypeScript、Redux状态管理)环境搭建01
搭建环境的时候,我们必须要先确保环境有node环境和npm环境,如下使用cmd命令 确保自己有了这两个环境之后我们就可以开始搭建项目,首先找一个文件夹,这个文件夹用来初始化当前环境,例如,我这里选 ...
- ASP.NET Core 6框架揭秘实例演示[42]:检查应用的健康状况
现代化的应用及服务的部署场景主要体现在集群化.微服务和容器化,这一切都建立在针对部署应用或者服务的健康检查上.ASP.NET提供的健康检查不仅可能确定目标应用或者服务的可用性,还具有健康报告发布功能. ...
- 力扣 (LeetCode)算法入门——Day1
704. 二分查找 题目:给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1. ...
- 图扑 AR 技术应用与管理:施工建造、机柜扫描、办公室导航解决方案
随着科技的不断革新和创新,越来越多的行业开始迎来数字化时代的变革.建筑行业作为人类历史上最重要的产业之一,在数字化转型方面同样也在不断推进.图扑软件结合 AR 技术的应用,为建筑行业带来了更加便捷高效 ...
- 使用LabVIEW实现 DeepLabv3+ 语义分割含源码
前言 图像分割可以分为两类:语义分割(Semantic Segmentation)和实例分割(Instance Segmentation),前面已经给大家介绍过两者的区别,并就如何在labview上实 ...
- java开发的配置文件配置到数据库(配置到配置文件里面个人感觉修改较麻烦,故配置到数据库)
配置文件的创建表sql CREATE TABLE `checkwork_tab_properties` ( `id` varchar(50) NOT NULL COMMENT '主键id', `typ ...
- 你知道.NET的字符串在内存中是如何存储的吗?
毫无疑问,字符串是我们使用频率最高的类型.但是如果我问大家一个问题:"一个字符串对象在内存中如何表示的?",我相信绝大部分人回答不上来.我们今天就来讨论这个问题. 一.字符串对象的 ...