前端性能优化综合分析

一,性能问题的简单分析、直接表现、根本原因

简单分析:

   首先,一个完整的页面主要由两部分组成,一是UI,二是数据。如果按照MVC架构,或是数据与表现分离的思想,还可以细分成三部分。一是通过html(结构)+css(表现)渲染出来的UI层(view),二是通过http来完成的数据层(model),三是将数据填充到view或者DOM操作的控制层(controller)。

   于是,一次完整的页面加载就可以分成三部分工作,一是view渲染(UI),二是数据加载(http),三是数据填充到view或更改(DOM操作)。其中只要有一个环节出问题,都有可能造成性能问题。

综上所述,我们可以总结出三个主要可能造成性能问题的环节:UI渲染、http请求、DOM操作。

   总而言之,要优化性能问题,就需要对可能造成性能问题的环节逐个击破。

直接表现:

1,页面加载时间过长

2,卡顿、闪现、页面结构错乱等现象

根本原因:

1,DOM结构复杂

2,过度或不恰当的DOM操作

3,http请求过多、请求时间过长、请求异常(中断、无响应、请求错误)等情况

下面,针对以上可能造成性能问题的环节,进行逐个优化。

二,性能优化之——DOM结构优化

1,保证简洁、清晰的html结构,减少或避免多余的html标签

2,使用HTML5的web语义化标签,保证结构清晰,同时利于seo

3,避免过于复杂的DOM结构,避免过度嵌套

4,采用SPA(单页应用)模式开发,动态按需加载

三,性能优化之——DOM操作优化

1,理解DOM操作:

为什么DOM操作会引起性能问题?

首先,每次DOM操作,页面DOM结构通常都有可能会被改变,浏览器一旦检测到DOM结构发生改变,就会进行全局的重绘,相当于每次DOM操作都对页面重新渲染了一遍。

因此DOM操作的过程其实是页面不断重复渲染的过程,如果这个过程很复杂,或者操作频繁,或逻辑错误,就会造成性能问题。

可是,DOM操作是不可避免的,于是我们优化的思路是减少DOM操作频率。

2, 减少DOM操作的方法:

(1) 使用innerHTML属性替代DOM操作

innerHTML不会进行全局的重绘,而是局部重绘,因此对性能影响较小。

(2) 使用react、vue等性能较好的框架

这类框架都对DOM操作进行过特殊处理,性能较好。以react为例,react内部将虚拟DOM、diff算法、

innerHTML三者结合起来处理DOM操作,避免了用户直接操作DOM。

(3) 避免或减少使用jquery等DOM操作库

四,性能优化之——http优化

http性能优化方法:优化静态资源和api请求。

(一) 理解http请求

1,理解http请求的类型

http请求分两大类,一类是静态资源请求,另一类就是api请求(请求后台接口)。

** (1) 静态资源请求 **

所谓静态资源请求,就是页面加载时从服务器下载html、css、js、图片等静态资源文件。

静态资源请求,如下图:

静态资源请求.png

** (2) api请求 **

所谓api请求,就是请求后台的接口所发出的http请求。如下图:

api请求.png

简而言之,http性能优化,其实是对静态资源(html、css、js、图片)和api请求的优化。

2,理解http请求带来的性能问题:

如果你理解http工作原理,那应该知道每次http请求过程的复杂性,代价是很高的。
因此,如果出现http请求过多、请求时间过长、请求异常(中断、无响应、请求错误)等都有可能会对性能造成影响。

下面就针对http请求的优化方案展开讲解。

(二) 静态资源优化

静态资源有html、css、js、图片等类型。因此要对它们进行分门别类地优化。

如果请求的静态资源过多、过大、或不存在等,都可能会造成性能问题。

静态资源优化的办法,就是对静态资源进行切割、合并、压缩等处理,以达到缩小静态资源体积、减少静态资源请求次数等目标,以实现快速完成http请求的过程。

下面对静态资源优化,分门别类来讲解。

1,html结构优化

(1) 保证简洁、清晰的html结构,减少或避免多余的html标签

(2)     使用HTML5的web语义化标签,结构清晰且利于seo
    
(3) css文件在head中引入,js文件放在body底部引入,这样做可以防止阻塞。另外如果有需要提前加

    载的js,请在window.onload方法中处理。
    
 解释: 浏览器加载js文件时其他一切渲染活动都会停止,直到js文件下载完成, 如果把js文件放头部
 
       加载,就会造成阻塞,也就是加载js时会阻止页面渲染。 因此通常js文件需要放body底部加
       
       载,等页面渲染完成后再加载js文件。

2,css优化

(1) 使用gulp、webpack等构建工具,对css进行合并、压缩等处理,以缩小css文件体积

(2) 如果你的应用css样式很庞大,可拆分成多个css文件,并做压缩处理,避免单个css文件过大

(3) 如果使用webpack,推荐使用extract-text-webpack-plugin之类的插件将css样式抽离出来,防止其随js一起打包

(4) 如果使用react、vue等框架,推荐使用css-modules、css in js等css模块化解决方案。

(5) 使用sass/less等预编译处理方案(后期不推荐使用,推荐使用css模块化方案)
       
(6) 尽量减少或避免使用内联样式

(7) 对于一些需要复杂计算的样式,比如box-shadow、import等,减少使用。

(8) 使用css3动画时,请开启GPU硬件加速。

3,js优化

(1) 使用gulp、webpack等构建工具进行合并、压缩处理,以缩小js文件体积和数量

(2) 使用webpack构建时,推荐拆分成2-3个js文件进行打包,并开启压缩,防止单个js文件过大

(3) 使用webpack构建时,推荐使用tree-shaking、prepack插件优化js代码构建,缩小体积

(4) 使用innerHTML替代DOM操作,防止页面不断重复地全局渲染

(5) 使用react、vue等高性能UI构建框架,避免直接操作DOM。

(6) 使用jslint等js语法检查工具,优化js代码

4,图片资源优化

(1) 图片合并——对小图进行sprite(雪碧图)处理

(2) 图片压缩——缩小图片体积

(3) 图片大小——做图时避免单个图片过大,最好能控制在500k以内

静态资源优化推荐的工具:gulp、webpack、fis3

(三) api请求优化

api请求,也就是请求后端工程师编写的后台接口,如果请求过程中出现中断、挂起(无响应)、响应超时、响应时间过长等问题,使得客户端长时间获取不到数据,页面得不到数据填充,也会造成性能影响。

api请求优化主要从两方面入手,一是客户端做http请求异常处理,二是后端接口优化。

1,http请求异常处理

(1) 请求超时处理——timeout

   当http请求超过限定的时间后中断请求,给予用户相应的提示。
   
(2) 错误处理

   根据不同的响应错误给予用户相应的提示。

2,后端接口优化

(1) 避免无响应的情况发生

(2) 避免过度操作复杂的逻辑

(3) 避免过度的嵌套查询

(4) 与前端约定好一套响应规则,包括响应状态码、数据格式、消息提示等等

(5) 服务器开启gzip压缩、以及服务器缓存

四,其他优化

  1,服务器缓存
  
    善用缓存,只加载初始化或有更新状态的资源,对无更新状态的资源则返回已缓存的结果。
    
    这样可实现快速响应请求、减少服务器带宽占用和资源浪费。
    
    对于资源的更新,可对资源添加时间戳或随机字符串的形式来处理,可参考gulp、webpack版本控制实现
    
  2,客户端缓存——cookie、WebStorage
  
    客户端可对http请求的结果进行缓存,在数据无更新的状态下,可直接使用已缓存的结果,而不用再次发出多余的http请求。这对于一些不变或更新频率较低的数据尤为实用。
    
    客户端缓存的方案主要有cookie、WebStorage、Application Cache。善用它们可提高你的应用的性能。

  3,使用cdn存储静态资源     

    使用cdn服务器存储图片、文件、音频/视频等静态资源文件,这样可避免过多占用服务器带宽和服务器磁盘空间。

    若配置有不同地域多节点cdn服务器,可实现就近节点传输,加快http请求速度。   
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,389评论 25 707
  • 围绕前端的性能多如牛毛,涉及到方方面面,以我我们将围绕PC浏览器和移动端浏览器的优化策略进行罗列注意,是罗列不是展...
    流动码文阅读 672评论 0 0
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,580评论 18 139
  • AJax 优化 缓存 Ajax 请求尽量使用GET, 仅取决于cookie数量 Cookie 优化 减少Cooki...
    KeKeMars阅读 9,325评论 5 89
  • 他再一次面对着镜子确认着自己的着装打扮是否有不妥当的地方,手指搓上一点发胶试图想让刘海前那一缕不安分的头发变得服帖...
    月刊少年喵帕斯阅读 316评论 0 2