记一次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 相关文章推荐
JQuery的Ajax跨域请求原理概述及实例
Apr 26 Javascript
js中的referrer返回上一页使用介绍
Sep 26 Javascript
extjs 时间范围选择自动判断的实现代码
Jun 24 Javascript
JavaScript获取表格(table)当前行的值、删除行、增加行
Jul 03 Javascript
js中跨域方法原理详解
Jul 19 Javascript
jQuery的ready方法实现原理分析
Oct 26 Javascript
WebPack基础知识详解
Jan 16 Javascript
JavaScript字符集编码与解码详谈
Feb 02 Javascript
JS实现的按钮点击颜色切换功能示例
Oct 19 Javascript
webpack4 处理CSS的方法示例
Sep 03 Javascript
Vue实现根据hash高亮选项卡
May 27 Javascript
JS中call()和apply()的功能及用法实例分析
Jun 28 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实现通过URL提取根域名
2016/03/31 PHP
PHP命名空间namespace用法实例分析
2016/09/27 PHP
一个js封装的不错的选项卡效果代码
2008/02/15 Javascript
文件编码导致jquery失效的解决方法
2013/06/26 Javascript
QQ空间顶部折页撕开效果示例代码
2014/06/15 Javascript
让浏览器DOM元素最后加载的js方法
2014/07/29 Javascript
简单易用的倒计时js代码
2014/08/04 Javascript
JavaScript获取鼠标移动时的坐标(兼容IE8、chome谷歌、Firefox)
2014/09/13 Javascript
jquery让指定的元素闪烁显示的方法
2015/03/17 Javascript
基于javascript实现仿百度输入框自动匹配功能
2016/01/03 Javascript
JS实现响应鼠标点击动画渐变弹出层效果代码
2016/03/25 Javascript
js如何编写简单的ajax方法库
2017/08/02 Javascript
Bootstrap 树控件使用经验分享(图文解说)
2017/11/06 Javascript
手把手教你vue-cli单页到多页应用的方法
2018/05/31 Javascript
angular6 利用 ngContentOutlet 实现组件位置交换(重排)
2018/11/02 Javascript
在node中使用jwt签发与验证token的方法
2019/04/03 Javascript
koa2 用户注册、登录校验与加盐加密的实现方法
2019/07/22 Javascript
JS+HTML实现自定义上传图片按钮并显示图片功能的方法分析
2020/02/12 Javascript
Vue 请求传公共参数的操作
2020/07/31 Javascript
python实现NB-IoT模块远程控制
2018/06/20 Python
详解python列表生成式和列表生成式器区别
2019/03/27 Python
pandas按行按列遍历Dataframe的几种方式
2019/10/23 Python
Django实现WebSSH操作物理机或虚拟机的方法
2019/11/06 Python
python tqdm 实现滚动条不上下滚动代码(保持一行内滚动)
2020/02/19 Python
python 密码学示例——理解哈希(Hash)算法
2020/09/21 Python
详解Anaconda 的安装教程
2020/09/23 Python
HTML5之SVG 2D入门13—svg对决canvas及长处和适用场景分析
2013/01/30 HTML / CSS
俄罗斯韩国化妆品网上商店:Cosmasi.ru
2019/10/31 全球购物
会计实习生工作总结的自我评价
2013/10/07 职场文书
英语国培研修感言
2014/02/13 职场文书
聘任证明怎么写
2015/03/02 职场文书
小学生五一劳动节演讲稿
2015/03/18 职场文书
摘录式读书笔记
2015/07/01 职场文书
MySQL中优化SQL语句的方法(show status、explain分析服务器状态信息)
2022/04/09 MySQL
PHP正则表达式之RCEService回溯
2022/04/11 PHP
Hive HQL支持2种查询语句风格
2022/06/25 数据库