项目页面优化,我们该怎么做呢?

避免页面卡顿

怎么衡量页面卡顿的情况呢?

  1. 失帧和帧率FPS

    60Hz就是帧率fps,即一秒钟60帧,换句话说,一秒钟的动画是由60幅静态图片连在一起形成的。

    卡了,失帧了,或者掉帧了,一秒钟没有60个画面,看起来不连贯了。这可能是因为在渲染某些帧所花的时间比较长,导致停留在这些帧的时间比较长,所以画面停顿了。

  2. 页面渲染流程

    60fps就要求1帧的时间为1s/60=16.67ms。浏览器显示页面的时候,要处理JS逻辑,还要做渲染,每个执行片段不能超过16.67ms。实际上,浏览器内核自身支撑体系运行也需要消耗一些时间,所以留给我们的差不多只有10ms。

    渲染流程:JavaScrip->Style->Layout->Paint->Composite

    首先用JS做了些逻辑,还触发了样式变化,Style把应用的样式规则计算好之后,把影响到的页面元素进行重新布局(叫作Layout),再把它画到内存的一个画布里面,paint成了像素,最后把这个画布刷新到屏幕上去,叫作Composite,形成一帧。

  3. 掉帧分析

    一般最长的开销是JS脚本,并且可能JS里面做了很多DOM操作或者改了很多CSS,导致Rendering的时间也很长。

    所以可观察这些JS执行的具体开销,包括调用的函数栈及每个函数的执行时间。

  4. 拆分代码段

    把代码拆分成一个个单元,每个单元就是一个task任务,每一帧之前去取一个task执行,并且控制每个task的执行时间都在10ms以内。

  5. 减少layout

    由于layout是比较耗时的操作,所以要尽量减少页面重绘。例如:能用transform就不要使用position/width/height做动画,另外要减少layout的影响范围。

  6. 简化DOM结构

    当DOM结构越复杂时,需要重绘的元素也就越多。所以DOM应该保持简单,特别是那些需要做动画的,或者要监听scroll/mousemove事件的。另外使用flex比使用float在重绘方面会有优势,flex需要重绘的元素会比float少,使用flex布局做动画会更加流畅。

加快页面打开速度

页面的打开速度对网站的优化有极大的意义,那么,如何评价一个页面打开得快不快,可以用两个指标描述,一个是ready的时间,另一个是load的时间。

减少渲染堵塞

  1. 避免head标签JS堵塞

    所有放在head标签里的CSS和JS都会堵塞渲染。如果这些CSS和JS需要加载解析很久的话,那么页面就空白了。

    有两种解决办法:

    **第一种:**把script放到body后面,这也是很多网站采取的方法:

    **第二种:**给script加defer的属性,defer是HTML5新增的属性。一旦script是defer延迟的,那么这个script将会异步加载,但不会马上执行,会在ready state change变为Interactive后按顺序依次执行。

  2. 减少head标签里的CSS资源

    由于CSS必须要放在head标签里面,因为如果放在body里面,一旦加载好之后,又会对layout好的DOM进行重绘,样式可能会发生闪烁。

    1)不要放太多base64放在CSS里面

    放太多base64放在CSS里面,会导致CSS极速膨胀,把一张3k的图片转成base64,体积将变成4k。

    2)把CSS写成内联的

    这样虽然对缓存不利,但是对于首次加载是有很大的作用的。

    如果把CSS放到CDN上,为了得到这个CSS,它首先需要进行域名解析,然后建立http/https连接,其次才是下载。为了加载这个资源,DNS查找花掉了0.5s,建立TCP连接花掉了0.95s,建立https连接花掉了0.6s,从发送请求到收到第一个字节的数据又花掉了1.27s,总的时间接近3s。

优化图片

  1. 使用响应式图片

    响应式图片的优点是浏览器能够根据屏幕大小、设备像素比DPR、横竖屏自动加载合适的图片。

    DPR=1,加载1倍图;DPR=2,加载2倍图;

  2. 延迟加载图片

    图片往往是占据最多流量和带宽的资源。如果一口气全部放出来,那么页面的loaded时间将会较长,并且由于并行加载资源数是有限的,图片太多会导致放在body后面的JS解析比较慢,页面将长时间处于不可交互状态。

压缩和缓存

  1. gzip压缩

  2. Cache-Control

  3. 使用etag

    所谓etag就是对文件做的一个校验和,第一次访问的时候,响应头里面返回这个文件的etag,浏览器第二次访问的时候把etag带上,Nginx根据这个etag和新渲染的文件计算出的etag进行比较,如果相等则返回304。

    如果网站的信息特别重要,连很小的概率如百万分之一都不允许文件大小相等,那么就不要使用etag了。

    使用etag的代价是增加了服务器的计算负担,特别是当文件比较大时。

升级到HTTP/2

HTTP/2的优点在于对于一个域只建立一次TCP连接,使用多路复用,传输多个资源,这样就不用使用诸如雪碧图、合并JS/CSS文件等技术减少请求数。

还能进行报文头压缩,使用二进制传输和Server Push提前把资源推送给浏览器,不用等HTML解析了才能触发加载。

其他优化方案

  1. DNS预读取

    一个网站很可能要加载7、8个域的资源,第一次打开时,要做7/8次的DNS查找,这个时间是非常可观的。方法是在head标签里面写上几个link标签,对以上几个网站提前解析DNS,由于它使并行的,不会堵塞页面渲染。

  2. HTML优化

    例如把注释remove掉,把行前缩进删掉

  3. 代码优化

    例如HTML别嵌套太多层,否则加重页面layout的压力,CSS的选择器别写太复杂,不然匹配的计算量会比较大,对JS,别滥用闭包,闭包会加深作用域链,加长变量查找的时间。

增强用户体验

加Loading效果

加过渡动画效果

单击和输入

  1. 用户单击按钮提交的时候,可以给按钮做一个效果
  2. 使用HTML5的input
  3. 自动补全,根据当前输入框的特点自动补全

记住用户使用习惯

  1. 记住位置

  2. 记住用户的输入信息

    哪些需要被记住,哪些不需要被记住可能根据不同的使用场景,如果记住了一些不必要的信息可能会适得其反。

避免页面抖动

总结

总之呢,页面优化都是一点一点细节的优化,增加用户的体验,也就是提高我们的收益最大化。

相关推荐
mCell4 小时前
如何零成本搭建个人站点
前端·程序员·github
mCell5 小时前
为什么 Memo Code 先做 CLI:以及终端输入框到底有多难搞
前端·设计模式·agent
恋猫de小郭5 小时前
AI 在提高你工作效率的同时,也一直在增加你的疲惫和焦虑
前端·人工智能·ai编程
少云清5 小时前
【安全测试】2_客户端脚本安全测试 _XSS和CSRF
前端·xss·csrf
萧曵 丶5 小时前
Vue 中父子组件之间最常用的业务交互场景
javascript·vue.js·交互
银烛木6 小时前
黑马程序员前端h5+css3
前端·css·css3
m0_607076606 小时前
CSS3 转换,快手前端面试经验,隔壁都馋哭了
前端·面试·css3
听海边涛声6 小时前
CSS3 图片模糊处理
前端·css·css3
IT、木易6 小时前
css3 backdrop-filter 在移动端 Safari 上导致渲染性能急剧下降的优化方案有哪些?
前端·css3·safari
0思必得06 小时前
[Web自动化] Selenium无头模式
前端·爬虫·selenium·自动化·web自动化