网页性能优化(初窥)

面试的时候经常会被问到的有关于前端性能优化这一块的问题,扯扯个人的理解

第一条:减少 HTTP 次数的请求

      80%的最终用户响应时间花在前端程序上,而其大部分时间则花在各种页面元素, 如图像、 样式表、 脚本和 Flash 等,的下载上。 减少页面元素将会减少 HTTP 请求 次数。这是快速显示页面的关键所在。 一种减少页面元素个数的方法是简化页面设计。 但是否存在其他方式,能做到既有丰富内容,又能获得快速响应时间呢?以下是这样一些技术: 

     Image maps 组合多个图片到一张图片中。总文件大小变化不大,但减少了 HTTP 请求次数从而加快了页面显示速度。该方式只适合图片连续的情况;同时坐标的定义是烦人又容易出错的工作。

     CSS Sprites 是更好的方法。它可以组合页面中的图片到单个文件中,并使用 CSS 的 background-image 和 background-position 属性来实现所需的部分图片。 Inline images 使用 data: URL scheme 来在页面中内嵌图片。这将增大 HTML 文件的大小。组合 inline images 到你的(缓存)样式表是既能较少 HTTP 请求, 又能避免加大 HTML 文件大小的方法。 

     Combined files 通过组合多个脚本文件到单一文件来减少 HTTP 请求次数。样式 表也可采用类似方法处理。 这个方法虽然简单,但没有得到大规模的使用。  10大 美国网站每页平均有 7 个脚本文件和 2 个样式表。当页面之间脚本和样式表变化 很大时,该方式将遇到很大的挑战,但如果做到的话,将能加快响应时间。 

第二条:使用 CDN(Content Delivery Network, 内容分发网络 ) 

     用户离 web server 的远近对响应时间也有很大影响。从用户角度看,把内容部 署到多个地理位置分散的服务器上将有效提高页面装载速度。 但是该从哪里开始 呢? 
     作为实现内容地理分布的第一步,不要试图重构 web 应用以适应分布架构。 改变 架构将导致多个周期性任务,如同步 session 状态,在多个 server 之间复制数 据库交易。 这样缩短用户与内容距离的尝试可能被应用架构改版所延迟,或阻止。 我们还记得 80-90%的最终用户响应时间花在下载页面中的各种元素上,如图像 文件、 样式表、 脚本和 Flash 等。 与其花在重构系统这个困难的任务上,还不如先 分布静态内容。 这不仅能大大减少响应时间,而且由于 CDN 的存在,分布静态内 容非常容易实现。 CDN 是地理上分布的 web server 的集合,用于更高效地发布内容。 通常基于网络 远近来选择给具体用户服务的 web server。 一些大型网站拥有自己的 CDN,但是使用如 Akamai Technologies, Mirror Image Internet, 或 Limelight Networks 等 CDN 服务提供商的服务将是划算的。 在 Yahoo!把静态内容分布到 CDN 减少了用户影响时间 20%或更多。切换到 CDN 的 代码修改工作是很容易的,但能达到提高网站的速度。 

第三条:减少 DNS 查询次数

     DNS 用于映射主机名和 IP 地址,一般一次解析需要 20~120 毫秒。 为达到更高的 性能,DNS 解析通常被多级别地缓存,如由 ISP 或局域网维护的 caching server,本地机器操作系统的缓存(如 windows 上的 DNS Client Service), 浏览器。 的缺省 DNS 缓存时间为 30 分钟,Firefox 的缺省缓冲时间是 1 分钟。 IE 减少主机名可减少 DNS 查询的次数,但可能造成并行下载数的减少。避免 DNS 查 询可减少响应时间,而减少并行下载数可能增加响应时间。 一个可行的折中是把 内容分布到至少 2 个,最多 4 个不同的主机名上。 

第四条:样式放头、脚本放底

     我们发现把样式表移到 HEAD 部分可以提高界面加载速度,因此这使得页面元素 可以顺序显示。 在很多浏览器下,如 IE,把样式表放在 document 的底部的问题在于它禁止了网 页内容的顺序显示。 浏览器阻止显示以免重画页面元素,那用户只能看到空白页 了。Firefox 不会阻止显示,但这意味着当样式表下载后,有些页面元素可能需 要重画,这导致闪烁问题。 HTML 规范明确要求样式表被定义在 HEAD 中,因此,为避免空白屏幕或闪烁问题, 最好的办法是遵循 HTML 规范,把样式表放在 HEAD 中。 

     与样式文件一样,我们需要注意脚本文件的位置。 我们需尽量把它们放在页面的 底部,这样一方面能顺序显示,另方面可达到最大的并行下载。 浏览器会阻塞显示直到样式表下载完毕,因此我们需要把样式表放在 HEAD 部分。 而对于脚本来说,脚本后面内容的顺序显示将被阻塞,因此把脚本尽量放在底 部意味着更多内容能被快速显示。 脚本引起的第二个问题是它阻塞并行下载数量。HTTP/1.1 规范建议浏览器每个 主机的并行下载数不超过 2 个。 因此如果您把图像文件分布到多台机器的话,您可以达到超过 2 个的并行下载。 但是当脚本文件下载时,浏览器不会启动其他的 并行下载,甚至其他主机的下载也不启动。 在某些情况下,不是很容易就能把脚本移到底部的。如,脚本使用 document.write 方法来插入页面内容。 同时可能还存在域的问题。 不过在很多情 况下,还是有一些方法的。 一个备选方法是使用延迟脚本(deferred script)。DEFER 属性表明脚本未包 含 document.write,指示浏览器刻继续显示。不幸的是,Firefox 不支持 DEFER 属性。 IE 中,脚本可能被延迟执行,但不一定得到需要的长时间延迟。 在 不过从 另外角度来说,如果脚本能被延迟执行,那它就可以被放在底部了。 

第五条:将脚本和样式分离

     上述很多性能优化法则都基于外部文件进行优化。 现在,我们必须问一个问题: JavaScript 和 CSS 应该包括在外部文件,还是在页面文件中? 在现实世界中,使用外部文件会加快页面显示速度,因为外部文件会被浏览器 缓存。如果内置 JavaScript 和 CSS 在页面中虽然会减少 HTTP 请求次数,但增大 了页面的大小。 另外一方面,使用外部文件,会被浏览器缓存,则页面大小会减 小,同时又不增加 HTTP 请求次数。 因此,一般来说,外部文件是更可行的方式。 唯一的例外是内嵌方式对主页更有 效,如 Yahoo!和 My Yahoo!都使用内嵌方式。一般来说,在一个 session 中,主 页访问此时较少,因此内嵌方式可以取得更快的用户响应时间。 

第六条:避免重定向

重定向功能是通过 301 和 302 这两个 HTTP 状态码完成的,如: HTTP/1.1 301 Moved Permanently Location: http://example.com/newuri Content-Type: text/html 浏览器自动重定向请求到 Location 指定的 URL 上,重定向的主要问题是降低了 用户体验。 一种最耗费资源、经常发生而很容易被忽视的重定向是 URL 的最后缺少/,如访 问 http://astrology.yahoo.com/astrology 将被重定向到 http://astrology.yahoo.com/astrology/。在 Apache 下,可以通过 Alias,mod_rewrite 或 DirectorySlash 等方式来解决该问题。 

第七条:代码优化

  1、避免 CSS 表达式  

     CSS 表达式是功能强大的(同时也是危险的)用于动态设置 CSS 属性的方式。IE, 从版本 5 开始支持 CSS 表达式,如 backgourd-color: expression((new Date()).getHours()%2?”#B8D4FF”:”#F08A00”),即背景色每个小时切换一 次。 CSS 表达式的问题是其执行次数超过大部分人的期望。 不仅页面显示和 resize 时 计算表达式,而且当页面滚屏,甚至当鼠标在页面上移动时都会重新计算表达 式。 一种减少 CSS 表达式执行次数的方法是一次性表达式,即当第一次执行时就以 明确的数值代替表达式。如果必须动态设置的话,可使用事件处理函数代替。如 果您必须使用 CSS 表达式的话,请记住它们可能被执行上千次,从而影响页面 性能。

 2、函数节流

     函数节流就是用来节流函数从而一定程度上优化性能的。例如,DOM 操作比起非DOM 交互需要更多的内存和CPU时间。连续尝试进行过多的DOM 相关操作可能会导致浏览器挂起,有时候甚至会崩溃。尤其在IE 中使用onresize 事件处理程序的时候容易发生,当调整浏览器大小的时候,该事件会连续触发。在onresize 事件处理程序内部如果尝试进行DOM 操作,其高频率的更改可能会让浏览器崩溃。又例如,我们常见的一个搜索的功能,我们一般是绑定keyup事件,每按下一次键盘就搜索一次。但是我们的目的主要是每输入一些内容搜索一次而已。为了解决这些问题,就可以使用定时器对函数进行节流。

 3、减少对 DOM 访问

     当DOM树的结构变化时,例如节点的增减、移动等,也会触发重排。浏览器引擎布局的过程,类似于树的前序遍历,是一个从上到下从左到右的过程。 通常在这个过程中,当前元素不会再影响其前面已经遍历过的元素。所以,如果在body最前面插入一个元素,会导致整个文档的重新渲染。既然无法避免,那就减少访问(width、offsetTop、left。。。能少就少,可以缓存起来的,就缓存)。

  4、最小化代码

     最小化 JavaScript、CSS、HTML 从代码中删除不必要的字符,从而降低下载时间。 常用的工具有 Gulp 和 Webpack。 混淆是最小化于源码的备选方式。 象最小化一样,它通过删除注释和空格来减少 源码大小,同时它还可以对代码进行混淆处理。 作为混淆的一部分,函数名和变 量名被替换成短的字符串,这使得代码更紧凑,同时也更难读,使得难于被反 向工程。最小化是安全的、直白的过程,而混淆则更复杂,而且容易产生问题。从对大网站的调查来看,通过最小化,文件可减少 21%,而混淆则可减少 25%。 除了最小化外部脚本文件外,内嵌的脚本代码也应该被最小化。 即使脚本根据法 则 4 被压缩后传输,最小化脚本刻减少文件大小 5%或更高。 

本文主要借鉴与 雅虎军规 及个人理解

转载于:https://www.cnblogs.com/1216zero/p/6664581.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/372480.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STM32F10x_硬件I2C主从通信(轮询发送,中断接收)

Ⅰ、写在前面 关注我分享文章的朋友应该知道我在前面讲述过(软件、硬件)I2C主机控制从机EEPROM的例子。在I2C通信主机控制程序是比较常见的一种,可以说在实际项目中,很多应用都会使用到I2C通信。但在实际项目中作为I2C从机的应用相…

JavaFX 2:创建登录表单

在本教程中,我将使用JavaFX 2和CSS设计漂亮的Login Form 。 它是经典的登录表单,带有用户名和密码以及登录按钮。 为了遵循本教程,我强烈建议您查看以下这些教程: Eclipse IDE中的JavaFX 2入门 JavaFX 2:HBox JavaFX…

c html导出成word,html转word-html如何转换成WORD

1、打开HTML文件,点击菜单栏文件→使用MicrosoftOfficeWord编辑,之后系统会自动打开Word并显示HTML文件的内容,这是保存即可。2、如果找不到“使用MicrosoftOfficeWord编辑”的话,点击菜单栏工具→Internet选项→程序→HTML编辑器…

怎么解决tomcat占用8080端口问题

怎么解决tomcat占用8080端口问题 相信很多朋友都遇到过这样的问题吧,tomcat死机了,重启eclipse之后,发现Several ports (8080, 8009) required by Tomcat v6.0 Server at localhost are already in use.The server may already be running in…

ADO Recordset 对象链接

http://baike.baidu.com/link?url4Xdc46R8M5uj-BbOGaH761N5oDEYlGQJFeR2WbPwx1iQBusAUKU3qbWcHZCMmayatj9nzxPW7HdPToL6roD3Y_ 转载于:https://www.cnblogs.com/loanhicks/p/5788451.html

mvc4 html.beginform,MVC4 Html.BeginForm在Internet Explorer中提交按钮 9不工

我已经写在ASP.NET MVC4 /剃刀的形式。 该表格后很完善在Firefox和Chrome,但由于某种原因在Internet Explorer 10和11,“提交”按钮没有反应。 (Internet Explorer 9的作品也不错)。这是我的看法形式的样子:using (Html.BeginForm("MyAc…

页面传值的方法 和JSON与字符串和对象之间的转换

json数据解析 就是将json转换为数组或对象 json数据序列化 就是将数组或对象转化为json转载于:https://www.cnblogs.com/yaomengli/p/6678709.html

JasperReports JSF插件用例系列

这是文章系列的切入点,在该系列文章中,我将尝试介绍JasperReport JSF Plugin的一些用例, JasperReport JSF Plugin是一种工具,旨在轻松地将为JasperReports设计的业务报告集成到JSF应用程序中。 该系列中描述的所有示例都可以从Ja…

回归分析

一元线性回归模型: 一元线性回归分析的主要任务是: 解得: 三、检验、预测与控制: 1)F检验法: 2)t检验法 3)r检验法 3预测: 四、可线性化的一元非线性回归(曲线…

与传统的计算机硬件系统相比,计算机一级名词解释

目前微型机中普遍采用的字符编码是ASCII码。它是用7位二进制数对127个字符进行编码,其中前32个是一些不可打印的控制符号。多媒体系统由主机硬件系统、多媒体数字化外部设备和多媒体软件三部分组成。机器语言和汇编语言都是"低级"的语言,而高级…

ubuntu安装jdk1.8

sudo add-apt-repository ppa:webupd8team/javasudo apt-get updatesudo apt-get install oracle-java8-installer 转载于:https://www.cnblogs.com/czwangzheng/p/5793488.html

【java】对象变成垃圾被垃圾回收器gc收回前执行的操作:Object类的protected void finalize() throws Throwable...

1 package 对象被回收前执行的操作;2 class A{3 Override4 protected void finalize() throws Throwable {5 System.out.println("在对象变成垃圾被gc收回前执行的操作。");6 }7 }8 public class Test_finalize {9 public static void main(…

服务器 风扇测试软件,图解服务器风扇安装的正确方法

一般不是太垃圾的机箱总有两个地方可以装风扇,前面的一般在硬盘托架处,后面的一般在电源下面,键盘口上方。有的机箱出厂就已经装好1~2个风扇了。图中越红的区域温度相对越高。应该什么样的风道合理呢?1、前后都装机箱风扇的情况应…

处理Weblogic卡住的线程

定义或卡线是什么? 如果线程 在设定 的时间 内连续工作(非空闲),则WebLogic Server会将其诊断为阻塞 。 您可以通过更改在诊断出线程被阻塞之前的时间长度( Stuck Thread Max Time ),以及通过更…

控件自定义左键点击消息相应函数的问题(请懂的人来解答一下)

【问题描述】 自定义CTouchInputEdit类,继承自CEdit。 实现一个新的功能,当点击edit控件的时候,弹出一个输入框。 下面的代码片段1,当点击控件之后,会弹出输入框,退出输入框以后,在窗体的任何位…

电话圈(floyd)

题意: 如果两个人相互打电话,则说他们在同一个电话圈里。例如,a打给b,b打给c,c打给d,d打给a,则这4个人在同一个圈里;如果e打给f但f不打给e,则不能推出e和f在同一个电话圈…

计算机二级网址打不开,大神为你解决win7系统打不开二级网页链接的操作教程...

许多win7系统电脑的时候,常常会遇到win7系统打不开二级网页链接的情况,比如近日有用户到本站反映说win7系统打不开二级网页链接的问题,但是却不知道要怎么解决win7系统打不开二级网页链接,我们依照首先我们打开IE浏览器,然后点击上…

3步实现Jetty和Eclipse集成

本教程将引导您逐步了解如何集成Jetty和Eclipse,以及如何在Eclipse中的Jetty服务器上运行Web应用程序。 脚步: 安装Jetty Eclipse插件 建立网路应用程式 运行网络应用 1 –安装Jetty Eclipse插件 将服务器添加到“服务器”视图时,将不会…

【Linux开发】如何更改linux文件的拥有者及用户组(chown和chgrp)

本文整理自: http://blog.163.com/yanenshun126/blog/static/128388169201203011157308/http://ydlmlh.iteye.com/blog/1435157一、基本知识在Linux中,创建一个文件时,该文件的拥有者都是创建该文件的用户。该文件用户可以修改该文件的拥有者…

使用Akka处理1000万条消息

Akka演员承诺并发。 有什么更好的模拟方式,看看使用商品硬件和软件处理1000万条消息需要花费多少时间,而无需进行任何低级调整。我用Java编写了整个1000万条消息的处理过程,整个结果令我惊讶。 当我在具有Intel i5 – 4核,4 Gb RA…