记一次webpack4+react+antd项目优化打包文件体积的过程

背景

  最近自己整了一个基于webpack4和react开发的博客demo项目,一路整下来磕磕碰碰但也实现了功能,就准备发到阿里云上面去看看,借用了同事的阿里云小水管服务器,配置完成之后首页加载花了十几秒,打开控制台network查看资源,打包的js体积有将近6M,及其影响访问体验,于是就开始了优化的路。

 

原因和解决方法

  在webpack的配置文件中,对公共js做了抽取,分别会打包出react-verdor.js和antd-verdor.js,优化前的antd-verdor足足有4m大小,估计是把antd组件全部加载下来了,顺着这个思路查找解决方案。

optimization.splitChunks: {chunks: 'all',cacheGroups: {"react-vendor": {test: (module) => (/react/.test(module.context) || /redux/.test(module.context)|| /classnames/.test(module.context) || /prop-types/.test(module.context)),priority: 3,reuseExistingChunk: false},"antd-vendor": {// || /[\\/]node_modules[\\/]/.test(module.context)test: (module) => (/antd/.test(module.context)),priority: 2,reuseExistingChunk: false},}}

 

antd官方推荐按需加载,我开始也是根据官方推荐做的,在.babelrc做如下配置

{"plugins": [["import", {"libraryName": "antd","libraryDirectory": "es","style": "css"
    }]]
}

不过事实是打包文件有4M,那肯定是配置错了,继续查找别的配置方法,终于找到一个管用的,在webpack配置文件中做如下配置(本质上还是自己太菜,不理解.babelrc)

{test: /\.(js|jsx)/,use: {loader:'babel-loader',options: {presets: ["env", "react", 'stage-0'],plugins: [['import', [{ libraryName: 'antd', style: true }]]]}},include: resolve('src')},

配置完成后进行打包,体积明显变小了,antd-vendor.js的大小变成200多K。antd按需引入的问题解决后,看别的文件还是挺大的,于是决定把REACT中的组件也做成按需加载的方式,拆分更多的js出来,这里使用了react-loadable实现,拆分完成之后继续打包,发现部分子js的体积明显过大,继续查找原因。

在浏览器中跳转到对应的页面查看加载的js,查看js文件中的注释,发现有两个第三方插件被我全部import进来了了,其实我永不到那么多,分别是

crypto和highlightjs,crypto是一个加密算法库,提供md5和sha 256等经典加密算法,我这个项目中只在登录时用到了一次加密密码,而那个页面对应的js有500多k,问题显而易见,通过下面这个修改把问题解决了
//修改前

import crypto from ('crypto')module.exports = {MD5_SUFFIX: 'sskjtxdywdddzyjknn',md5: function (pwd) {let md5 = crypto.createHash('md5');return md5.update(pwd).digest('hex')},
}//修改后

const md5 = require("crypto-js/md5")module.exports = {MD5_SUFFIX: 'sskjtxdywdddzyjknn',md5: function (pwd) {return md5.update(pwd).digest('hex')},
}

 

解决引入highlightjs后文件的过大的的思路和上面类似,我选择了直接加载hightlightjs保留核心功能后的压缩代码,size只有30k,而之前的默认import后的size有将近1M

 

还能优化吗

前面发现的问题不外乎是由第三方库造成的,解决了前面的问题后,此时的js体积已经从之前的6M降到1.8M了。那么还能继续通过webpack配置来优化打包后的文件大小吗?抱着这个疑问继续查找解决方案,最后决定试一试这个文章说明的方法 

https://zhuanlan.zhihu.com/p/36280323

一顿操作下来打包出来的文件只减小了30K,最后再放上配置文件js的完整代码,希望能有大佬提出建议,非常

//webpack.base.config.js

module.exports = {/*entry: {app: './src/index.jsx',},*/output: {publicPath: process.env.NODE_ENV === config.prod.ENV? config.prod.assetsPublicPath: config.dev.assetsPublicPath},resolve: {extensions: ['.js', '.jsx', '.json'],alias: {'@components': path.resolve(__dirname, '../src/components'),'@': resolve('src'),}},module: {rules: [{test: /\.(js|jsx)/,use: {loader: 'babel-loader',options: {presets: ["env", "react", 'stage-0'],plugins: [['import', [{ libraryName: 'antd', style: true }]]]}},include: resolve('src')},{test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,loader: 'url-loader',options: {limit: 10000,name: assetsPath('img/[name].[ext]')}},{test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/,loader: 'url-loader',options: {limit: 10000,name: assetsPath('media/[name].[ext]')}},{test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,loader: 'url-loader',options: {limit: 10000,name: assetsPath('font/[name].[ext]')}},{test: /\.css$/,use: [{loader: 'style-loader'}, {loader: "css-loader",options: {name: "[path][name].[ext]",}}]},{test: /\.less$/,exclude: /node_modules/,use: [MiniCssExtractPlugin.loader,'css-loader','less-loader',]},{test: /\.less$/,include: /node_modules/,use: [MiniCssExtractPlugin.loader,'css-loader',{'loader': 'less-loader',options: {javascriptEnabled: true}}]}]},plugins: [new MiniCssExtractPlugin({filename: '[name].css'}),new LodashModuleReplacementPlugin]
}//webpack.prod.config.js

const webpackConfig = merge(baseWebpackConfig, {entry: {app: './src/index.jsx',},mode: 'production',devtool: false,output: {path: config.prod.assetsRoot,filename: assetsPath('js/[name].[chunkhash].js'),chunkFilename: assetsPath('js/[name].[chunkhash].js'),},plugins: [new HtmlWebpackPlugin({filename: 'index.html',title: pkg.description,template: path.resolve(__dirname, '../index.html'),inject: true,minify: {removeComments: true,collapseWhitespace: true,removeRedundantAttributes: true,useShortDoctype: true,removeEmptyAttributes: true,removeStyleLinkTypeAttributes: true,keepClosingSlash: true,minifyJS: true,minifyCSS: true,minifyURLs: true,},}),new CopyWebpackPlugin([{from: path.resolve(__dirname, '../src/static'),to: config.prod.assetsSubDirectory,}])],optimization: {minimizer: [new UglifyJsPlugin(),new OptimizeCSSAssetsPlugin(),new TerserPlugin({terserOptions: {parse: {ecma: 8,},compress: {ecma: 5,warnings: false,comparisons: false,inline: 2,},mangle: {safari10: true,},output: {ecma: 5,comments: false,ascii_only: true,},},// Use multi-process parallel running to improve the build speed// Default number of concurrent runs: os.cpus().length - 1parallel: true,// Enable file cachingcache: true,sourceMap: false,}),],splitChunks: {chunks: 'all',cacheGroups: {"react-vendor": {test: (module) => (/react/.test(module.context) || /redux/.test(module.context)|| /classnames/.test(module.context) || /prop-types/.test(module.context)),priority: 3,reuseExistingChunk: false},"antd-vendor": {// || /[\\/]node_modules[\\/]/.test(module.context)test: (module) => (/antd/.test(module.context)),priority: 2,reuseExistingChunk: false},}}}
})

 

感谢!

 

转载于:https://www.cnblogs.com/haimianxiubaobao/p/10566799.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/411996.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java hashedmap_Java基础 - Map接口的实现类 : HashedMap / LinkedHashMap /TreeMap 的构造/修改/遍历/ 集合视图方法/双向迭代输出...

import java.util.*;/**一:Collection接口的* Map接口: HashMap(主要实现类) : HashedMap / LinkedHashMap /TreeMap* Map接口:对, 重复的键会进行值得覆盖 ,输出顺序和放入顺序是不一定可以保持顺序的!* 修改查询操作: 1.put(key, value), 2.remove(key) 3.putAll(其他map), 复…

[vue] vue如何优化首页的加载速度?

[vue] vue如何优化首页的加载速度? 补充下2楼: ssr直出, webpack压缩HTML/CSS/JS, 首屏css单独提取内联, 关键资源Proload, 图片:不缩放,使用webp、小图片base64,iconfo…

25岁了

忙了一天,在下午收到kk的email才想起来今天是自己的生日,应该请大家吃蛋糕的。想想这一年过得真快,2006这几个数字我还没有写惯,就要开始写2007了。时光如梭,一点都不假。 25岁啰,转眼间自己怎么就这把年纪…

java同时满足语句_关于控制语句,下列哪些说法符合《阿里巴巴Java开发手册》:...

案例分析一:假定CPU的主频是500MHz。硬盘采用DMA方式进行数据传送,其数据传输率为4MB/s, 每次DMA传输的数据量为8KB, 要求没有任何数据传输被错过。如果CPU在DMA初始化设置和启动硬盘操作等方面用了1000个时钟周期,并且在DMA传送完成后的中断…

【java小知识】FileReader读取文件出现乱码的解决办法

转1:https://blog.csdn.net/a532672728/article/details/79432619 转2:https://www.cnblogs.com/qq78292959/p/3794993.html 小结: 1)注意txt文件,保存的格式,Windows的记事本默认保存的ANSI,我…

[vue] 说说你对vue组件的设计原则的理解

[vue] 说说你对vue组件的设计原则的理解 第一: 容错处理, 这个要做好, 极端场景要考虑到, 不能我传错了一个参数你就原地爆炸 第二: 缺省值(默认值)要有, 一般把应用较多的设为缺省值 第三: 颗粒化, 把组件拆分出来. 第四: 一切皆可配置, 如有必要, 组件里面使用中文标点符号,…

最高法院明确反向工程合法 腾讯诉PICA恐生变

原文: http://it.sohu.com/20070118/n247688457.shtml通过自行开发研制或者反向工程等方式获得的商业秘密,将不被认定为反不正当竞争法有关条款规定的侵犯商业秘密行为。 昨天,最高人民法院发布的第一个涉及不正当竞争案件审理的司法解释明确了以上规则。…

[19/03/16-星期六] 常用类_Date时间类DateFormat类

一、Date时间类 计算机中 以1970 年 1 月 1 日 00:00:00定为基准时间,每个度量单位是毫秒(1秒的千分之一) 用ong类型的变量来表示时间,如当前时刻数值:long now new System.currentTimeMillis(); 【常用方法】 1. Date() 分配一个Date对象&a…

php array第一张图片_PHP array_udiff() 函数

PHP array_udiff() 函数实例比较两个数组的键值(使用用户自定义函数比较键值)&#xff0c;并返回差集&#xff1a;<?php function myfunction($a,$b){if ($a$b){return 0;}return ($a>$b)?1:-1;}$a1array("a">"red","b">"gre…

在FF与IE中使用数据岛

在FF与IE中使用数据岛 <div style"display:none;"><xml id"XMLNode"><xmp><Root>...<III><![CDATA[***]]></III>...</Root></xmp></xml></div><script language"javascript>…

[vue] 怎么缓存当前打开的路由组件,缓存后想更新当前组件怎么办呢?

[vue] 怎么缓存当前打开的路由组件&#xff0c;缓存后想更新当前组件怎么办呢&#xff1f; 可以在路由meta中加入参数, 对打开的路由进行keep-alive的判断, 通过钩子active等个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很…

实验一作业

Part1&#xff1a;实验总结体会 1.实验过程对程序编码的使用不熟练&#xff0c;经常在书写代码过程中有停顿与疑惑&#xff0c;但熟能生巧&#xff0c;经过训练还是有不少收获&#xff1b; 2.实验内容不够严谨&#xff0c;容易犯小错误&#xff0c;还是需要勤加练习&#xff1b…

php 点击选择图片上传,php上传多张图片时,选择图片后即可预览的问题

这几天一直在解决一个问题&#xff0c;上传图片时选择成功后就能预览。需求&#xff1a;在点击上传图标的时候会在前面的input框中显示出文件名&#xff0c;然后点击后面的查看按钮就可以预览选择的这张图片了&#xff0c;要求不能刷新页面1.一开始的时候打算用ajax上传&#x…

[vue] prop是怎么做验证的?可以设置默认值吗?

[vue] prop是怎么做验证的&#xff1f;可以设置默认值吗&#xff1f; 单个类型就用Number等基础类型&#xff0c;多个类型用数组&#xff0c;必填的话设置require为true&#xff0c;默认值的话设置default&#xff0c;对象和数组设置默认用工厂函数&#xff0c;自定义验证函数…

python在函数外调用变量

def a&#xff08;&#xff09;&#xff1a; global phone phoneinput&#xff08;请输入手机号码&#xff09; def b (): idphone print(id) 在函数内用global定义变量&#xff0c;变量外就可使用该变量转载于:https://www.cnblogs.com/zhujunsheng/p/10570169.html

php怎么更新多条数据,PHP中批量更新数据表中多条记录

class test {/*** 创建像这样的查询: "IN(a,b)";** author wengxianhu* created to 2013-05-27* param mix $item_list 列表数组或字符串,如果为字符串时,字符串只接受数字串* param string $field_name 字段名称* return void*/public function db_create_in($item_…

共享一些变态的签名,希望不太OLD

1.人的一生就象在拉屎,有时你已经很努力了可出来的只是一个屁.2.小时侯&#xff0c;我家里很穷&#xff0c;没钱买自行车&#xff0c;我只好每天打的上学。初中的时候&#xff0c;因为我成绩太突出&#xff0c;学校领导留我多读了两年。初中毕业后&#xff0c;高中的校长觉得我…

[vue] prop验证的type类型有哪几种?

[vue] prop验证的type类型有哪几种&#xff1f; props:{title:String,likes: Number,isPublished: Boolean,commentIds: Array,author: Object,callback: Function,contactsPromise: Promise }个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#x…

Electron是个啥?

于2013年作为构建Github上可编辑的文本编辑器Atom的框架而被开发出来 是目前开源开发者、初创企业和老牌公司常用的开发工具 是桌面应用框架 相当于一个浏览器的外壳&#xff0c;可以把网页程序嵌入到壳里面&#xff0c;可以运行在桌面上的一个程序 把网页打包成一个在桌面运行…

php中什么是函数函数的意义是什么,php中arsort函数的功能起什么作用呢?

摘要:下文讲述php中arsort函数的功能讲解&#xff0c;如下所示&#xff1b;arsort函数功能说明:根据数组的值进行降序排列arsort语法:arsort(array,sortingtype);--------参数说明------array:必填参数,待进行操作的数组sortingtype&#xff1a;非必填参数&#xff0c;此参数值…