记一次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,一经查实,立即删除!

相关文章

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

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

实验一作业

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

php7引用计数,PHP7 引用计数 读书笔记

PHP7 引用计数 读书笔记每个 PHP 变量存在一个加 "zval" 的变量容器中. 一个 zval 变量容器, 除了包含变量的类型和值, 还包括两个字节的额外信息.1.is_ref : 是一个 bool 值, 用来标识这个变量是否属于引用集合. 通过这个字节, PHP 引擎才能把普通变量和引用变量区分…

焦呼?焦矣!

焦了。做了个香蕉蛋糕。总觉得它还没熟,就让它没完没了地烤着。于是焦了。可里面居然还是湿润的。是蛋糕的问题,还是6寸模的问题,还只是人的问题?烤一半时,爹临出门时,过来往上头按了一大拇指。很好&#x…

AJAX(2),我的第一个AJAX程序

首先&#xff0c;在VS2005中新建一个网站&#xff0c;拖入一个Button和Text,设置Button的客户端事件为userCheck(),<asp:TextBox ID"username"runat"server"></asp:TextBox><input type"button"name"check"value"…

[导入]ASP.NET 2.0中Page事件的执行顺序

文章来源:http://blog.csdn.net/21aspnet/archive/2007/03/20/1535517.aspx 转载于:https://www.cnblogs.com/zhaoxiaoyang2/archive/2007/03/21/816354.html

[导入]C#中TextBox只能输入数字的代码

文章来源:http://blog.csdn.net/21aspnet/archive/2007/03/20/1535640.aspx 转载于:https://www.cnblogs.com/zhaoxiaoyang2/archive/2007/03/21/816242.html

实验1c语言开发环境使用和数据类型、运算符和表达式

实验结论 由于这一次是第一次做实验有很多东西不熟悉 比如忘记加分号&#xff0c;用中文输入法打不对符号等等。总之经过这实验我学到了很多。#include <stdio.h> int main() {int x;printf("输入一个整数: \n");scanf("%d",&x);// 在处填写相应…

Nhibernate学习起步之many-to-one篇(转)

1. 学习目的: 通过进一步学习nhibernate基础知识&#xff0c;在实现单表CRUD的基础上&#xff0c;实现两表之间one-to-many的关系. 2. 开发环境必要准备 开发环境: windows 2003,Visual studio .Net 2005,Sql server 2005 developer edition 必要准备: 学习上篇文章单…

关于如何清除某个特定网站的缓存---基于Chrome浏览器

1、清除浏览器缓存 直接在浏览器设置里面清除浏览器的缓存会清除所有网站的缓存信息&#xff0c;这在某些时候是非常不方便的&#xff0c;毕竟不只有测试网站&#xff0c;还会有一些我们不想清除的信息也会被清除掉&#xff1b; 2、通过F12功能去清除浏览器缓存 转载于:https:/…

php中for循环流程图,PHP for循环

PHP for循环可以用来遍历一组指定的次数的代码。如果迭代次数已知&#xff0c;则应优先考虑使用for循环&#xff0c;否则使用while循环。for循环的语法for(initialization; condition; increment/decrement){ //code to be executed }for循环流程图示例代码-<?php for($n1;…

Spring中AOP切面编程学习笔记

注解方式实现aop我们主要分为如下几个步骤&#xff1a;  1.在切面类&#xff08;为切点服务的类&#xff09;前用Aspect注释修饰&#xff0c;声明为一个切面类。  2.用Pointcut注释声明一个切点&#xff0c;目的是为了告诉切面&#xff0c;谁是它的服务对象。&#xff08;此…

SpringCloud的学习记录(1)

最近一段时间重新学习一边SpringCloud&#xff0c;这里简单记录一下。 我用的是IntelliJ IDEA开发工具, SpringBoot的版本是2.1.3.RELEASE。 1. 构建Maven项目 整个的SpringCloud的项目是在Maven项目中的&#xff0c;这个Maven只做容纳其他项目使用, 比如后面Fegin/Config/Zipk…

html5 拖拽上传文件时,屏蔽浏览器默认打开文件

参考&#xff1a; https://www.cnblogs.com/kingsm/p/9849339.html 转载于:https://www.cnblogs.com/cwxwdm/p/10605529.html

php求数组交集的自定义函数,php数组交集函数

在数学中的交集运算&#xff0c;大家在学习的时候还是比较轻松的。我们在php数组里&#xff0c;可以借助array_intersect()函数对两个数组求交集&#xff0c;最后得到一个想要的交集数据。在正式开始array_intersect()使用前&#xff0c;我们需要先对函数的概念、语法、参数、返…

2016 hctf fheap 题解

题目链接 https://github.com/zh-explorer/hctf2016-fheap 题目分析 题目功能只有 malloc 和 free 的功能&#xff0c;查看堆的布局&#xff1a; 全局指针没有置空&#xff0c;导致 uaf 和 double free 漏洞&#xff0c;两种都可以做&#xff0c;但是这题的重点是绕过 PIE。 do…

Docker: Jenkins里的pipeline编写基本技巧

Jenkins里&#xff0c;先新建一个pipeline项目 Pipeline Syntax 在Sample Step里选择需要的插件&#xff0c;如果不存在&#xff0c;就去系统管理&#xff0c;插件管理里&#xff0c;进行安装。 如果源码管理工具用的是git,就在下拉里选择git 如果源码管理用的是svn&#xff0c…

《解剖PetShop》系列之三

《解剖PetShop》系列之三 三、PetShop数据访问层之消息处理 在进行系统设计时&#xff0c;除了对安全、事务等问题给与足够的重视外&#xff0c;性能也是一个不可避免的问题所在&#xff0c;尤其是一个B/S结构的软件系统&#xff0c;必须充分地考虑访问量、数据流量、服务器负荷…

简单理解bash和常规操作

1. 什么是bash&#xff1f; Bash shell是一个命令解释器&#xff0c;它是操作系统的外壳程序&#xff0c;负责处理用户命令与操作系统内核之间的交互&#xff0c;当用户输入一个命令并执行时&#xff0c;shell会把命令解释并传递给内核&#xff0c;然后再把内核输出返回给用户&…

昨夜的雨图片

昨天趟着淹没到屁股的雨水回家的&#xff0c;今天才知道&#xff0c;这是一场非常可怕的暴雨.本来就吓的够戗,现在直接两腿发软&#xff0c;几欲要哭了。想想真是后怕. 朋友说&#xff0c;你可真大胆,那么大雨你也敢趟.其实不是胆大,而是我走着走着水没的越来越往上了.幸亏个子…