记一次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 相关文章推荐
ExtJS Grid使用SimpleStore、多选框的方法
Nov 20 Javascript
JS获取页面input控件中所有text控件并追加样式属性
Feb 25 Javascript
7款风格新颖的jQuery/CSS3菜单导航分享
Apr 23 Javascript
js单独获取一个checkbox看其是否被选中
Sep 22 Javascript
【经验总结】编写JavaScript代码时应遵循的14条规律
Jun 20 Javascript
jQuery简单设置文本框回车事件的方法
Aug 01 Javascript
Javascript之面向对象--封装
Dec 02 Javascript
jQuery日程管理控件glDatePicker用法详解
Mar 29 jQuery
Vue数据双向绑定原理及简单实现方法
May 18 Javascript
angularjs http与后台交互的实现示例
Dec 21 Javascript
使用VUE+iView+.Net Core上传图片的方法示例
Jan 04 Javascript
js实现图片粘贴到网页
Dec 06 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使用正则表达式获取微博中的话题和对象名
2015/07/18 PHP
javascript垃圾收集机制与内存泄漏详细解析
2013/11/11 Javascript
判断文件是否正在被使用的JS代码
2013/12/21 Javascript
JS跨域问题详解
2014/11/25 Javascript
javascript动态创建表格及添加数据实例详解
2015/05/13 Javascript
全面详细的jQuery常见开发技巧手册
2016/02/21 Javascript
jquery插件treegrid树状表格的使用方法详解(.Net平台)
2017/01/03 Javascript
ECMAScript6 新特性范例大全
2017/03/24 Javascript
angular+webpack2实战例子
2017/05/23 Javascript
基于BootStrap multiselect.js实现的下拉框联动效果
2017/07/28 Javascript
Node.js中sequelize时区的配置方法
2017/12/10 Javascript
如何在vue里添加好看的lottie动画
2018/08/02 Javascript
Vue中mintui的field实现blur和focus事件的方法
2018/08/25 Javascript
angularJs自定义过滤器实现手机号信息隐藏的方法
2018/10/08 Javascript
swiper.js插件实现pc端文本上下滑动功能示例
2018/12/03 Javascript
javascript网页随机点名实现过程解析
2019/10/15 Javascript
react实现移动端下拉菜单的示例代码
2020/01/16 Javascript
[01:59]翻天覆地,因你而变,7.20版本地图更新速览
2018/11/24 DOTA
Python实现扫描指定目录下的子目录及文件的方法
2014/07/16 Python
python实现简单ftp客户端的方法
2015/06/28 Python
TensorFlow数据输入的方法示例
2018/06/19 Python
Python数据预处理之数据规范化(归一化)示例
2019/01/08 Python
详解Python二维数组与三维数组切片的方法
2019/07/18 Python
django多对多表的创建,级联删除及手动创建第三张表
2019/07/25 Python
对django2.0 关联表的必填on_delete参数的含义解析
2019/08/09 Python
基于Python实现签到脚本过程解析
2019/10/25 Python
对python中 math模块下 atan 和 atan2的区别详解
2020/01/17 Python
详解Django3中直接添加Websockets方式
2020/02/12 Python
Python抓包并解析json爬虫的完整实例代码
2020/11/03 Python
Tiqets英国:智能手机上的文化和娱乐门票
2019/07/10 全球购物
信息管理专业推荐信
2013/10/29 职场文书
护士岗位职责
2014/02/16 职场文书
病媒生物防治方案
2014/05/13 职场文书
爱护公共设施的标语
2014/06/24 职场文书
2014年绩效考核工作总结
2014/12/11 职场文书
浅谈 JavaScript 沙箱Sandbox
2021/11/02 Javascript