记一次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 相关文章推荐
js form 验证函数 当前比较流行的错误提示
Jun 23 Javascript
Jquery公告滚动+AJAX后台得到数据
Apr 14 Javascript
js查错流程归纳
May 04 Javascript
重写document.write实现无阻塞加载js广告(补充)
Dec 12 Javascript
JavaScript实现网页加载进度条代码超简单
Sep 21 Javascript
浅谈javascript中onbeforeunload与onunload事件
Dec 10 Javascript
用js实现简单算法的实例代码
Sep 24 Javascript
angular2组件中定时刷新并清除定时器的实例讲解
Aug 31 Javascript
vue+iview/elementUi实现城市多选
Mar 28 Javascript
微信小程序之数据绑定原理解析
Aug 14 Javascript
解决在Vue中使用axios用form表单出现的问题
Oct 30 Javascript
vuex管理状态仓库使用详解
Jul 29 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
德生PL450的电路分析和低放电路的改进办法
2021/03/02 无线电
用header 发送cookie的php代码
2007/03/16 PHP
php shell超强免杀、减少体积工具实现代码
2012/10/16 PHP
thinkphp使用literal防止模板标签被解析的方法
2014/11/22 PHP
Symfony2中被遗弃的getRequest()方法分析
2016/03/17 PHP
thinkphp分页实现效果
2016/10/13 PHP
laravel 关联关系遍历数组的例子
2019/10/10 PHP
多广告投放代码 推荐
2006/11/13 Javascript
jQuery的Ajax时无响应数据的解决方法
2010/05/25 Javascript
JavaScript获取页面上被选中文字的方法技巧
2015/03/13 Javascript
js实现使用鼠标拖拽切换图片的方法
2015/05/04 Javascript
JS实现无限级网页折叠菜单(类似树形菜单)效果代码
2015/09/17 Javascript
JavaScript中定义类的方式详解
2016/01/07 Javascript
jquery easyUI中ajax异步校验用户名
2016/08/19 Javascript
DOM操作原生js 的bug,使用jQuery 可以消除的解决方法
2016/09/04 Javascript
Bootstrap 模态框(Modal)插件代码解析
2016/12/21 Javascript
Vue2递归组件实现树形菜单
2017/04/10 Javascript
JS中正则表达式要注意lastIndex属性
2017/08/08 Javascript
小程序的上传文件接口的注意要点解析
2019/09/17 Javascript
浅谈Vue组件单元测试究竟测试什么
2020/02/05 Javascript
在vscode 中设置 vue模板内容的方法
2020/09/02 Javascript
Openlayers测量距离与面积的实现方法
2020/09/25 Javascript
fastcgi文件读取漏洞之python扫描脚本
2017/04/23 Python
Python读取stdin方法实例
2019/05/24 Python
在Windows上安装和配置 Jupyter Lab 作为桌面级应用程序教程
2020/04/22 Python
pygame用blit()实现动画效果的示例代码
2020/05/28 Python
python开根号实例讲解
2020/08/30 Python
Python环境使用OpenCV检测人脸实现教程
2020/10/19 Python
Python 制作查询商品历史价格的小工具
2020/10/20 Python
印度购买眼镜和太阳镜网站:Coolwinks
2018/09/26 全球购物
UNIONBAY官网:美国青少年服装品牌
2019/03/26 全球购物
幼儿园家长评语
2014/02/10 职场文书
认真学习保证书
2015/02/26 职场文书
毕业生个人总结
2015/02/28 职场文书
赡养老人协议书范本
2015/08/06 职场文书
详解python的异常捕获
2022/03/03 Python