记一次react前端项目打包优化的方法


Posted in Javascript onMarch 30, 2020

前文

之前一年多前接手的一个react项目,前段时间因为做业务中台项目,对公司现有的应用项目做中台化改造,这期间将项目部署到uat环境,测试期间,测试小妹妹和产品大叔都吐槽进入uat项目的时候要load很久,白屏时间超过30s,体验很差,生产不至于这么慢但也是白屏时间挺长的,所以减少白屏时间增加用户体验成为了当务之急。复制代码

分析

通过控制台判断加载资源时间还有资源大小

记一次react前端项目打包优化的方法

通过开发者工具可以看到白屏的主要原因在于bundle.js这个打包后的文件过大,达到3.6M加上uat环境带宽等问题的话,光加载这个bundle.js就花了30s+,所以白屏时间太长,用户体验差要解决这个问题就得从这个bundle.js入手复制代码

通过webpack-bundle-analyzer来分析主要是哪些模块过大

const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin
const webpackConfigDev = {
  plugins: [
    ......
    new BundleAnalyzerPlugin({ analyzerPort: 3012 }),
  ]
}

记一次react前端项目打包优化的方法

这是本地开发时候打包的情况,没有gzip的情况下是这么大的,本地开发编译打包也是挺慢的从上图看可以分析出几个比较大的模块,其中一个最大的是echarts,另外就是源文件src目录下的代码所以优化分为三步来走:

1.优化echarts;

2.优化src下的业务代码;

3.对打包后的文件进行gzip压缩;

优化

优化echarts

echarts在项目中用到的地方不少,但是业务平时很少用到对应的模块,整个打包进去bundle.js只会让整个包变大思路是echarts文件不打包进bundle.js,采用cdn的方法引入复制代码

优化echarts相关代码

1.入口文件index.html这里直接用script直接引入cdn的echarts文件

<head>
   <meta charset="UTF-8">
   <meta http-equiv="Cache-Control" content="max-age=604800" />
   <script src="https://cdn.bootcss.com/echarts/4.2.1-rc1/echarts.min.js"></script>
   <title>TCRM</title>
 </head>
 <body>

2.使用echarts的地方改为下面这样引入

原先的   var myChart = echarts.init(this.refs.char,'crm');

改版后    var myChart = this.$echarts.init(this.refs.char,'crm');

优化src文件

对于用户来说,可能每次操作的时候只操作对应的几个模块,其他模块很少操作到,如果能够按需加载那就可以化整为零每次加载当前模块的chunk,既不影响用户使用,又减少加载的资源参考了一下其他文章,决定采用react-loadable进行切割划分,按路由来切割资源复制代码

react-loadable相关代码

原先写法,组件引入

import Dashboard from './components/Dashboard';

使用react-loadable后

import Loadable from 'react-loadable';
const LoadingFun = () => {
  return <div className="center-div"><Spin spinning={true} size="large" tip="加载中..."/></div>;
};
const Dashboard = Loadable({loader: () => import('./components/Dashboard'), loading: LoadingFun});

webpack相关
const webpackConfigBase = {
  ......
  output: {
    path: resolve('./dist'),
    filename: 'bundle.[hash:6].js',
    chunkFilename: 'chunks/[name].[hash:6].js',
  }  
}

本地运行分chunks打包

记一次react前端项目打包优化的方法 

记一次react前端项目打包优化的方法

 分步打包碰到的问题

1.打包样式问题,所有的css打包到bundle.css中,但是采用按路由打包后测试的小妹妹反馈样式很奇怪看了一下加载的资源,发现确实没有打包到不同路由下的样式,检查了一下,发现是webpack配置里面要配合改一下

const webpackConfigBase = {
  ......
  plugins: [
    // 提取css
    //原先的 new ExtractTextPlugin('bundle.[hash:6].css'),
    new ExtractTextPlugin({filename: 'bundle.[hash:6].css', allChunks: true}), // 增加一个allChunks:true 
  ]
}

2.chunk的名字问题,先要指定对应的chunkName参考 https://github.com/mrdulin/blog/issues/43

gzip压缩

项目是用的nginx做代理调用打包后的资源,所以可以考虑在nginx这一层增加配置配合gzip文件

新增相关配置

gzip on;
gzip_min_length 1k;
gzip_buffers   4 16k;
gzip_http_version 1.1;
gzip_comp_level 9;
gzip_types    text/plain application/x-javascript text/css application/xml text/javascript application/x-httpd-php application/javascript application/json;
gzip_disable "MSIE [1-6]\.";
gzip_vary on;

优化成果

记一次react前端项目打包优化的方法

echarts通过cdn引入,成功
bundle.js体积大大减小,加载时间也由原先的30s+降到了3s+,生产环境带宽更高会更快,成功
切换路由加载对应的chunk文件,使用正常,成功

到此这篇关于记一次react前端项目打包优化的方法的文章就介绍到这了,更多相关react前端项目打包优化内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
Extjs4 类的定义和扩展实例
Jun 28 Javascript
javascript判断chrome浏览器的方法
Mar 26 Javascript
JavaScript实现Flash炫光波动特效
May 14 Javascript
浅谈window对象的scrollBy()方法
Jul 15 Javascript
jQuery遍历DOM元素与节点方法详解
Apr 14 Javascript
js 判断各种数据类型的简单方法(推荐)
Aug 29 Javascript
本地Bootstrap文件字体图标引入却无法显示问题的解决方法
Apr 18 Javascript
微信小程序动态添加分享数据
Jun 14 Javascript
Express下采用bcryptjs进行密码加密的方法
Feb 07 Javascript
vuex如何重置所有state(可定制)
Jan 17 Javascript
Vue.js + Nuxt.js 项目中使用 Vee-validate 表单校验
Apr 22 Javascript
微信小程序监听用户登录事件的实现方法
Nov 11 Javascript
12 种使用Vue 的最佳做法
Mar 30 #Javascript
javascript实现简易数码时钟
Mar 30 #Javascript
vue计算属性+vue中class与style绑定(推荐)
Mar 30 #Javascript
Bootstrap简单实用的表单验证插件BootstrapValidator用法实例详解
Mar 29 #Javascript
JS实现滑动拼图验证功能完整示例
Mar 29 #Javascript
json_decode 索引为数字时自动排序问题解决方法
Mar 28 #Javascript
JS中FormData类实现文件上传
Mar 27 #Javascript
You might like
一周让你学会PHP 不错的学习资料
2009/02/06 PHP
php 使用redis锁限制并发访问类示例
2016/11/02 PHP
PHP面向对象程序设计之对象生成方法详解
2016/12/02 PHP
PHP实现非阻塞模式的方法分析
2018/07/26 PHP
javascript 获取url参数和script标签中获取url参数函数代码
2010/01/22 Javascript
爆炸式的JS圆形浮动菜单特效代码
2010/03/03 Javascript
基于JQuery实现相同内容合并单元格的代码
2011/01/12 Javascript
javascript 获取网页标题代码实例
2014/01/22 Javascript
jQuery选择器简明总结(含用法实例,一目了然)
2014/04/25 Javascript
Angular-Touch库用法示例
2016/12/22 Javascript
vue2中filter()的实现代码
2017/07/09 Javascript
vue中的非父子间的通讯问题简单的实例代码
2017/07/19 Javascript
JScript实现表格的简单操作
2017/08/15 Javascript
使用Bootrap和Vue实现仿百度搜索功能
2017/10/26 Javascript
如何从零开始利用js手写一个Promise库详解
2018/04/19 Javascript
Vue波纹按钮组件制作
2018/04/30 Javascript
react中Suspense的使用详解
2019/09/01 Javascript
Vue中 axios delete请求参数操作
2020/08/25 Javascript
解决antd Form 表单校验方法无响应的问题
2020/10/27 Javascript
[01:51]2014DOTA2国际邀请赛 这个赛场没有失败者VGTi5再见
2014/07/23 DOTA
[09:13]DOTA2-DPC中国联赛 正赛 Ehome vs Magma 选手采访 1月19日
2021/03/11 DOTA
pandas数据预处理之dataframe的groupby操作方法
2018/04/13 Python
python 解决cv2绘制中文乱码问题
2019/12/23 Python
python深copy和浅copy区别对比解析
2019/12/26 Python
ansible-playbook实现自动部署KVM及安装python3的详细教程
2020/05/11 Python
Python 使用双重循环打印图形菱形操作
2020/08/09 Python
python 指定源路径来解决import问题的操作
2021/03/04 Python
html5 canvas-2.用canvas制作一个猜字母的小游戏
2013/01/07 HTML / CSS
市优秀教师事迹材料
2014/02/05 职场文书
高中军训感言400字
2014/02/24 职场文书
税务干部群众路线教育实践活动对照检查材料
2014/09/20 职场文书
法律专业大学生职业生涯规划书:向目标一步步迈进
2014/09/22 职场文书
2014年中学生检讨书大全
2014/10/09 职场文书
2015年重阳节活动总结
2015/03/24 职场文书
仓管员岗位职责范本
2015/04/01 职场文书
Python selenium模拟网页点击爬虫交管12123违章数据
2021/05/26 Python