前端性能优化:客户端从输入到展示讲解

性能优化的根本目的:

==>要思考的是用户使用网站的体验如何,而不是我们可以节省多少字节,只有准确感知用户的感受,我们才有必要谈毫秒、字节和请求数量等问题。

针对优化注意事项:

==>1. 防止过早优化:没必要在刚开始阶段就对一个细节进行放大型的优化,因为这样的成本很高,除了代码可读性方面的东西,甚至还可能会引入更多的bug,所以,针对这个问题,我们可以在上线和运营的时候进行监控,当快暴露到问题的时候,进行整体优化。

==>2. 本末倒置的关注:网站内容是最重要的,应该查看页面的每个部分,看是否满足网站页面的主要目的,暂时不需要将额外的注意力全部放到一些不关乎本质的东西上。

对于性能的分析:

==>1. 使用浏览器的性能分析工具,得到性能分析图表,最著名的就是反向火焰图表,针对浏览器的加载和渲染一目了然。

==>2. 投入使用之前缺乏压力测试和性能测试

性能优化(从用户输入网址到客户端展现,一步一步优化)

1. 输入网址 ==> 告诉浏览器你要去哪里
2. 浏览器查找DNS ==> 网络世界是IP地址的世界,DNS就是ip地址的别名。从本地DNS到最顶级DNS一步一步的网上爬,直到命中需要访问的IP地址
a. DNS预解析 使用CDN缓存,加快解析CDN寻找到目标地址(dns-prefetch)

3. 客户端和服务器建立连接 ==>建立TCP的安全通道,3次握手
a. CDN加速 使用内容分发网络,让用户更快的获取到所要内容
b. 启用压缩 在http协议中,使用类似Gzip压缩的方案(对服务器资源不足的时候进行权衡)
c. 使用HTTP/2协议 http2.0针对1.0优化了很多东西,包括异步连接复用,头压缩等等,使传输更快

4. 浏览器发送http请求 ==> 默认长连接(复用一个tcp通道,短连接:每次连接完就销毁)
a. 减少http请求 每个请求从创建到销毁都会消耗很多资源和时间,减少请求就可以相对来说更快展示内容
- 1). 压缩合并js文件以及css文件
- 2). 针对图片,可将图片进行合并然后下载,通过css Sprites切割展示(控制大小,太大的话反而适得其反)
b. 使用http缓存 缓存原则:越多越好,越久越好。让客户端发送更少请求,直接从本地获取,加快性能。
c. 减少cookie请求 针对非必要数据(静态资源)请求,进行跨域隔离,减少传输内容大小。
d. 预加载请求 针对一些业务中场景可预加载的内容,提前加载,在之后的用户操作中更少的请求,更快的响应
e. 选择get和post 在http定义的时候,get本质上就是获取数据,post是发送数据的。get可以在一个TCP报文完成请求,但是post先发header,再发送数据。so,考虑好请求选型。
f. 缓存方案选型 递进式缓存更新(防止一次性丢失大量缓存,导致负载骤多)

5. 服务器响应请求 ==> tomcat、IIS等服务器通过本地映射文件关系找到地址或者通过数据库查找到数据,处理完成返回给浏览器
a. 后端框架选型
==> 更快的响应,前端更快的操作。
b. 数据库选型和优化 /

6. 浏览器接受响应 ==> 浏览器根据报文头里面的数据进行不同的响应处理
a. 解耦第三方依赖 越多的第三方的不确定因素,会导致web的不稳定性和不确定性
b. 避免404资源 请求资源不到浪费了从请求到接受的所有资源

7. 浏览器渲染顺序
==>a.HTML解析开始构建dom树
b.外部脚本和样式表加载完毕
- a). 尽快加载css,首先将CSSOM对象渲染出来,然后进行页面渲染,否则导致页面闪屏,用户体验差
- b). css选择器是从右往左解析的,so类似#test a {color: #444},css解析器会查找所有a标签的祖先节点,所以效率不是那么高
- c). 在css的媒介查询中,最好不要直接和任何css规则直接相关。最好写到link标签中,告诉浏览器,只有在这个媒介下,加载指定这个css
c.脚本在文档内解析并执行
- a). 按需加载脚本,例如现在的webpack就可以打包和按需加载js脚本
- b). 将脚本标记为异步,不阻塞页面渲染,获得最佳启动,保证无关主要的脚本不会阻塞页
- c). 慎重选型框架和类库,避免只是用类库和框架的一个功能或者函数,而引用整个文件。
d.HTML DOM完全构造起来
- a). DOM 的多个读操作(或多个写操作),应该放在一起。原则:统一读、统一写。
e.图片和外部内容加载
- a). 对多媒体内容进行适当优化,包括恰当使用文件格式,文件处理、渐进式渲染等
= b). 避免空的src,空的src仍然会发送请求到服务器
- c). 避免在html内容中缩放图片,如果你需要使用小图,则直接使用小图
f.网页完成加载
- a). 服务端渲染,特别针对首屏加载很重要的网站,可以考虑这个方案。后端渲染结束,前端接管展示。
a)针对首屏展示优化
- 1). 图片懒加载 针对展示只加载第一屏,等用户进行滚动的时候再进行加载。如果用户对下面内容不感兴趣,那么节省的请求。
b)javascript优化
- 1). 减少对dom节点的查询,因为每次都会重新去索引这个集合或者元素。或者查询一次缓存起来,以待接下来使用
- 2). 进行js操作DOM的时候,考虑清楚页面的重绘和重排,因为这些操作相对来说十分损耗性能的。
- 3). 避免使用eval和Function构造,因为解析器会将这些内容先转换成可执行代码,然后再进行接下去的操作。
- 4). 减少作用域链的查找,如果一个闭包函数使用到全局作用域的数据,那么每次局部作用域都会一层一层爬到最高作用域取得数据。
- 5). 数据访问,对非引用类型数据访问和局部变量的访问是最快的。所以如果对引用类型的成员(对象的属性或者数组的成员)访问超过一次,则缓存
- 6). 将前端可能会使用的一些算法函数写的更优化,在时间和空间复杂度上寻找到一个最优方案。
- 7). 去除重复加载同一模块脚本
- 8). 智能事件处理,比如在一个div下有10个按钮,可以在冒泡过程中捕获这个事件源,然后注册
c) css优化
-1). 删除无用规则
- 2). 内联关键CSS
- 3). 避免@imports和Base64
- 4). 启用高性价比属性(如opacity over rgba())
- 5). 避免重复性工作
- 6). 不要一条条地改变样式,而要通过改变class,或者csstext属性,一次性地改变样式。
- 7). 可将元素设为display: none(需要1次重排和重绘),然后N次操作,最后恢复显示
-8). position属性为absolute或fixed的元素,重排的开销会比较小,因为不用考虑它对其他元素的影响。
d) 图片优化(网络请求中80%都是静态资源的请求)
- 1). 图片正确格式的选择
- 2). 图片尺寸的选择,在低分辨率等状况下考虑降级处理(考虑响应式图片)
- 3). 使用正确的工具进行优化(有损压缩、无损压缩)
- 4). 能用css处理和代理的,优先考虑css实现(阴影,滤镜等)
-5). 正确使用data url,比如说多地使用的地方,不建议data url,可考虑缓存
- 6). 考虑图片的懒加载和元素可见加载方案
- 7). 图片的预加载,在正确的合理的设计节点进行图片的预加载
所有性能优化总结为三个层面优化:物理层面的优化,设计层面的优化,代码层面的优化

:设计层优化最主要的核心:衡量如何花费最少代价实现页面功能

:HTTP/2(超文本传输协议第2版,最初命名为HTTP 2.0):
是HTTP协议的的第二个主要版本,HTTP/2的目标包括异步连接复用,头压缩和请求反馈管线化并保留与HTTP 1.1的完全语义兼容。Google Chrome、Mozilla Firefox、Microsoft Edge和Opera已支持HTTP/2,并默认启用。Internet Explorer自IE 11开始支持HTTP/2,但仅限于Windows 10 Beta,并默认情况激活。

学习前端的同学注意了!!!
学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入前端学习交流群461593224,我们一起学前端!

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

推荐阅读更多精彩内容

  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,753评论 1 92
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,130评论 25 707
  • Yahoo!的Exceptional Performance团队为改善Web性能带来最佳实践。他们为此进行了一系列...
    拉风的老衲阅读 1,848评论 0 1
  • 0. 前言 前面有被用户投诉 APP 流量消耗厉害: 于是乎考虑了流量方面的问题。暂时 APP 中涉及流量的几个方...
    zyl06阅读 24,006评论 5 62
  • 写一段常用sql语句存储起来相当于多表的查询连接->形成的“新表”但视图不占存储空间,不存储数据 新建视图Teac...
    Lulus阅读 225评论 0 0