记一次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 相关文章推荐
MSN消息提示类
Sep 05 Javascript
由prototype_1.3.1进入javascript殿堂-类的初探
Nov 06 Javascript
JavaScript实现的购物车效果可以运用在好多地方
May 09 Javascript
jquery实现在页面加载完毕后获取图片高度或宽度
Jun 16 Javascript
详解JavaScript的另类写法
Apr 11 Javascript
深入理解setTimeout函数和setInterval函数
May 20 Javascript
VUEJS实战之构建基础并渲染出列表(1)
Jun 13 Javascript
vue router demo详解
Oct 13 Javascript
Node之简单的前后端交互(实例讲解)
Nov 14 Javascript
javascript性能优化之分时函数的介绍
Mar 28 Javascript
Vue项目路由刷新的实现代码
Apr 17 Javascript
JS轮播图的实现方法
Aug 24 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 文件上传后缀名与文件类型对照表(几乎涵盖所有文件)
2010/05/16 PHP
PHP和Mysqlweb应用开发核心技术 第1部分 Php基础-1 开始了解php
2011/07/03 PHP
php实现的支持断点续传的文件下载类
2014/09/23 PHP
Grid得到选择行数据的方法总结
2011/01/17 Javascript
jquery.tmpl JQuery模板插件
2011/10/10 Javascript
JS实现切换标签页效果实例代码
2013/11/01 Javascript
js Array操作的最简短最容易理解方法
2013/12/09 Javascript
js实现带有介绍的Select列表菜单实例
2015/08/18 Javascript
js仿QQ邮箱收件人选择与搜索功能
2017/02/10 Javascript
vue引入ueditor及node后台配置详解
2018/01/03 Javascript
Vue弹出菜单功能的实现代码
2018/09/12 Javascript
详解Vue-Router源码分析路由实现原理
2019/05/15 Javascript
微信小程序云开发如何使用云函数生成二维码
2019/05/18 Javascript
Angular value与ngValue区别详解
2019/11/27 Javascript
微信小程序swiper组件实现抖音翻页切换视频功能的实例代码
2020/06/24 Javascript
vue操作dom元素的3种方法示例
2020/09/20 Javascript
vue动态合并单元格并添加小计合计功能示例
2020/11/26 Vue.js
python的tkinter布局之简单的聊天窗口实现方法
2014/09/03 Python
在Python中处理列表之reverse()方法的使用教程
2015/05/21 Python
浅谈python中scipy.misc.logsumexp函数的运用场景
2016/06/23 Python
python xlsxwriter库生成图表的应用示例
2018/03/16 Python
浅谈python中字典append 到list 后值的改变问题
2018/05/04 Python
python实现多进程代码示例
2018/10/31 Python
python中的tcp示例详解
2018/12/09 Python
Python简易版停车管理系统
2019/08/12 Python
自定义Django默认的sitemap站点地图样式
2020/03/04 Python
CSS3制作圆角图片和椭圆形图片
2016/07/08 HTML / CSS
css3实现画半圆弧线的示例代码
2017/11/06 HTML / CSS
奢华时尚的创新平台:Baltini
2020/10/03 全球购物
大学生自我评价怎样写好
2013/10/23 职场文书
打架检讨书2000字
2014/02/22 职场文书
毕业论文答辩开场白和答辩技巧
2015/05/27 职场文书
杨善洲电影观后感
2015/06/04 职场文书
我的中国梦主题班会
2015/08/14 职场文书
Go语言特点及基本数据类型使用详解
2022/03/21 Golang
vue3使用vuedraggable实现拖拽功能
2022/04/06 Vue.js