前端性能优化、首页白屏优化

575 阅读9分钟

首页白屏优化

www.dandelioncloud.cn/article/det…

PC性能优化

代码优化

  1. 减少DOM结点:DOM结点太多会影响页面的渲染。
  1. 不要反复去获取相同的dom节点,查找节点是非常消耗性能的

    如何减少dom操作:

    1、对dom查询做缓存,

    2、多个操作尽量合并在一起执行

    3、用innerHTML代替DOM操作,减少DOM操作次数,优化javascript性能

    4、避免全局查询

  1. 优化高频事件:搜索框、move事件用防抖限制,scroll、touch、高频点击等事件使用节流限制。
  1. 少用全局变量
  1. 慎用闭包,防止内存泄漏
  1. loading加载状态
  1. 骨架屏
  1. 减少不必要的嵌套,避免代码纵深层次过深,尽量扁平化,因为当浏览器遇到一个开始标签时就会寻找它的结束标签,直到匹配上才会显示它的内容,所以当嵌套很多时打开页面就会特别慢。
  1. 代码要结构化、语义化,因为这样可以增加代码的可读性,比如说使用header、footer、section等标签
  1. 尽量使用css3动画:合理使用requestAnimationFrame动画代替setTimeout。
  1. 用hash-table来优化查找
  1. 用setTimeout来避免页面失去响应
  1. 避免全局查询
  1. 避免使用with(with会创建自己的作用域,会增加作用域链长度)
  1. 服务端渲染ssr
  1. (伪)服务端渲染
  1. 把js移到HTML后加载,因为JS会阻塞后面的页面的显示。
  1. 减少iframe的使用,因为iframe会增加一条http请求。
  1. 避免图片和iframe等的空Src。空Src会重新加载当前页面,影响速度和效率。
  1. 文件命名规则须统一且要有意义,同类型文件归类到相同的文件夹中。

css优化

  • 加载性能:

(1)css 压缩:将写好的 css 进行打包压缩,可以减小文件体积。

(2)css 单一样式:当需要下边距和左边距的时候,很多时候会选择 使 用 margin:top 0 bottom 0 ;但margin-bottom:bottom;margin-left:left;执行效率会更高。

(3)减少使用@import,建议使用 link,因为后者在页面加载时一起加载,前者是等待页面加载完成之后再进行加载。

  • 选择器性能:

(1)关键选择器(key selector)。选择器的最后面的部分为关键选择器(即用来匹配目标元素的部分)。CSS 选择符是从右到左进行匹配的。当使用后代选择器的时候,浏览器会遍历所有子元素来确定是否是指定的元素等等;

(2)如果规则拥有 ID 选择器作为其关键选择器,则不要为规则增加标签。过滤掉无关的规则(这样样式系统就不会浪费时间去匹配它们了)。

(3)避免使用通配规则,如*{}计算次数惊人,只对需要用到的元素进行选择。

(4)尽量少的去对标签进行选择,而是用class。

(5)尽量少的去使用后代选择器,降低选择器的权重值。后代选择器的开销是最高的,尽量将选择器的深度降到最低,最高不要超过三层,更多的使用类来关联每一个标签元素。

(6)了解哪些属性是可以通过继承而来的,然后避免对这些属性重复指定规则。

  • 渲染性能: (1)慎重使用高性能属性:浮动、定位。

(2)尽量减少页面重排、重绘。

(3)去除空规则:{}。空规则的产生原因一般来说是为了预留样式。去除这些空规则无疑能减少 css 文档体积。

(4)属性值为 0 时,不加单位。

(5)属性值为浮动小数 0.xx,可以省略小数点之前的0。

(6)标准化各种浏览器前缀:带浏览器前缀的在前。标准属性在后。

(7)不使用@import 前缀,它会影响 css 的加载速度。

(8)选择器优化嵌套,尽量避免层级过深。

(9)css 雪碧图,同一页面相近部分的小图标,方便使用,减少页面的请求次数,但是同时图片本身会变大,使用时,优劣考虑清楚,再使用。

(10)正确使用 display 的属性,由于 display 的作用,某些样式组合会无效,徒增样式体积的同时也影响解析性能。 171

(11)不滥用 web 字体。对于中文网站来说WebFonts 可能很陌生,国外却很流行。web fonts 通常体积庞大,而且一些浏览器在下载webfonts 时会阻塞页面渲染损伤性能。 可维护性、健壮性:

(1)将具有相同属性的样式抽离出来,整合并通过class 在页面中进行使用,提高 css 的可维护性。

(2)样式与内容分离:将 css 代码定义到外部css 中。

图片优化

  1. 图片懒加载和预加载

    blog.csdn.net/qq_48959471…

  1. 雪碧图(精灵图)

    把每个小图标都整合到一张大图上面,极大的减轻http请求数,同时能够让图片快速加载进来

  1. 图像格式的选择

    尽可能的使用PNG格式的图片,它相对来说体积较小

    在一些对颜色要求不高的地方, 可以用 gif 格式

  1. 打包工具压缩图片
  1. 字体图标代替大量小图标
  2. 图像尽量避免使用DataURL:DataURL图像没有使用图像压缩算法,文件会变大,并且要解码后再渲染,加载慢耗时长。

请求优化

  1. 去掉不必要的请求, 控制首页以外的请求按需请求
  1. 合并样式和脚本,使用css精灵图片和字体图标,初始首屏之外的图片资源按需加载,静态资源延迟加载。
  1. 减少不必要的Cookie, Cookie存储在客户端,伴随着HTTP请求在浏览器和服务器之间传递,由于cookie在访问对应域名下的资源时都会通过HTTP请求发送到服务器,从而会影响加载速度,所以尽量减少不必要的Cookie。
  1. 异步加载第三方资源:第三方资源不可控,会影响页面加载,所以要异步加载第三方资源
  2. 开启 HTTP2
  3. 网址后加斜杠(如 www.campr.com/目录,会判断这个目录是什么文件类型,或者是目录。)
  4. 并发请求

缓存优化

  1. 设置http缓存: 强缓存、协商缓存

强缓存请求响应头

  • Expires

响应头,代表该资源的过期时间。

  • Cache-Control

请求/响应头,缓存控制字段,精确控制缓存策略。

协商缓存请求响应头

  • If-Modified-Since

请求头,资源最近修改时间,由浏览器告诉服务器。

  • Last-Modified

响应头,资源最近修改时间,由服务器告诉浏览器。

  • Etag

响应头,资源标识,由服务器告诉浏览器。

  • If-None-Match

请求头,缓存资源标识,由浏览器告诉服务器。

  1. 使用CDN
  2. 使用外部js和css文件以便缓存
  3. keep-alive

打包优化

  1. 使用webpack、gulp等打包工具, 合并文件, 压缩代码, 减少代码体积
  1. 进一步打包优化: cdn、Gzip压缩代码、图片压缩、抽离公共代码、组件库按需引入

    juejin.cn/post/719473…

资源加载

  1. 头部内联的样式和脚本会阻塞页面的渲染,一般我们会把css样式表文件放到文件的头部使用link引入,这样可以让CSS样式表尽早地完成下载。
  1. 对应js脚本文件,一般我们把脚本放在尾部并使用异步方式加载,这样可以尽最大限度的减少样式和脚本对页面的阻塞。
  1. 控制资源加载顺序 prefetch, preload, dns-prefetch, defer, async可以实现资源的预加载和懒加载 ,异步加载

    www.cnblogs.com/zhoulixue/p…

  1. 组件懒加载预加载

    blog.csdn.net/make_progre…

  2. 按需异步载入js

    动态创建DOM方式(创建script,插入到DOM中,加载完毕后callBack)

  3. 预加载

在开发中, 可能会遇到这样的情况 。有些资源不需要马上用到,但是希望尽早获取,这时候就可以使用预加载。 预加载其实是声明式的 fetch , 强制浏览器请求资源, 并且不会阻塞onload事件,可以使用以下代码开启预加载 预加载可以⼀定程度上降低首屏的加载时间, 因为可以将⼀些不影响首屏但重要的文件延后加载, 唯⼀缺点就是兼容性不好。

  1. 预渲染

可以通过预渲染将下载的文件预先在后台渲染, 可以使用以下代码开启预渲染预渲染虽然可以提高页面的加载速度,但是要确保该页面大概率会被用户在之后打开, 否则就是白白浪费资源去渲染。

  1. 懒执行

懒执⾏就是将某些逻辑延迟到使用时再计算 。该技术可以用于首屏优化,对于某些耗时逻辑并不需要在首屏就使用的,就可以使用懒执⾏。懒执⾏需要唤醒,⼀ 般可以通过定时器或者事件的调用来唤醒。

  1. 懒加载

懒加载就是将不关键的资源延后加载。 懒加载的原理就是只加载自定义区域 ( 通常是可视区域,但也可以是即将进⼊可视区域)内需要加载的东⻄ 。对于图片来说, 先设置图片标签的 src 属性为⼀张占位图,将真实的图片资源放⼊⼀个自定义属性中, 当进⼊自定义区域时,就将自定义属性替换为src属性, 这样图片就会去下载资源, 实现了图片懒加载。 懒加载不仅可以用于图片,也可以使用在别的资源上 。比如进⼊可视区域才开始播放视频等等。

移动端性能优化

  1. 尽量使用css3动画,开启硬件加速。
  1. 适当使用touch事件代替click事件。
  1. 可以用transform: translateZ(0)来开启硬件加速。
  1. CSS中的属性(CSS3 transitions、CSS3 3D transforms、Opacity、Canvas、WebGL、Video)会触发GPU渲染,请合理使用。过渡使用会引发手机过耗电增加

PC端的在移动端同样适用