80%的页面初始化响应时间花费在前端,而大部分时间都是在下载所有的页面组件,例如图片,css,js等。所以减少请求数量是让网页变快的关键。 其中一种方法是将页面设计的更简单,但是有没有方法是能既将页面设计得丰富多彩,同时又拥有高性能呢?线面提供一些建议:
用户与web服务器的物理距离对响应时间有影响。因此同时布置多个web服务器分布在华南,华北,华中,深圳,上海,等集中地区,可以加速,但是你又应该从哪开始呢?
Expires: Thu, 15 Apr 2018 20:00:00 GMT // 在2018年4月15日8点过期
ExpiresDefault "access plus 10 years" // 10年后过期
如果设置了超长过期时间,那么更新文件只能通过 更改文件后缀的hash值来更新。
尤其对于单页面应用(SPA),这种将所有页面打包在一起,通常可以压缩至1/3. 从HTTP/1.1开始,web客户端通过请求的头部添加Accept-Encoding来告诉浏览器要压缩。
Accept-Encoding: gzip, deflate
如果浏览器又看到这个的话,会做出如下响应
Content-Encoding: gzip
Gzip是现在用的最多的高效小压缩的方法。它可以压缩70%,90%的浏览都经过Gzip压缩。如果你是Apache服务器,1.3版本是mod_gizp, 2.x版本用mod)deflate.,, 但是值得注意的是,压缩要基于文件类型,像html,js,css,json文件都需要压缩,但是图片和pdf是不需要压缩的,因为他们本身就经过压缩了,再去压缩他们只会浪费CPU,而且压缩后文件体积反而会增大,
Yahoo!性能研究,我们发现将css文档放在<head></head>
种,页面会更快加载,具体请参照bootstrapt Starter template,
<!doctype html>
<html lang="en">
<head>
<!-- Required meta tags -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<!-- Bootstrap CSS -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous">
<title>Hello, world!</title>
</head>
<body>
<h1>Hello, world!</h1>
<!-- Optional JavaScript -->
<!-- jQuery first, then Popper.js, then Bootstrap JS -->
<script src="https://code.jquery.com/jquery-3.2.1.slim.min.js" integrity="sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js" integrity="sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q" crossorigin="anonymous"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js" integrity="sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl" crossorigin="anonymous"></script>
</body>
</html>
前端工程师在意页面性能,所以想要页面逐步加载,这也是Yahoo!工程师想要的,这就是,我们想要浏览器更快显示他的内容,这对于网速慢的用户尤其重要,当浏览器逐步加载页面的时候,标题导航栏顶部徽标最为等待页面的用户的视觉返回,这大大改善用户整体体验。而如果你将css文件放在文档底部的话,无法做到内容渐进式呈现,例如IE,这样子的话,页面会停留在空白页。 嗯~ o( ̄▽ ̄)o,HTML规范文档也是这么要求的。
js文件如果异常报错,会阻止同步的下载内容,一般建议延迟加载,给<script>
标签添加defer属性,不过firfox又不支持,如果将脚本放在底部,并添加defer属性延迟加载,页面加载速度更快。
css表达式是一种强大(危险)的方式动态设置css属性,适用ie5-ie8,他可能会在极短的时间内执行1w次,
background-color: expression( (new Date()).getHours()%2 ? "#B8D4FF" : "#F08A00" );
通常html文档都会下载,而css和js则会从缓存中加载。如果分离开,则html依然要下载,但是体积会减小。这个关键在于,用户从缓存中拿文件和重新加载新文件哪种情况更多。一种可以减少请求次数,另一种可以html文件体积。但是也有例外情况,比如Yahoo!和百度的首页的css和js就是内嵌的,因为大多数这种首页需要极速访问,也经过实际调研,也确实如此。这种会话只有很少的页面视图的主页,内嵌可以缩短最终用户的响应时间。 通常对于许多网站他们的第一个首页,有一些技术可以减少内联提供的http请求,以及通过外部文件实现缓存优势,其中一种方法,就是在首页内嵌js和css,但是在页面加载完成后,动态下载外部文件,后续页面将引用应该以及存在浏览器缓存中的外部文件。
DNS将主机名映射到IP地址,就像查询人的手机号码一样,但是DNS映射是需要20-120ms才能找到的,所以DNS会缓存他之前的查找,例如chrome浏览器就有自己的DNS缓存,IE默认存储30分钟DNS缓存,减少唯一主机名数量,可以减少页面中查找DNS的并行下载时间。
通常删除注释,以及空白字符,换行符,制表符(\n\t\s),这个webpack,grunt,gulp,parcel等打包工具都可以做到,同样的,html标签之间的空白,幽灵节点,同样可以通过压缩消除。
例如nginx通常就将http => https,重定向是使用301和302状态码完成的,
HTTP/1.1 301 Moved Permanently
Location: http://example.com/newuri
Content-Type: text/html
浏览器会自动将用户带到位置字段中指定的URL。重定向所需的所有信息都在标题中。响应的主体通常是空的。尽管名称不同,301和302响应在实践中都不会被缓存,除非额外的头文件(例如Expires或Cache-Control)指示它应该是。元刷新标记和JavaScript是将用户引导到不同URL的其他方式,但是如果您必须执行重定向,首选方法是使用标准的3xx HTTP状态代码,主要是为了确保后退按钮正常工作。
重定向会减慢用户体验,并且在HTML页面到来之前不会下载任何内容。
最浪费的重定向经常发生,web开发人员通常不知道例如当你访问https://www.baidu.com
会发生重定向https://www.baidu.com/
,然后默认加载https://www.baidu.com/
目录下的index.html文件。
将就网址链接到新网站,是重定向最常见的用途,创建一个CNAME文件在被定向的url目录下。
实体标签ETags
唯一标识符
HTTP/1.1 200 OK
Last-Modified: Tue, 12 Dec 2006 03:03:59 GMT
ETag: "10c24bc-4ab-457e1c1f"
Content-Length: 12195
Ajax引用的好处之一,他想用户提供返回,因为它从后台请求数据。为了提高性能,优化Ajax响应非常重要,提高Ajax性能的最重要的方法就是将响应缓存,如添加过期或缓存控制头中所属,其他规则同样适用,
当用户请求页面时,后端服务器可能需要200到500毫秒才能将HTML页面拼接在一起。在此期间,浏览器在等待数据到达时处于空闲状态。在PHP中,你有函数flush()
。它允许您将部分就绪的HTML响应发送到浏览器,以便浏览器可以在您的后端忙于HTML页面的其余部分时开始获取组件。好处主要出现在繁忙的后端或前端。
考虑刷新的好地方就在HEAD
之后,因为头部的HTML通常更容易生成,并且允许您在浏览器中包含任何CSS和JavaScript文件,以便在后端仍在处理时开始并行读取。
... <!-- css, js -->
</head>
<?php flush(); ?>
<body>
... <!-- content -->
Yahoo! 团队发现,当使用ajax XMLHttpRequest
,的时候,
POST
实现浏览器,分为2个步骤,
headers
,POST
比GET
更安全;但是post更慢, post请求过程
你可以看一下你的页面,哪些是为了呈现最初页面,必须要呈现的组件,而其余的组件可以稍后加载。
js在onload事件之后比较适合初始化某些库,原生js的onload事件和jQuery的$( document ).ready()
有区别,jquery会在js文件加载完就执行,而原生onload事件,则要等到dom里面的图片全部加载好才能触发事件。
他是后加载组件的对立面,它可以节省时间
复杂dom结构,js访问速度更慢,要遍历更多元素。
比如说你的图片网站html存在https://www.example.com/
,而你的静态资源,储存在http://static.example.com/
,这样可以让你最大限度的平行下载,由于DNS查找惩罚,请确保域不超过2-4个。
iframes允许一个HTML文档插入父文档,了解iframe如何工作以便可以有效使用,这很重要。
<iframe>
优点:<iframe>
缺点:HTTP请求比较昂贵,因此提出http请求获得无用的响应完全没有必要。而有些网站提供了404前台页面,用户体验不错,但也浪费了服务器资源,特别糟糕当外部错误并是404时候,首先此下载会阻止并行下载,浏览器会尝试解析她,就好像他是js代码。
http cookie被用来做用户验证,以及其他个性化东西,信息关于cookie可以在服务器和浏览器之间交换,降低cookies大小可以减少用户响应时间,这很重要。 请注意以下四点
当浏览器制作一个请求,比如请求一个图片,这种完全没有cookies的必要。所以你要专门设置一个托管静态资源的子域名。
js遍历dom很慢,请注意以下三点:
事件总代理,比如你有10个按钮的导航栏,不要分别给他们设置事件触发。请给他们的父容器设置总代理,对e.path做路径判断,ie没有path,请自行合成path,这个就是事件冒泡。 你不需要等到onload事件触发在添加事件代理,应为只有图片成功加载后才出发onload事件,你可以用jq的ready,或者原生的DOMContentLoaded,
<script>
document.addEventListener("DOMContentLoaded", function(event) {
console.log("DOM fully loaded and parsed");
});
</script>
<link>
而不要@importcss放在最顶端,
filters
这个css属性当设计师完成图纸,将图片传到web服务器之前,仍可以进行一些操作
请设置width或者height来缩放图片
favicon.ico
变得更小,可储存。浏览器每次都会请求他,所以最好不要回应404,最好缓存它。 请注意以下3点
为什么呢?因为iphone不会缓存25k以上的组件。
为什么下述行为有害?
参考: