准则(概述)

  • 减少 HTTP 请求
  • 使用CDN加速
  • 避免空的src或href属性值
  • 增加过期头
  • 启GZIP压缩
  • 把css文件放到头部
  • 把javascript放到尾部
  • 避免使用css表达式
  • 删除不使用的css语句
  • 对javascript、css代码进行压缩
  • 减少重绘

减少HTTP请求

减少HTTP请求是上面性能准则中最为显著的一条,我们可以分为三个主要方面来讨论

  • 使用并行连接

    开发人员往往只考虑服务器端对性能的影响却疏忽了浏览器端的限制,比如有多少资源可以在同一时间加载。HTTP1.1协议明确的限制了单个用户在同一时间不能保持两个以上的连接,但是,现代浏览器大部分都突破了这个限制,很多浏览器可以支持四个甚至六个并行的连接。同样的,你也可以将资源文件散列到不同的域名下面,这种做法充分的利用了浏览器并发,所以可以提高加载效率,但是由于DNS的查询有耗时,太多的域名解析又会使性能降低。
  • 合并资源文件

    并行链接的讨论得出一个结论,大一些的文件比小一些的文件好,虽然说这个说法听起来有些别扭,但是在现今的网络环境里,这个说法可以得到证实(体积大的文件比多个小文件加载快)。此外每个HTTP请求在时间上和带宽上至少会产生一些开销,如果可以合并资源,减少HTTP请求,会提升一定的性能。
  • 使用图片精灵(css sprite)

    这个名词应该比较熟悉和常用,它的意思就是把几张图片合并成一张。这是一种有效减少HTTP请求的方法,在使用图片的时候你只需要使用一些css的定位来决定这个图片的位置即可。当我们使用其中的一个图标时,其他的图片也会被缓存(不需要再次请求)如果有100个图标则可以减少99次HTTP请求。

使用CDN加速(内容分发系统)

CDN是一个拥有很多服务器、经过策略性部署的、可以覆盖全球的网络系统,当用户访问一个比较大的网站时,CDN会从最近的一个节点为用户提供服务。但是动态数据的处理最好放在集中的服务器中,因为跨地域同步数据库是一个令开发者头痛的问题,所有大多数互联网公司都把购买、登陆等数据相关的事物放到一个地方处理。另外,CDN服务是很贵的,如果网站的流量值得去付出这么多钱,它无疑会给性能带来提升。

避免空的src和href属性

我们使用javascript给空的src赋值时,javascript放在文档的最后,此时虽然src是空的仍然会发出一个HTTP请求。当我们点击一个空的href属性的链接时,同样会发出一个HTTP请求,虽然这个HTTP请求不会有影响加载时间但是会给服务端造成一定的流量浪费。我们可以创建一个带有描述性信息的很href属性,并阻止这次HTTP请求

<a href="#SometingDescriptive" id="TriggerName">TriggerName</a> <script type="text/javascript"> $("#TriggerName").click(function (e) { e.prventDefaulet(); // 取消默认行为 ... }); </script>

另外,空的src和href也是会产生报错的

增加过期头

增加了过期头之后浏览器便会缓存这些文件,当用户第二次访问这个网站的时候就不会再像服务端请求这个文件。关于缓存的详细介绍可以点这里

启用GZIP压缩

HTTP协议1.1引入了Accept-Encoding这个功能(表明HTTP请求的内容是压缩过的),GZIP就是其中的一种压缩方式,它是现在压缩比率最高的,据雅虎的统计它减小了大约70%的响应大小。它不仅仅会减小文件传输时间,同时也节省了带宽。

把css放在头部

浏览器并不会等全部HTML解析完成之后才渲染元素,而是同时进行,把css放到前面就会保证先渲染的那一部分元素的显示样式是正确的,这么写在性能方面也有很大的意义,你绝不希望引起大量的浏览器重绘。如果你的样式文件放到页面的底部,那么浏览器就会等所有文件都加载完才会绘制页面,那么用户很有可能盯着白屏一长段时间,

把javascript放在尾部

脚本会阻止并行加载(link支持最大限度的并行加载),也就是说,当浏览器加载一个脚本的时候时,它不会加载其他文件。如果脚本在头部那他会阻止页面的渲染。我们可以用script标签上的DRFFER属性通知浏览器去异步的加载其他文件,但是这么做会出现两个问题。

  • 不是所有浏览器都认识这个属性
  • 用了DEFFER属性的脚本不可以使用document.write()

避免使用css表达式

  • 只有部分浏览器支持CSS表达式(IE5、6、7)
  • 在打包压缩后CSS表达式会比正常的CSS长得多
  • 执行频率高得多(往往当用户移动鼠标或滚动页面时它就会执行)

减少页面的回流与重绘

关于这个问题可以去我博客园的 博客 来查看。

web开发的性能准则(减少页面加载时间方面)的更多相关文章

  1. 减少页面加载时间的n种方法

    减少HTTP请求 1:减少调用其他页面.文件的数量 2:使用css spirit , 减少图片加载次数 压缩js,css代码 1:一般js.css文件中存在大量的空格.换行.注释,这些利于阅读,如果能 ...

  2. HTML:减少页面加载时间的方法

    1. 重复的HTTP请求数量应尽量减少 (1)减少调用其他页面.文件的数量. (2)在使用css格式时,常会采用background载入图形文件,而每个background的图像都会产生1次HTTP ...

  3. 利用Navigation Timing测量页面加载时间

    最近在看一本名为<web性能实践日志>的书籍,其中第十三章"网络计时"中介绍了一种比较新的计算页面各部分加载时间方法,这也是W3C Web性能工作小组正在做的事情,接下 ...

  4. [转载]Python & Selenium -- 页面加载时间过长&启动指定FF

    原文链接:https://my.oschina.net/u/2344787/blog/400507?p={{page}} 1. selenium webdriver在get方法会一直等待页面加载完毕才 ...

  5. Selenium WebDriver- 指定页面加载时间

    #encoding=utf-8 import unittest import time from selenium import webdriver from selenium.webdriver i ...

  6. selenium学习笔记11——driver.get(url) 页面加载时间太长

    在执行自动化测试用例过程中,发现因为网络慢或其他原因导致driver.get(url) 时,页面一直在加载,页面没有加载完成就不会去继续执行下面的动作,但是实际上需要操作的元素已经加载出来了. 解决方 ...

  7. selenium学习笔记——driver.get(url) 页面加载时间太长

    # 两个同时设置才行 # 实现效果:加载状态停止,进行代码下一步操作 driver.set_page_load_timeout(10) driver.set_script_timeout(10) # ...

  8. Web前端性能优化——提高页面加载速度

    前言:  在同样的网络环境下,两个同样能满足你的需求的网站,一个“Duang”的一下就加载出来了,一个纠结了半天才出来,你会选择哪个?研究表明:用户最满意的打开网页时间是2-5秒,如果等待超过10秒, ...

  9. 使用Filter跟踪Asp.net MVC页面加载时间

    最近,客户一直反馈系统使用慢,有时候能够指出具体是哪个页面,有时候又只是笼统地反馈慢.这种问题就像是幽灵一样,非常不好处理.因为导致这种问题的因素非常之多,而且在开发工程中,很难模拟出实际运行是的环境 ...

随机推荐

  1. MulticastSocket绑定端口的问题

    该文章由 Binkery 发布于 Binkery技术博客 http://www.binkery.com 如转载请注明出处,该文章的链接地址为 http://www.binkery.com/archiv ...

  2. JS中获取和操作iframe

    一.需求与遇到的问题 在网站的后台管理中使用了iframe框架布局,包括顶部菜单.左侧导航和主页面.需求是:点击主页面上的一个按钮,在顶部菜单栏的右侧显示“退出”链接,点击可退出系统. 我的思路是:在 ...

  3. IOS FMDB模糊查询

    http://blog.sina.com.cn/s/blog_9630f1310101fx1d.html /查询记录 -(NSArray*)selectitemDream_desc:(JiemengS ...

  4. LPC1768IAP(详解,有上位机)

    之前说了stm32的iap编程,今天天气真好,顺手就来说说lpc1788的iap编程(没看前面的请查看stm笔记下的内容) 首先是flash的算法,lpc1768并没有寄存器来让我们操作flash,他 ...

  5. NSDateFormatter调整时间格式的代码

    NSDateFormatter调整时间格式的代码 在开发iOS程序时,有时候需要将时间格式调整成自己希望的格式,这个时候我们可以用NSDateFormatter类来处理.例如://实例化一个NSDat ...

  6. 通过非root用户访问VNC

    我采用的是realvnc5.3.2.对于非root用户通过vnc访问linux桌面,网络上绝大数文章都是说要去配置/etc/sysconfig/vncservers.但安装完realvnc5.3.2之 ...

  7. 使用ExecutorCompletionService 管理线程池处理任务的返回结果

    在我们日常使用线程池的时候,经常会有需要获得线程处理结果的时候.此时我们通常有两种做法. 1. 使用并发容器将callable.call() 的返回Future存储起来.然后使用一个消费者线程去遍历这 ...

  8. 自己实现一个IOC(控制翻转,DI依赖注入)容器

    1.新建一个控制台应用程序 TestIOC 2.新增一个 IocFactory类 using System; using System.Collections.Generic; using Syste ...

  9. Mongodb 导出json 和csv 格式数据

    导出到json: $ mongoexport.exe  -d TestDB -c TestCollection -o  ./test.json 导出到csv: If you want to outpu ...

  10. SQL第三课-自动编号与初涉约束

    自动编号:auto_increment一张数据表中,要设定字段的唯一性,就会用到编号,确保编号的唯一性是避免重名和数据混乱的一种方式.主键,一张表只能并只有一个.在创建字段表时,指定 PRIMARY ...