React 出海应用 首屏加载时间从20S降到10S以下 血泪史_weixin_33736832的博客-程序员秘密

技术标签: ViewUI  webpack  json  javascript  

最近在做一个基于mobile app的漫画的项目,面向印尼市场。

网址是http://id.mangaya.mobi

上线后,基本测试没有问题,打开也挺顺畅。但是google analytics却反馈加载平均19s

OMG~~于是开展了一系列的探索。。

首先说说技术栈,用的是create-react-app,redux,react-router,webpack4,babel7.

我们知道网页的加载流程大致如下:

那么优化网页的加载速度,最本质的方式就是,1.减少请求数量 2.缩小请求体积大小。

减少请求数量

  1. 用base64减少不必要的网络请求,实际上create-react-app已经自动帮我们做了。

  1. 引入文件使用React.Lazy

  1. 图片延迟加载,使用react-lazyload,非常方便。

缩小请求体积大小

  1. 后台返回的图片使用webp格式,缩小体积。但是由于webp目前只被安卓支持,所以我们目前的方案是后端获取请求的user-agent信息,判断如果是ios的话,就返回jpg格式的图片,如果是安卓的话,就返回webp格式。这主要使用在banner图。

  2. webpack 处理

  • 2.1 build的时候去掉map文件,减少不必要的文件以及防止被查看源码

  • 2.2 压缩css和js,实际上create-react-app已经自动帮我们做了。uglifyjs-webpack-plugin使用的uglify-es已经不再被维护,取而代之的是一个名为terser的分支。

  • 2.3 默认splitChunk是chunks: 'all',但是这样会导致生成一个很大的vendor文件,可以改一下,将node文件抽离出来。

 splitChunks: {
        // chunks: 'all',
        chunks: "all",
        maxInitialRequests: Infinity,
        minSize: 0,
        cacheGroups: {
          vendor: {
            test: /[\\/]node_modules[\\/]/,
            name(module) {
              // get the name. E.g. node_modules/packageName/not/this/part.js
              // or node_modules/packageName
              const packageName = module.context.match(
                /[\\/]node_modules[\\/](.*?)([\\/]|$)/
              )[1];

              // npm package names are URL-safe, but some servers don't like @ symbols
              return `npm.${packageName.replace("@", "")}`;
            }
          }
        },
        name: false
      },
复制代码

这样虽然总的项目大小变大了,但是由于vendor文件被拆分成多个文件,根据http1.1或者http2的协议,浏览器资源获取是可以多个并行的,配合cdn,这样请求资源,反而更快。

  • 2.4 Babel polyfill的按需加载,直接在package.json配置就好了,由于需要支持的机子比较低端,所以设定为支持>0.02%的机型。可参考
"browserslist": [
    ">0.02%",
    "not dead",
    "not ie <= 11",
    "not op_mini all"
  ]
复制代码
  1. gzip压缩 如果浏览器支持gzip压缩,在发送请求的时候,请求头中会带有Accept-Encoding:gzip。然后服务器会将原始的response进行gzip压缩,并将gzip压缩后的response传输到浏览器,紧接着浏览器进行gzip解压缩,并最终反馈到网页上。

资源cdn加速

将静态服务器改成印尼的服务器,明显dns以及静态资源的传输加快。最后就是cdn加速静态资源了,我把npm包的js都放到cdn上了,之后还可以配置多路cdn等策略。

总结

经过一段时间的努力,成功将首次加载时间从19秒变成10秒以下!仍需要继续。。。

同时我们还招募了志愿者帮我们测试嘻嘻嘻
当然这只是首次的加载的时间问题,后续还有观看漫画的优化工作,以及改成https协议加入pwa的service worker等等,敬请期待哈哈。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_33736832/article/details/88031329

智能推荐

网络编程1 -----获取本机IP地址_Ice的博客-程序员秘密

        Winsock是90年代初,为了方便网络编程,由Microsoft联合了其他几家公司共同制定的一套WINDOWS下的网络编程接口,它是通过C语言的动态链接库方式提供给用户及软件开发者的,主要由winsock.h头文件和动态链接库winsock.dll组成,目前有两个版本:Winsock1.1和Winsock2.0。  在Win32平台上,访问众多的基层网络协议,Winsock是

Android 通知Notify_weixin_34256074的博客-程序员秘密

为什么80%的码农都做不了架构师?&gt;&gt;&gt; ...

洛谷 P1525 关押罪犯 并查集变形 结构体排序 重写cmp函数_aiworenyanzhousuanfa的博客-程序员秘密

题目链接:https://www.luogu.com.cn/problem/P1525参考博客:https://www.luogu.com.cn/blog/chtholly20094/solution-p1525这个博客写的很棒,建议复习时再看算法:并查集思路:1:并查集:但因为它们带有权值,因此排序是必须的,我们要尽可能让危害大的罪犯在两个监狱里2:那么,再结...

hog svm行人检测python编写_babyai997的博客-程序员秘密

主要内容:svm+hog训练自己数据集合进行检测行人,可以标示检测框的,当然这个数据集可以换成任意的物体。效果视频:hog svm行人检测python编写项目下载:

vivo android 彩蛋,惊喜不止于表面!vivo X21的四个彩蛋,你注意到了吗?_姜雪军的博客-程序员秘密

原标题:惊喜不止于表面!vivo X21的四个彩蛋,你注意到了吗?说起近期最热门的全面屏手机,肯定少不了vivo X21,vivo X21凭借全球领先的屏幕指纹黑科技、全面升级的系统配置、当下最流行的人工智能技术收到了用户的青睐。而vivo X21的热销,产品本身硬实力无疑是根基,其极致贴心的功用和体验才是破钞者心甘情愿掏钱的事,下面就让笔者说一下这些官方都没宣传的四个功能大升级,这些vivo X...

Java网络编程注意事项3_aofan9566的博客-程序员秘密

如何使用POST请求和GET请求Web网站发送请求,下面的参考代码:import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.net.URL;import java.net.URLConnection;public ...

随便推点

【DevOps黑客马拉松挑战赛—大连站】_devops 算法大赛_IDCF社区的博客-程序员秘密

IDCF DevOps黑客马拉松:“打造端到端的DevOps人才”!“在36小时内从0到1打造并发布一款产品!”DevOps实践与敏捷开发正在席卷IT公司,精益创业、设计思维、增长黑客等硅谷创新思维与方法,正在被越来越多具有真知灼见的企业接受并实践。研究显示,在那些引入了DevOps方法的企业中,精英效能组织对比低效能组织,在部署频率、部署前置时间、变更失败率、故障恢复时间等关键指标上,有7倍到2604倍的差距。 在内容设计上,DevOps黑客马拉松融合了最新的硅谷创新与研发理念,贯穿设计

聊聊 getClientRects 和 getBoundingClientRect 方法_baikang7714的博客-程序员秘密

开始表演今天来聊一下两个相似的方法,它们就是:getBoundingClientRect()、getClientRects()。只见它们俩手拉手地登上了舞台,一个鞠躬,便开始滔滔不绝起来。自述getClientRects()“我来了,你看到我了,当然看到我咯,彪悍一个。”“想知道怎么驾驭我吗?你想吗?像这样。”let rectList = document.getEleme...

python的卷积torch.nn.Conv2d的参数个数_torch conv2d 卷积核_MAR-Sky的博客-程序员秘密

参考:https://blog.csdn.net/u012428169/article/details/114702453通过一个网络模型看import torchimport torch.nn as nndef get_n_params(model): pp=0 for p in list(model.parameters()): nn=1 for s in list(p.size()): nn = nn*s

纯css 制作简单的爱心_baiyong1930的博客-程序员秘密

网页中我们用到爱心的地方不少,如看到一篇喜欢的文章给他点个赞,表白你喜欢的女孩,给他比个小心心什么的。今天用纯css写一个简单的爱心。简单思路如下:1.先做一个盒子,里面包含两个小盒子2.两个小盒子弄成一样大小的长方形3.通过border-radius、transform,进行调整,整合成一个爱心代码如下:HTML部分:&lt;!DOCTYPE ht...

EmptyBorder_anyelinux123的博客-程序员秘密

EmptyBorder(int top, int left, int bottom, int right)上左下右逆时针方法依次指定四个方向距离边框的空白像素。。设置面板的边界,setBorder描述了面板四周的边界(属于面板内部),EmptyBorder是一个空白的边界;语句的意思是让组件内部边框为空,并且有5个像素的厚度,如果直接在contentPane上面添加一个按钮(设置为充满

Stream sorted的使用以及注意事项_Less666666的博客-程序员秘密

1.sorted作用返回由此流的元素组成的流,按照自然顺序排序。简单的来说就是排序,可以自定义排序方法,也可以使用sorted自带的。2.sorted使用2.1自然排序List&lt;Integer&gt; list2 = new ArrayList&lt;Integer&gt;();list2.add(15);list2.add(10);list2.add(5);Object[] object = list2.stream().sorted().toArray(); for