记一次白屏统计与修复

博文原地址

白屏来源

上一版部门用的前端结构是python || lua渲染的html页面 + seajs + js模板 + less,但是这种情况发现对应不懂服务端渲染页面,或者服务端人员来说,在配合上存在工作不明,比如渲染的html应该由谁来维护,毕竟渲染的页面还是需要从服务端取数据的,以及在互相配合的过程中存在知识差异效率低的情况。

所以我们重构了,改成 backbone + modjs + js模板 + less, 打包模块也由grunt改成fis了。

白屏现象

重构了两个月,终于要上线了,好激动啊

...

白屏访问不了...白屏访问不了...白屏访问不了...

我去,我都没有重现啊

白屏定位与数量统计

既然出现了反馈,那肯定就是有问题了,但是本机又没有重现,该如何定位呢?

首先,还是要确定下白屏的数量占比。

统计方式,就是监听某个主DIV的变化(因为是单页面的应用,所以总会有个入口DIV来监听),白屏即是该div没有在规定时间内被放入东西,所以只要在规定时间内该DIV没有变化,那就可以进行白屏统计了。

最后统计上来,发现白屏占比在6%左右,数量还是蛮大的。

(如果说还需要统计网速之类的,因为我们的主程序js是通过async挂上去的,也可以在规定时间内检测加载到哪个script了,由此来确定程序的加载情况如何)

(如果说还需要统计API的调用情况的,比如是否timeout了,那可以在backbone的model里面的parseError进行监听)

白屏问题原因分析

既然问题出来了,数量出来了,那怎么找出原因就显得很重要了。

通过限速,重现用户反馈情况,步骤代码分析,最后确定:

  • 1、网速渣渣导致相关依赖资源加载超时
  • 2、客户端存在bug,缓存模块错乱,不缓存js等后来挂起的文件,以及乱缓存index.html
白屏解决

1、网速渣渣

针对这个情况,我们发现会出现4个现象

  • 一、首页直出时间过长
  • 二、依赖js没加载完全
  • 三、文件依赖关系表map.js加载不正确
  • 四、接口调用时间过长

对于首页直出时间过长,这个对于前后端分离的应用,基本都是会遇见的,毕竟首页的数据都需要通过再调API去拼接,加载模板等,这都是需要时间的,如果网速不行,那这个时间就更长的,但是考虑到需要做前后端分离,总不能还是以渲染模板的方式,那到底应该怎么才能确保前后端分离,又能够加快直出时间。

这个时候就需要nodejs直出了,通过在服务端增加一个nodejs中间层,由nginx将前端的请求转发到nodejs上,nodejs响应请求,加载资源,向底层的cgi进行API请求,之后进行拼接,返回html页面,这样资源跟api的请求时间都在服务端完成,缩短了时间,至于模板之类的,还是能够用到前端。当然nodejs也会有请求资源错误的情况,这个时候就需要返回错误标志给前端,前端再发起原来的异步请求,这种方式相当于一种容灾保障。

因为是应用方式,所以总是难免存在一些基础依赖,比如modjs,backbone, underscore, jquery等,这种一般都会通过打包成一个js来减少http请求以及文件大小。

但是不管怎么打这个文件数量还是会蛮大的,比如打了100k,那在网速渣渣,比如20k/s的情况还是需要5s的

再加上其他一些首页资源,那加载时间超过15s还是有可能的。

针对这种情况,只能通过打包模式,加载资源的模式进行改进。强烈按照“首页必须”进行开发,按需加载,其他的资源可以放在二屏,毕竟首页决定着是否还会继续使用。

文件依赖map.js加载失败

map.js主要是由fis打包插入到页面,用于解析模块之间的依赖关系的,这个文件是个超级入口

在网速渣渣,一旦这个文件加载失败了,那其他都不用玩了。

解决方法就是,尽量减少文件夹的嵌套,文件名不要过长,因为map.js会按照这种进行解析,其实也就是尽量减少map.js的大小

另外,因为fis中map.js的加载方式是require.resoureMap,之中的依赖关系是按照字符串的,没有使用变量,这个也可以按照seajs.config的方式进行

最后就是map.js容灾了,因为map.js加载失败,程序的启动入口require.async会直接请求路径,比如require.async(‘index/app‘),如果map.js加载失败,会变成请求index/app这个路径,这个时候,我们就可以在这里加入一个页面,用于重试加载页面等。

另外,接口调用时间过长也会导致单页面应用的加载时间过长,这种我们主要是前端需要给接口设置timeout时间,Backbone.async里面可以设置

2、客户端缓存bug

客户端随意缓存index.html,这种是大坑,只能通过url中加上随机数进行更新

资源不缓存主要是没有带上if-modify-since, if-none-match这种需要加上304验证

白屏启发

做好性能检测,以及限速检测,订制应用性能数量级,比如10k/s加载时间应该在什么范围内

另外,对于可订制的客户端,也可以仿照(manifest/appcache,不完善不适合)做一个缓存机制,即是判断服务器版本是否与客户端保存的资源一致,不一致即下载新的,一致即直接使用本地的,这样就变成一个类本地应用了。

时间: 2024-10-09 21:18:48

记一次白屏统计与修复的相关文章

记一次微信小程序在安卓的白屏问题

在做小程序的时候,做到了一个限时商品售卖,用到了倒计时,因为这个原因导致了安卓手机上使用小程序时,将小程序放入后台运行一段时间后,再次进入小程序后出现了页面白屏或者点击事件失效的情况,这里记录下 1.相关代码文件 我这里是使用了自定义组件的形式来渲染的 外部的引用的自定义组件的wxml文件 /* limitCommodity是一个数组,返回的是商品对象,包含商品价格.商品结束时间.商品图片等 */ <block wx:for="{{limitCommodity}}" wx:key

前端优化-如何计算白屏和首屏时间

白屏时间 白屏时间指的是浏览器开始显示内容的时间.因此我们只需要知道是浏览器开始显示内容的时间点,即页面白屏结束时间点即可获取到页面的白屏时间. 计算白屏时间 因此,我们通常认为浏览器开始渲染 <body> 标签或者解析完 <head> 标签的时刻就是页面白屏结束的时间点. <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8">

Android冷启动白屏解析,带你一步步分析和解决问题

转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/51019856 本文同步发表于我的微信公众号,扫一扫文章底部的二维码或在微信搜索 郭霖 即可关注,每天都有文章更新. 写在前面 记得在本月初,我发表了一篇文章叫< Android Studio新功能解析,你真的了解Instant Run吗?>,里面详细讲解了Android Studio中新加入的Instant Run功能,使得我们开发的效率可以大大地提升. 不过对于这个功能也有不

Android项目实战(四十二):启动页优化,去除短暂白屏或黑屏

原文:Android项目实战(四十二):启动页优化,去除短暂白屏或黑屏 大家会发现一个空项目,从手机桌面打开app是秒启动.但是对于自己开发的项目,有时会发现打开app的时候,会有短暂的1秒--2秒的白屏或者黑屏,然后才进入到程序界面. 个人理解为我们自己实现的Application文件里面做了较多的初始化操作,当这些初始化操作完成后才进入到第一个Activity,这段初始化的时间因为没有界面,应用便会因为主题的类别而显示白屏或者黑屏. 构成白屏/黑屏的原因代码如下: /*** @author

Ionic2使用百度地图API(JS)出现白屏解决方案

最近自学ionic2,写了一个内嵌百度地图JS的demo,实际跑起来之后出现了大家常见的白屏问题.. 最初的实现是这样的: 首先主页内嵌了一个百度地图插件 <div id="Bmap" style="width: 100%;height: 100%"> 之后menu中一个引导的子页面也内嵌了一个百度地图 <div id="Bmap" style="width: 100%;height: 100%"> 然

Xamarin.Android splash页面瞬间响应_避免APP启动闪白屏

Application和Activity中的onCreate都进行了优化,基本没有耗时操作,但是启动应用之后还是会闪现一下白色背景,然后才进入Splash页面,对比了一下QQ.微信.微博等客户端,点击之后都是瞬间响应Splash启动页,差别在哪里呢. 其实就算你onCreate啥都不做,仍然会闪一下白屏,因为初始化解析界面时需要一定时间,解决方法是自定义Theme. 自定义如下 <style name="AppSplash" parent="android:Theme&

IE11/Flash页游白屏怎么办!立刻开启IE大地址模式!缓解浏览器白屏问题

您是否经常发现IE白屏了,具体表现为点开新网页时无法显示,只能切换标签,用任务管理器一看,内存1.2G之多. 这是因为IE11可能有内存泄露问题,内存不断增长以至于无法申请新的内存,于是IE就完蛋了! 然而为什么是1.2G呢?我们的内存经常是8G的,其实这是因为32位的IE11用的编译器可能比较旧,忘记了打开大内存模式,只能利用大概1.2G的内存 vc++的编译选项里可以为32位程序使用大地址模式,这个大地址模式可以令程序使用3.5G的内存 然而IE并没有开源,我们无法重新编译,难道我们就束手就

MPlayerX For Mac白屏问题

在Mac App store下载了MPlayerX后,如果系统版本是10.10的,用MPlayerX看视屏当选择全屏后会出现白屏现象只有声音退出全屏后仍旧是白屏. 这是因为MPlayerX已经在Mac App store里停止更新了,Mac App store下载的MPlayerX版本过旧和新系统不兼容,只要到网上下载最新的系统就好了 MPlayerX For Mac 1.0.22 修改默认播放器为MPlayerX 右击视频文件->选择显示简介->打开方式 选择MPlayerX->点击全

Android -- 距离感应器控制屏幕灭屏白屏

权限                                                                                             <uses-permission android:name="android.permission.DEVICE_POWER"/> <uses-permission android:name="android.permission.WAKE_LOCK"/>