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

本文涉及的产品
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
简介: 性能优化的根本目的:  要思考的是用户使用网站的体验如何,而不是我们可以节省多少字节,只有准确感知用户的感受,我们才有必要谈毫秒、字节和请求数量等问题。针对优化注意事项: 防止过早优化:没必要在刚开始阶段就对一个细节进行放大型的优化,因为这样的成本很高,除了代码可读性方面的东西,甚至还可能会引入更多的bug,所以,针对这个问题,我们可以在上线和运营的时候进行监控,当快暴露到问题的时候,进行整体优化。

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

针对优化注意事项:

  • 防止过早优化:没必要在刚开始阶段就对一个细节进行放大型的优化,因为这样的成本很高,除了代码可读性方面的东西,甚至还可能会引入更多的bug,所以,针对这个问题,我们可以在上线和运营的时候进行监控,当快暴露到问题的时候,进行整体优化。
  • 本末倒置的关注:网站内容是最重要的,应该查看页面的每个部分,看是否满足网站页面的主要目的,暂时不需要将额外的注意力全部放到一些不关乎本质的东西上。

对于性能的分析:

  • 使用浏览器的性能分析工具,得到性能分析图表,最著名的就是反向火焰图表,针对浏览器的加载和渲染一目了然。
  • 投入使用之前缺乏压力测试和性能测试

 

性能优化(从用户输入网址到客户端展现,一步一步优化)
  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).  图片懒加载 针对展示只加载第一屏,等用户进行滚动的时候再进行加载。如果用户对下面内容不感兴趣,那么节省的请求。

      2).  浏览器本地缓存模块   可以通过按模块去划分,将页面的模块缓存到localStory中,每次请求核对模块版本号,丢失或者版本不一致重新请求,否则直接从本地拿(参考京东)

    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,并默认情况激活。

 

github地址:   鄙人厚颜无耻要颗星,这样才有动力持续更新

问题补充路径:

  1. 博客留言

  2. gerry.zhong@outlook.com

  3.github留言

相关实践学习
Serverless极速搭建Hexo博客
本场景介绍如何使用阿里云函数计算服务命令行工具快速搭建一个Hexo博客。
目录
相关文章
|
27天前
|
缓存 前端开发 JavaScript
优化前端性能:从理论到实践的全面指南
前端性能优化是提升用户体验的关键环节,但这一过程常被技术细节和优化策略所困扰。本文将系统地探讨前端性能优化的理论基础及实践技巧,包括关键性能指标、有效的优化策略、以及常见工具的应用。我们将从最基本的优化方法入手,逐步深入到高级技巧,为开发者提供一套全面的性能提升方案,以实现更快的加载时间、更流畅的用户交互体验。
|
1月前
|
缓存 前端开发 JavaScript
cnblogs——从主题开发浅谈前端性能优化
cnblogs——从主题开发浅谈前端性能优化
27 0
|
1天前
|
缓存 前端开发 JavaScript
优化前端性能:关键策略与实践
随着互联网技术的发展,用户对网页加载速度和交互体验的要求日益提高,前端性能优化成为提升用户体验和网站竞争力的关键。本文探讨了前端性能优化的重要性和七大关键策略,包括压缩资源文件、利用浏览器缓存、减少HTTP请求、异步加载、使用CDN、优化CSS和JavaScript执行及第三方脚本优化,并提供了实践案例,帮助开发者构建更快、更高效的网站。
|
30天前
|
缓存 前端开发 JavaScript
微前端集成优化:让所有子应用体积更小,加载更快!
【8月更文挑战第17天】微前端集成优化:让所有子应用体积更小,加载更快!
37 1
微前端集成优化:让所有子应用体积更小,加载更快!
|
13天前
|
Web App开发 前端开发 JavaScript
Web前端项目的跨平台桌面客户端打包方案之——CEF框架
Chromium Embedded Framework (CEF) 是一个基于 Google Chromium 项目的开源 Web 浏览器控件,旨在为第三方应用提供嵌入式浏览器支持。CEF 隔离了底层 Chromium 和 Blink 的复杂性,提供了稳定的产品级 API。它支持 Windows、Linux 和 Mac 平台,不仅限于 C/C++ 接口,还支持多种语言。CEF 功能强大,性能优异,广泛应用于桌面端开发,如 QQ、微信、网易云音乐等。CEF 开源且采用 BSD 授权,商业友好,装机量已超 1 亿。此外,GitHub 项目 CefDetector 可帮助检测电脑中使用 CEF
67 3
|
20天前
|
机器学习/深度学习 存储 前端开发
实战揭秘:如何借助TensorFlow.js的强大力量,轻松将高效能的机器学习模型无缝集成到Web浏览器中,从而打造智能化的前端应用并优化用户体验
【8月更文挑战第31天】将机器学习模型集成到Web应用中,可让用户在浏览器内体验智能化功能。TensorFlow.js作为在客户端浏览器中运行的库,提供了强大支持。本文通过问答形式详细介绍如何使用TensorFlow.js将机器学习模型带入Web浏览器,并通过具体示例代码展示最佳实践。首先,需在HTML文件中引入TensorFlow.js库;接着,可通过加载预训练模型如MobileNet实现图像分类;然后,编写代码处理图像识别并显示结果;此外,还介绍了如何训练自定义模型及优化模型性能的方法,包括模型量化、剪枝和压缩等。
27 1
|
1月前
|
缓存 前端开发 JavaScript
优化前端性能的十大最佳实践
在现代网页开发中,前端性能优化不仅仅是为了提升用户体验,还能显著提高网站的加载速度和响应时间。本文探讨了十大最佳实践,从优化资源加载到减少网络请求,再到提高页面渲染效率,每个实践都旨在解决常见的性能瓶颈。通过实现这些策略,开发者可以显著提升前端性能,提升用户满意度,并确保网站在各种设备上的流畅运行。
|
1月前
|
缓存 前端开发 JavaScript
深入探讨前端性能优化:从理论到实践
在现代Web开发中,前端性能优化已成为提升用户体验的关键因素。本文将探讨前端性能优化的基本理论,并结合实际案例,深入分析如何通过优化代码、资源管理和用户交互,显著提升网站和应用的响应速度。我们将介绍从理论到实践的多种方法,包括资源压缩、异步加载、缓存机制及工具的使用,帮助开发者构建更加高效和用户友好的前端应用。
|
1月前
|
缓存 编解码 前端开发
优化Web应用性能的前端技巧:从加载时间到用户体验
在现代Web开发中,提升前端性能不仅仅是为了缩短页面加载时间,更是为了提供更流畅的用户体验。本文将探讨几种有效的前端优化技术,包括懒加载、代码拆分、资源压缩以及浏览器缓存策略。通过具体实例和最佳实践,读者将能够掌握如何系统地提高Web应用的响应速度,减少资源消耗,并最终改善用户的整体体验。
|
14天前
|
前端开发 JavaScript API
前端性能优化-控制并发
【9月更文挑战第7天】前端性能优化-控制并发
12 0