谈谈HTTP/2对前端的影响【转载】
原文:http://www.peep-squirrel.com/itcontent-2500617.html
随着 HTTP/2 规范的确认,以及主流浏览器(Chrome、Firefox、IE11)对其的全面支持,是时候采用新协议了。看了很多博文跟官方说明,在此做个总结,
为什么要有 HTTP/2 ?
一句话评价:预先加载,合并请求,缩小数据,提升性能。
HTTP 1.1时代,每个TCP连接一次只能下载一个资源,比如浏览器发送一个请求获取index.html
的数据,服务端收到后只会返回index.html
,随后浏览器会解析index.html
,如果里面含有<link rel="stylesheet" href="xxx.css">
或<script src="app.js"></script>
,则会再次向服务器发送请求,获取xxx.css
和app.js
的数据。 这一过程会产生 三个性能问题:
- 如果
index.html
里含有多个js和css文件,请求数则随之增加,从而导致在TCP往返连接所耗费的时间增多。 - 每次发送的请求,HTTP头部信息基本是一样的,从而导致一定的头部信息冗余,耗费了不必要的流量。
index.html
与内部的资源文件之间会产生了一个延时,而非同步获取。
由于上述问题,也就催生出了 HTTP/2。在HTTP/2中,多个请求是可以合并为一个的,如下图,多个数据请求允许在同一路中传输(Multiplexed),这样也就可以解决了 问题1。
而因为是同一个请求,因此 HTTP头信息 只需要有一个就足够,下图可看出,HTTP/2中一个请求头中允许有多个方法,既可以GET,也可以PUT,在切换到下一个方法时,只需要获取数据即可,而不用再次获取头信息。
而且,HTTP/2将头信息进行了压缩(参见HPACK),进一步的减少了头信息的大小,因此 问题2 得到了解决。
同时,HTTP/2 新加入了 PUSH
方法,该方法的主要作用就是让服务器试探性的去推送信息给客户端,如 问题3 中所述情况,当请求index.html
时,服务器在返回index.html
的同时,会主动把xxx.css
和app.js
一同发送给浏览器。这样当浏览器解析DOM,准备发送请求获取xxx.css
和app.js
的时候,也许两个资源已经下载完了,只需要从缓存中获取即可。这样就大大减少了网络请求的时间。
HTTP/2给前端带来哪些影响?
虽然HTTP/2是在协议方面的改进,且但其机制也对目前前端的部分优化方案产生一定影响。
减少HTTP请求不一定提升性能
如上所述, HTTP/2 针对多个请求进行了优化,因此之前我们在前端中所做的 关于减少HTTP请求的最佳实践都不再适用,如合并JS、CSS文件(Concatenation),多个图片或图标合并(Spriting),将较小的JS或CSS文件内嵌到HTML中(Inlining),合并HTML文件(Vulcanize),根据 此网站 的测试结果显示,在使用HTTP/2后,合并为一个大文件的加载时间反而会比不合并更长。
如上图所示,其中TTFB时间明显减少,所谓TTFB(Time To First Byte),即从浏览器发送请求开始,到接受到来自服务器的返回的第一字节信息(HTTP头信息)结束,之间所耗费的时间。这里就会包含 TCP连接往返(round trip)+服务器处理时间(如SQL执行)。 因为浏览器在第一次发送请求后,服务器已经预先把其他资源文件一同推送给了浏览器,因此后续的资源请求中,TTFB的时间得到了缩小。
压缩仍然需要
有些可能会问,那是不是用了 HTTP/2 后,资源文件也不需要压缩了呢? 答案是No,压缩文件还是有必要的,毕竟获取一个小文件的时间比大文件更短,HTTP/2并不会帮你自动压缩文件。
可以看出,HTTP/2 目的之一,就在于想把开发环境与生产环境的部署尽量保持一致,减少因为打包合并而产生一些不必要的麻烦。
如何使用 HTTP/2 ?
目前一部分主流网站已经采用了 HTTP/2,而很多语言也已经有实施方案,详细的可见该 列表, 本文只介绍下如何用 NodeJS 搭建 HTTP/2 站点。
创建证书
虽然目前规范中并没有达成一致意见来决定 HTTP/2 是否需要加密( Encryption ),但目前主流的实施方案都是需要加密的(如SSL/TLS),因此,如同 HTTPS,HTTP/2 同样需要创建公私密钥,来搭建站点。
创建Key:
openssl req -new -newkey rsa:2048 -nodes -keyout localhost.key -out localhost.csr
在输入完身份信息后,输出证书:
openssl x509 -req -days 365 -in localhost.csr -signkey localhost.key -out localhost.crt
搭建服务
如果是初次使用npm安装,则初始化npm依赖管理:
npm init
此时则会在当前目录中,生成一个package.json
文件。
安装http2包:
npm install http2 –save
新建app.js
文件:
var https = require('http2');
var fs = require('fs');
var options = {
key: fs.readFileSync('localhost.key'),
cert: fs.readFileSync('localhost.crt')
};
https.createServer(options, function(request, response) {
fs.readFile(__dirname + request.url, function (err,data) {
if (err) {
response.writeHead(404);
response.end(JSON.stringify(err));
return;
}
response.writeHead(200);
response.end(data);
});
}).listen(8080);
验证
这样就搭建完毕,运行即可看到结果
node app.js
如果想确认是否真的采用了 HTTP/2, 只需要在Chrome Dev Tools > Network中,新增 Protocol,即可看到结果:
2015-12-25 更新:
另外注意一点,如果你是从http转向https,需要在服务端/客户端做个重定向,保证用户访问的站点是https而不是http。
// Redirect from http port 80 to https
var http = require('http');
http.createServer(function (req, res) {
res.writeHead(301, { "Location": "https://" + req.headers['host'] + req.url });
res.end();
}).listen(80);
或者在页面端:
var host = "YOURDOMAIN.github.io";
if ((host == window.location.host) && (window.location.protocol != "https:"))
window.location.protocol = "https";
而且一旦搭建了https,页面内部所有的外部资源都必须实施https,否则会浏览器阻拦:
Mixed Content: The page at 'https://localhost:8080/index.html' was loaded over HTTPS, but requested an insecure script 'http://hectorguo.com/Universities-in-US/app.min.js'. This request has been blocked; the content must be served over HTTPS.
如何使用 PUSH ?
PUSH 是 HTTP/2 的新方法,虽然可以让服务端预先推送资源给客户端,但并不是说只要使用该方法性能就会提升,有时反而会下降。目前官方还未公布最佳实践方法,因此并不建议在生产环境中运用,但可以在开发环境下体验。
Google提供了一个 SimpleHttp2Server 来简单搭建 HTTP/2 并使用 PUSH 方法,NPM中也提供了一个 http2-push-manifest 包,可以自动检测 html文件中的请求资源,方便服务端识别需要PUSH的文件。
HTTP/2 部署现状
客户端
目前各大浏览器对 HTTP/2 的支持度如下:
可以看出基本可以不用担心浏览器的支持度问题,而且由于与HTTP 1.1的API一致,只要 服务端部署完成,即可无缝体验。
服务端
Chrome有个 插件,可以简单的监测站点是否采用了 HTTP/2, 经过一些主流网站的观察,发现国外站点的部署效率的确要高很多。
Google、Twitter、YouTube目前都采用 HTTP/2 (蓝色⚡️代表H2)
而国内看了下,百度,必应都木有采用,而淘宝采用了SPDY 3.1(可以看作H2的前一代,绿色⚡️)
参考
- https://http2.github.io/faq/
- https://http2-push.appspot.com/
- http://blog.httpwatch.com/2015/01/16/a-simple-performance-comparison-of-https-spdy-and-http2/
- https://github.com/molnarg/node-http2
- https://bjartes.wordpress.com/2015/02/19/creating-a-http2-server-with-node-js/
- https://www.futurehosting.com/blog/what-does-http2-mean-for-web-designers/
- https://github.com/GoogleChrome/simplehttp2server
- https://www.youtube.com/watch?v=r5oT_2ndjms
谈谈HTTP/2对前端的影响【转载】的更多相关文章
- netsh & winsock & 对前端的影响
netsh 与 winsock 一个是window的脚本工具,另一个则是window是网络编程中要用到的网络接口,而非要说跟我小小的前端有什么影响,那还真有...,当然这个影响是很不好的,比如node ...
- ahjesus 前端缓存原理 转载
LAMP缓存图 从图中我们可以看到网站缓存主要分为五部分 服务器缓存:主要是基于web反向代理的静态服务器nginx和squid,还有apache2的mod_proxy和mod_cache模 浏览器缓 ...
- 谈谈对Spring IOC的理解(转载)
学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的,今天和大家 ...
- js excel导出 前端实现(转载)
本文为转载,本人亲测可用,感谢原作者,原文在这里. 一.由于公司项目需要,需要将表格数据导出为EXCEL表格数据. 环境React+Ant Design 二.安装插件js-export-excel ...
- webpack入门(转载)
阅读本文之前,先看下面这个webpack的配置文件,如果每一项你都懂,那本文能带给你的收获也许就比较有限,你可以快速浏览或直接跳过:如果你和十天前的我一样,对很多选项存在着疑惑,那花一段时间慢慢阅读本 ...
- web前端工程师在移动互联网时代里的地位问题
支付宝十周年推出了一个新产品:支付宝的十年账单,我也赶个时髦查看了一下我的支付宝十年账单,哎,感慨自己真是太屌丝了,不过这只是说明我使用淘宝少了,当我大规模网上购物时候,我很讨厌慢速的快递,所以我大部 ...
- BAT及各大互联网公司前端笔试面试题--Html,Css篇
注意 转载须保留原文链接(http://www.cnblogs.com/wzhiq896/p/5931347.html )作者:wangwen896 整理分享出来希望更多的前端er共同进步吧,不仅适用 ...
- 微信小程序的开发:通过微信小程序看前端
前言 2016年9月22日凌晨,微信官方通过"微信公开课"公众号发布了关于微信小程序(微信应用号)的内测通知.整个朋友圈瞬间便像炸开了锅似的,各种揣测.介绍性文章在一夜里诞生.而真 ...
- web前端工程师在移动互联网时代里的地位问题 为啥C/S系统在PC端没有流行起来,却在移动互联网下流行了起来 为啥移动端的浏览器在很多应用里都是靠边站,人们更加倾向于先麻烦自己一下,下载安装个客户端APP
web前端工程师在移动互联网时代里的地位问题 支付宝十周年推出了一个新产品:支付宝的十年账单,我也赶个时髦查看了一下我的支付宝十年账单,哎,感慨自己真是太屌丝了,不过这只是说明我使用淘宝少了,当我大规 ...
随机推荐
- 基于Quartz实现简单的定时发送邮件
一.什么是Quartz Quartz 是一个轻量级任务调度框架,只需要做些简单的配置就可以使用:它可以支持持久化的任务存储,即使是任务中断或服务重启后,仍可以继续运行.Quartz既可以做为独立的应用 ...
- ch5-Class 与 Style 绑定(v-bind:class v-bind:style)
数据绑定一个常见需求是操作元素的 class 列表和它的内联样式. 因为它们都是属性 ,我们可以用v-bind 处理它们:只需要计算出表达式最终的字符串. 不过,字符串拼接麻烦又易错.因此,在 v-b ...
- GRE 协议简介
1. 协议简介 gre(generic routing encapsulation,通用路由封装)协议是对某些网络层协议(如ip 和ipx)的数据报进行封装,使这些被封装的数据报能够在另一个网络 ...
- C#生成Code128码
using System; using System.Collections.Generic; using System.Data; using System.Drawing; namespace C ...
- Logcat monkey命令
1. monkey命令 adb shell monkey -p com.autonavi.gxdtaojin --bugreport --ignore-crashes --ignore-timeout ...
- 容器中使用iptables报错can't initialize iptables table Permission denied (you must be root)
背景 在docker容器中部署了一微服务,该服务需要docker push镜像到docker registry.因此,docker容器中需要安装docker服务.但在启动容器的时候,却报错: can' ...
- win10 3dmax 激活后反复激活和激活码无效问题
我也是遇到这个问题在网上找答案,像什么断网,清理注册表,删除某个.dat文件 各种试了好多都没管用 弄这个弄了五六个小时才总算成功 心累 现在我总结一下这些方法 我是第一条成功的 其他的我试着都没用 ...
- pm2用法详解+ecosystem.config
对于后台进程的管理,常用的工具是crontab,可用于两种场景:定时任务和常驻脚本.关于常驻脚本,今天介绍一款更好用的工具:pm2,基于nodejs开发的进程管理器,适用于后台常驻脚本管理,同时对no ...
- mysql的并发处理机制_下篇
MySQL的并发处理机制,有MVCC及锁机制来处理,上篇简要说明了 MVCC及隔离级别,这篇来说说mysql下的锁. 温馨提示:下文有几个表格长度较长,右下角的博文导航目录会挡道,浏览 ...
- Volley图片加载并加入缓存处理(转自http://blog.csdn.net/viewhandkownhealth/article/details/50957024)
直接上代码 两种方式 ImageView 和NetworkImageView 如有问题或者好的建议.意见 欢迎大家加入技术群(群号: 387648673 ) 先自定义全局Application 获取 ...