吴家荣
github.com/wujr5
@John_sysu
生活中,我们经常处于各种各样的等待状态。
到处都是等待......
web性能 VS 网页性能
1. 网页加载时间:Page Loading Time
2. 繁重的页面,越来越长的加载时间
Web performance refers to the speed in which web pages are downloaded and displayed on the user's web browser.
什么是Fast?
1. 用户角度:期待2-3秒加载一个网页
2. 如果一个网页加载时间超过4s,50%的用户会选择关闭页面
1S的延迟
1. 减少11%的网页浏览量
2. 减少16%的用户满意度
3. 减少7%的利润转化
延迟时间和用户感觉
所以,我们说
在250ms内,要尽量让网页加载完成或者至少有内容呈现给用户,才能确保用户不丢失
总结
越快越好!
亚马逊
网页加载时间增加100ms,销售额减少1%
Walmart
每优化1s,增加2%的利润转化
研究表明
全球平均带宽(下载):21.3Mbps (21.3/8 MB/s)
全球手机平均下载速度:10.9Mbps (10.9/8 MB/s)
什么是web application?
什么是website?
什么是HTTP协议?
web application是如何工作的?
HTTP协议是如何工作的?
GET www.cnblogs.com
$> telnet google.com 80
Connected to 74.125.xxx.xxx
GET /about/
(hypertext response)
(connection closed)
但这已经能满足当时的要求了
改变1:增加POST方法,B向S发送数据,WEB应用基础
改变2:引入了HTTP头,状态码,传输内容不限于文本
改变3:增加了更多的字段
$> telnet website.org 80
Connected to xxx.xxx.xxx.xxx
GET /rfc/rfc1945.txt HTTP/1.0 1
User-Agent: CERN-LineMode/2.15 libwww/2.17b3
Accept: */*
HTTP/1.0 200 OK 2
Content-Type: text/plain
Content-Length: 137582
Expires: Thu, 01 Dec 1997 16:00:00 GMT
Last-Modified: Wed, 1 May 1996 12:45:26 GMT
Server: Apache 0.84
(plain-text response)
(connection closed)
解决了前两个版本存在的问题
提出了一些性能优化方式
减轻服务器负载,限制TCP链接
~6 TCP链接/域名
每次请求都需要建立连接
(每次请求时间,大概是200ms)
每次请求都需要建立连接
(每次请求时间,大概是200ms)
阻塞加载CSS文件、JS文件
1.减少HTTP请求次数
2.使用CDN(Content Delivery Network, 内容分发网络)
3.增加Expires Header
4.压缩页面元素
5.把样式表放在头上
6.把脚本文件放在底部
7.避免CSS表达式
8.把JavaScript和CSS放到外部文件中
9.减少DNS查询次数
10.最小化JavaScript代码
11.避免重定向
12.删除重复的脚本文件
13.配置ETags
14.缓存Ajax
1. 文件拼接和压缩
2. 雪碧图
3. Inline Image
1. 文件拼接和压缩
2. 雪碧图
3. Inline Image
4. Domain Sharding
1. 多路复用:单个TCP连接允许多个请求
2. 资源优先级:浏览器可以设置资源的优先级
3. 压缩和减少HTTP header
4. Server Push:服务器直接发送资源,而不需要浏览器发送请求,减少请求时间
SSL/TLS Required
Serving HTTP/2
配置支持HTTP/2的服务器
浏览器支持
var express = require('express')
var app = express()
app.get('/', function (req, res) {
res.send('hello, http2!')
})
var options = {
key: fs.readFileSync('./example/localhost.key'),
cert: fs.readFileSync('./example/localhost.crt')
};
require('http2').createServer(options, app).listen(8080);
Express Code