web前端性能优化总结

article/2025/10/1 20:22:53

转自:http://www.2cto.com/kf/201604/498725.html

         网站的划分一般为二:前端和后台。我们可以理解成后台是用来实现网站的功能的,比如:实现用户注册,用户能够为文章发表评论等等。而前端呢?其实应该是属于功能的表现。并且影响用户访问体验的绝大部分来自前端页面。

        而我们建设网站的目的是什么呢?不就是为了让目标人群来访问吗?所以我们可以理解成前端才是真正和用户接触的。除了后台需要在性能上做优化外,其实前端的页面更需要在性能优化上下功夫,只有这样才能给我们的用户带来更好的用户体验。就好像,好多人问,男人在找女朋友的时候是不是只看外表,一些智慧的男人给出了这样的回答:脸蛋和身材决定了我是否想去了解她的思想,思想决定了我是否会一票否决她的脸蛋和身材。同理,网站也是这样,网站前端的用户体验决定了用户是否想要去使用网站的功能,而网站的功能决定了用户是否会一票否决前端体验

        不仅仅如此,如果前端优化得好,他不仅可以为企业节约成本,他还能给用户带来更多的用户,因为增强的用户体验。说了这么多,那么我们应该如何对我们前端的页面进行性能优化呢?

        一般说来,web前端指网站业务逻辑之前的部分,包括浏览器加载、网站视图模型、图片服务、CDN服务等,主要优化手段有浏览器访问、使用反向代理才、CDN等。

浏览器访问优化

浏览器请求处理流程如下图:


1、减少http请求,合理设置 HTTP缓存

        http协议是无状态的应用层协议,意味着每次http请求都需要建立通信链路、进行数据传输,而在服务器端,每个http都需要启动独立的线程去处理。这些通信和服务的开销都很昂贵,减少http请求的数目可有效提高访问性能。

        减少http的主要手段是合并CSS、合并javascript、合并图片。将浏览器一次访问需要的javascript和CSS合并成一个文件,这样浏览器就只需要一次请求。图片也可以合并,多张图片合并成一张,如果每张图片都有不同的超链接,可通过CSS偏移响应鼠标点击操作,构造不同的URL。
         缓存的力量是强大的,恰当的缓存设置可以大大的减少 HTTP请求。假设某网站首页,当浏览器没有缓存的时候访问一共会发出 78个请求,共 600多 K数据,而当第二次访问即浏览器已缓存之后访问则仅有 10个请求,共 20多 K数据。 (这里需要说明的是,如果直接 F5刷新页面的话效果是不一样的,这种情况下请求数还是一样,不过被缓存资源的请求服务器是 304响应,只有 Header没有Body,可以节省带宽 )

        怎样才算合理设置 ?原则很简单,能缓存越多越好,能缓存越久越好。例如,很少变化的图片资源可以直接通过 HTTP Header中的Expires设置一个很长的过期头 ;变化不频繁而又可能会变的资源可以使用 Last-Modifed来做请求验证。尽可能的让资源能够在缓存中待得更久。关于 HTTP缓存的具体设置和原理此处就不再详述了。

2、使用浏览器缓存

        对一个网站而言,CSS、javascript、logo、图标这些静态资源文件更新的频率都比较低,而这些文件又几乎是每次http请求都需要的,如果将这些文件缓存在浏览器中,可以极好的改善性能。通过设置http头中的cache-control和expires的属性,可设定浏览器缓存,缓存时间可以是数天,甚至是几个月。

        在某些时候,静态资源文件变化需要及时应用到客户端浏览器,这种情况,可通过改变文件名实现,即更新javascript文件并不是更新javascript文件内容,而是生成一个新的JS文件并更新HTML文件中的引用。
        使用浏览器缓存策略的网站在更新静态资源时,应采用逐量更新的方法,比如需要更新10个图标文件,不宜把10个文件一次全部更新,而是应该一个文件一个文件逐步更新,并有一定的间隔时间,以免用户浏览器忽然大量缓存失效,集中更新缓存,造成服务器负载骤增、网络堵塞的情况。

3、启用压缩

        在服务器端对文件进行压缩,在浏览器端对文件解压缩,可有效减少通信传输的数据量。如果可以的话,尽可能的将外部的脚本、样式进行合并,多个合为一个。文本文件的压缩效率可达到80%以上,因此HTML、CSS、javascript文件启用GZip压缩可达到较好的效果。但是压缩对服务器和浏览器产生一定的压力,在通信带宽良好,而服务器资源不足的情况下要权衡考虑。

4CSS Sprites

合并 CSS图片,减少请求数的又一个好办法。

5LazyLoad Images

        这条策略实际上并不一定能减少 HTTP请求数,但是却能在某些条件下或者页面刚加载时减少 HTTP请求数。对于图片而言,在页面刚加载的时候可以只加载第一屏,当用户继续往后滚屏的时候才加载后续的图片。这样一来,假如用户只对第一屏的内容感兴趣时,那剩余的图片请求就都节省了。

6CSS放在页面最上部,javascript放在页面最下面

       浏览器会在下载完成全部CSS之后才对整个页面进行渲染,因此最好的做法是将CSS放在页面最上面,让浏览器尽快下载CSS。如果将 CSS放在其他地方比如 BODY中,则浏览器有可能还未下载和解析到 CSS就已经开始渲染页面了,这就导致页面由无 CSS状态跳转到 CSS状态,用户体验比较糟糕,所以可以考虑将CSS放在HEAD中。

        Javascript则相反,浏览器在加载javascript后立即执行,有可能会阻塞整个页面,造成页面显示缓慢,因此javascript最好放在页面最下面。但如果页面解析时就需要用到javascript,这时放到底部就不合适了。

        Lazy Load Javascript(只有在需要加载的时候加载,在一般情况下并不加载信息内容。)随着 Javascript框架的流行,越来越多的站点也使用起了框架。不过,一个框架往往包括了很多的功能实现,这些功能并不是每一个页面都需要的,如果下载了不需要的脚本则算得上是一种资源浪费 -既浪费了带宽又浪费了执行花费的时间。目前的做法大概有两种,一种是为那些流量特别大的页面专门定制一个专用的 mini版框架,另一种则是 Lazy Load。

7、异步请求Callback(就是将一些行为样式提取出来,慢慢的加载信息的内容)

在某些页面中可能存在这样一种需求,需要使用 script标签来异步的请求数据。类似:

<span style="font-size:14px;">/*Callback 函数*/function myCallback(info){ //do something here } HTML:Callback返回的内容 :myCallback('Hello world!');
</span>

像以上这种方式直接在页面上写 <script> 对页面的性能也是有影响的,即增加了页面首次加载的负担,推迟了 DOMLoaded和window.onload 事件的触发时机。如果时效性允许的话,可以考虑在 DOMLoaded事件触发的时候加载,或者使用 setTimeout方式来灵活的控制加载的时机。

8、减少cookie传输

        一方面,cookie包含在每次请求和响应中,太大的cookie会严重影响数据传输,因此哪些数据需要写入cookie需要慎重考虑,尽量减少cookie中传输的数据量。另一方面,对于某些静态资源的访问,如CSS、script等,发送cookie没有意义,可以考虑静态资源使用独立域名访问,避免请求静态资源时发送cookie,减少cookie传输次数。

9Javascript代码优化

(1). DOM  

a.HTML Collection(HTML收集器,返回的是一个数组内容信息) 
  在脚本中 document.images、document.forms、getElementsByTagName()返回的都是HTMLCollection类型的集合,在平时使用的时候大多将它作为数组来使用,因为它有 length属性,也可以使用索引访问每一个元素。不过在访问性能上则比数组要差很多,原因是这个集合并不是一个静态的结果,它表示的仅仅是一个特定的查询,每次访问该集合时都会重新执行这个查询从而更新查询结果。所谓的“访问集合” 包括读取集合的 length属性、访问集合中的元素。 
  因此,当你需要遍历 HTML Collection的时候,尽量将它转为数组后再访问,以提高性能。即使不转换为数组,也请尽可能少的访问它,例如在遍历的时候可以将 length属性、成员保存到局部变量后再使用局部变量。   
b. Reflow & Repaint   
  除了上面一点之外, DOM操作还需要考虑浏览器的Reflow和Repaint ,因为这些都是需要消耗资源的。

(2). 慎用 with 

with(obj){ p = 1}; 代码块的行为实际上是修改了代码块中的执行环境 ,将obj放在了其作用域链的最前端,在 with代码块中访问非局部变量是都是先从 obj上开始查找,如果没有再依次按作用域链向上查找,因此使用 with相当于增加了作用域链长度。而每次查找作用域链都是要消耗时间的,过长的作用域链会导致查找性能下降。 
  因此,除非你能肯定在 with代码中只访问 obj中的属性,否则慎用 with,替代的可以使用局部变量缓存需要访问的属性。

(3). 避免使用 eval Function

每次 eval 或Function 构造函数作用于字符串表示的源代码时,脚本引擎都需要将源代码转换成可执行代码。这是很消耗资源的操作 —— 通常比简单的函数调用慢 100倍以上。 
  eval 函数效率特别低,由于事先无法知晓传给 eval 的字符串中的内容,eval在其上下文中解释要处理的代码,也就是说编译器无法优化上下文,因此只能有浏览器在运行时解释代码。这对性能影响很大。 
  Function 构造函数比 eval略好,因为使用此代码不会影响周围代码 ;但其速度仍很慢。 
  此外,使用 eval和 Function也不利于Javascript 压缩工具执行压缩。

(4). 减少作用域链查找

前文谈到了作用域链查找问题,这一点在循环中是尤其需要注意的问题。如果在循环中需要访问非本作用域下的变量时请在遍历之前用局部变量缓存该变量,并在遍历结束后再重写那个变量,这一点对全局变量尤其重要,因为全局变量处于作用域链的最顶端,访问时的查找次数是最多的。 
低效率的写法:

<span style="font-size:14px;">// 全局变量 
var globalVar = 1; 
function myCallback(info){ for( var i = 100000; i--;){ //每次访问 globalVar 都需要查找到作用域链最顶端,本例中需要访问 100000 次 globalVar += i; }
} 
</span>

更高效的写法:

<span style="font-size:14px;">// 全局变量 
var globalVar = 1; 
function myCallback(info){ //局部变量缓存全局变量 var localVar = globalVar; for( var i = 100000; i--;){ //访问局部变量是最快的 localVar += i; } //本例中只需要访问 2次全局变量在函数中只需要将 globalVar中内容的值赋给localVar 中globalVar = localVar; 
}
</span>

此外,要减少作用域链查找还应该减少闭包的使用。

(5). 数据访问

  Javascript中的数据访问包括直接量 (字符串、正则表达式 )、变量、对象属性以及数组,其中对直接量和局部变量的访问是最快的,对对象属性以及数组的访问需要更大的开销。当出现以下情况时,建议将数据放入局部变量: 
  a. 对任何对象属性的访问超过 1次 
  b. 对任何数组成员的访问次数超过 1次 
  另外,还应当尽可能的减少对对象以及数组深度查找。

(6). 字符串拼接

在 Javascript中使用”+”号来拼接字符串效率是比较低的,因为每次运行都会开辟新的内存并生成新的字符串变量,然后将拼接结果赋值给新变量。与之相比更为高效的做法是使用数组的 join方法,即将需要拼接的字符串放在数组中最后调用其 join方法得到结果。不过由于使用数组也有一定的开销,因此当需要拼接的字符串较多的时候可以考虑用此方法。

10CSS选择符优化

在大多数人的观念中,都觉得浏览器对 CSS选择符的解析式从左往右进行的,例如 
#toc A { color: #444; }这样一个选择符,如果是从右往左解析则效率会很高,因为第一个 ID选择基本上就把查找的范围限定了,但实际上浏览器对选择符的解析是从右往左进行的。如上面的选择符,浏览器必须遍历查找每一个 A标签的祖先节点,效率并不像之前想象的那样高。根据浏览器的这一行为特点,在写选择符的时候需要注意很多事项,有兴趣的童鞋可以去了解一下。

CDN加速

CDN(contentdistribute network,内容分发网络)的本质仍然是一个缓存,而且将数据缓存在离用户最近的地方,使用户以最快速度获取数据,即所谓网络访问第一跳,如下图。

由于CDN部署在网络运营商的机房,这些运营商又是终端用户的网络服务提供商,因此用户请求路由的第一跳就到达了CDN服务器,当CDN中存在浏览器请求的资源时,从CDN直接返回给浏览器,最短路径返回响应,加快用户访问速度,减少数据中心负载压力。 
CDN缓存的一般是静态资源,如图片、文件、CSS、script脚本、静态网页等,但是这些文件访问频度很高,将其缓存在CDN可极大改善网页的打开速度。

反向代理

传统代理服务器位于浏览器一侧,代理浏览器将http请求发送到互联网上,而反向代理服务器位于网站机房一侧,代理网站web服务器接收http请求。如下图所示:

论坛网站,把热门词条、帖子、博客缓存在反向代理服务器上加速用户访问速度,当这些动态内容有变化时,通过内部通知机制通知反向代理缓存失效,反向代理会重新加载最新的动态内容再次缓存起来。

此外,反向代理也可以实现负载均衡的功能,而通过负载均衡构建的应用集群可以提高系统总体处理能力,进而改善网站高并发情况下的性能。




http://chatgpt.dhexx.cn/article/ACDqdlXb.shtml

相关文章

前端性能优化学习 02 Web 性能指标

Web 性能指标 我们已经知道性能的重要性&#xff0c;但当我们讨论性能的时候&#xff0c;让一个网页变得更快&#xff0c;具体指哪些内容&#xff1f; 事实上性能是相对的&#xff1a; 对于一个用户而言&#xff0c;一个站点可能速度很快&#xff08;在具有功能强大的设备的…

web前端优化--图片优化

今天逛掘金浏览到一片有关web前端优化之图片优化的文章&#xff0c;很详细&#xff0c;比我这里总结的都全&#xff0c;大家可移步浏览&#xff1a; https://juejin.im/post/59a7725b6fb9a02497170459 文章中除了自己之前用到的&#xff0c;还有img的srcset和sizes的方法没用…

Web/前端性能优化

&#x1f58a; 人不光是靠他生来就拥有一切&#xff0c;而是靠他从学习中所得到的一切来造就自己。 —— 歌德 什么是Web性能 一个大型网站架构模型如下图所示&#xff0c;对一个网站的性能进行优化&#xff0c;可以分为 Web 前端性能优化、应用服务器端性能优化、存储服务器端…

Web前端性能优化思路

本文旨在整理常见Web前端性能优化的思路&#xff0c;可供前端开发参考。因为力求精简&#xff0c;限于篇幅&#xff0c;所以并未详述具体实施方案。 基于现代Web前端框架的应用&#xff0c;其原理是通过浏览器向服务器发送网络请求&#xff0c;获取必要的index.html和打包好的…

多传感器融合定位技术

由于 GNSS定位信息更新频率低&#xff0c;不能满足自动驾驶中实时性的要求&#xff0c;且定位信号会 因隧道、建筑群等障碍物的遮挡而中断。而INS中配备高频传感器&#xff0c;一定时间内可以提供连续的较高精度的汽车位置、速度和航向信息&#xff0c;但其定位误差会随着系统运…

室内定位技术及机场方案建议

室内定位技术发展现状 在1996年左右&#xff0c;美国联邦通信委员会&#xff08;FCC&#xff09;要求移动运营商为移动电话用户提供E-911&#xff08;紧急救援&#xff09;服务。1999年&#xff0c;FCC又对定位精度做出新的要求。加之此后全球移动用户的迅猛发展&#xff0c;很…

RTK定位技术原理

RTK即载波相位差分技术&#xff0c;rtk定位能够实时地提供测站点在指定坐标系中的三维定位结果&#xff0c;并达到厘米级精度。 普通GPS的定位精度大于1米&#xff0c;信号误差有50%的概率会达到2米以上。另外&#xff0c;GPS无法支持精准定高&#xff0c;误差可能高达十几米。…

5G+北斗融合定位技术介绍

5G是具有高速率、低时延和大连接特点的新一代宽带移动通信技术。5G移动通信技术会更加注重用户的使用体验,交互式游戏、3D技术、虛拟实现、传输延时、网络的平均吞吐速度以及各方面能效是检验5G性能的主要考量指标。 基于4G的蜂窝定位&#xff0c;受信号带宽、同步以及网络部署…

10种室内定位技术原理深度解析

在高度城市化的今天&#xff0c;室内空间越来越庞大复杂。人类战胜了大自然&#xff0c;却在自己构筑的钢筋水泥中迷了路。 东晋高僧法显西行求法乘船回国时写道&#xff1a;大海弥漫无边&#xff0c;不识东西&#xff0c;唯望日、月、星宿而进。大意就是说&#xff0c;大海辽…

5G对定位技术的影响

我们为您带来一些有关5G对定位技术的影响的有趣事实。我们为什么决定通知您有关此主题的信息&#xff1f;好吧&#xff0c;定位技术是5G发展中最有趣的领域。在现代世界中&#xff0c;这意味着5G正在加速发展&#xff0c;带来了改善和加快定位技术的全新技术。4G已成为过去。现…

室内定位技术之UWB篇

关注、星标公众号&#xff0c;直达精彩内容 来源&#xff1a;网络素材 伴随通信行业的发展和物联网行业的兴起&#xff0c;室内定位技术因强大的定位能力&#xff0c;迎来了发展的黄金时期。并且对于定位精度高&#xff0c;抗干扰能力要求高的应用场合&#xff0c;UWB定位技术应…

常见无线定位技术的基本原理

目录 引言无线电定位技术TOA技术TDOA技术RTT技术RSS技术AOA技术混合估计技术 引言 无线定位技术是依据测量出的无线电磁波的特征参数&#xff0c;利用相应位置解算方法来确定目标位置的技术。依据地面基站是否发射电磁波信号&#xff0c;可以把定位技术分为有源定位和无源定位…

室内定位常用定位技术_米级蓝牙定位方案,厘米级UWB定位方案

前言 随着物联网生态链逐渐走向成熟&#xff0c;各行各业对定位的需求也大大增加。由于GPS卫星信号在室内无法定位&#xff0c;且容易受到各种无线电信号的干扰&#xff0c;为实现“最后一公里”的室内位置服务&#xff0c;目前主流的室内定位你技术多依赖于热门的无线通信技术…

移动机器人室内定位技术综述

点击上方“小白学视觉”&#xff0c;选择加"星标"或“置顶” 重磅干货&#xff0c;第一时间送达 对于移动机器人&#xff0c;定位技术是保证移动机器人轨迹/运动作业的前提技术&#xff0c;特别是跟踪作业的基础。 与自动驾驶车辆定位不同&#xff0c;小型移动机器人…

物联网四大定位技术

物联网&#xff0c;是指物物都相连的互联网技术&#xff0c;是信息技术的重要构成部分。物联网主要用于网络的融合中&#xff0c;通过智能感知和识别技术来实现物品和物品之间的信息交流。下面小编就跟大家介绍一下物联网四大定位技术吧&#xff01; 物联网四大定位技术介绍 一…

万字详解自动驾驶定位技术

文章目录 车路协同自动驾驶1 高精度地图1.1 高精度地图定义及价值1.1.1 高精度地图的分层结构1.1.2 高精度地图对自动驾驶的价值1.1.3 高精度地图行业现状 1.2 高精度地图关键技术1.2.1 道路元素[图像处理](https://so.csdn.net/so/search?q图像处理&spm1001.2101.3001.70…

无线定位技术概述

FROM http://labs.chinamobile.com/mblog/712208_82886 阎啸天于蓉蓉武威 &#xff08;中国移动通信有限公司研究院业务所&#xff09; 摘 要介绍了位置信息和定位性能分析指标等基本概念&#xff0c;根据定位原理与策略的差异对各种定位方法进行分类&#xff0c;概要阐述和…

自动驾驶--定位技术

[整理自百度技术培训中心课程](https://bit.baidu.com/products?id70) 为什么无人车需要精确的定位系统 在地下车库实现自动泊车的一个非常关键的技术是什么呢&#xff1f;那就是定位技术。 为什么无人车需要一个精确的定位系统。为什么无人车需要精确的定位系统&#xff…

UWB定位技术

什么是UWB 超宽带&#xff08;Ultra Wide-Band&#xff0c;UWB&#xff09;是一种新型的无线通信技术&#xff0c;它主要用于低功耗数据快速传输以及室内静止或移动物体/人的定位跟踪与导航。 UWB技术传输速率高&#xff08;速率最高可达1000Mbps以上&#xff09;、发射功率较…

惯性导航定位技术

1 惯性导航定位技术介绍 惯性是所有质量体本身的基本属性。建立在牛顿定律基础上的惯性导航系统不与外界发生任何光电联系&#xff0c;仅靠系统本身就能对汽车进行连续的三维定位和三维定向。 由于惯性导航系统这种能自主地、隐蔽地获取汽车完备运动信息的优势是诸如 GNSS等其…