谈谈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.cssapp.js的数据。 这一过程会产生 三个性能问题

  1. 如果index.html里含有多个js和css文件,请求数则随之增加,从而导致在TCP往返连接所耗费的时间增多。
  2. 每次发送的请求,HTTP头部信息基本是一样的,从而导致一定的头部信息冗余,耗费了不必要的流量。
  3. 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.cssapp.js一同发送给浏览器。这样当浏览器解析DOM,准备发送请求获取xxx.cssapp.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的前一代,绿色??)

参考

  1. https://http2.github.io/faq/
  2. https://http2-push.appspot.com/
  3. http://blog.httpwatch.com/2015/01/16/a-simple-performance-comparison-of-https-spdy-and-http2/
  4. https://github.com/molnarg/node-http2
  5. https://bjartes.wordpress.com/2015/02/19/creating-a-http2-server-with-node-js/
  6. https://www.futurehosting.com/blog/what-does-http2-mean-for-web-designers/
  7. https://github.com/GoogleChrome/simplehttp2server
  8. https://www.youtube.com/watch?v=r5oT_2ndjms
时间: 2024-08-20 14:54:52

谈谈HTTP/2对前端的影响【转载】的相关文章

使用 node.js 开发前端打包程序 ---转载

我们在做前端开发的时候经常会在部署上线的时候做程序的打包和合并,我们接下来就会对如何使用 node.js 开发前端打包程序做非常深入的讲解,希望能够帮到有需要的同学. 我们现在做前端开发更多的是多人共同协作开发,每个人负责不同的模块,便于开发和调试.这样就导致我们最后部署上线的时候需要把所有人开发的模块进行合并,生成单个或多个文件上线.如果手动合并的话肯定是费时又费力,而且非常容易出错,所以我们一般都是通过一些工具来实现自动合并的功能. 打包程序的原理非常简单,入口文件->寻找依赖关系->替换

ahjesus 前端缓存原理 转载

LAMP缓存图 从图中我们可以看到网站缓存主要分为五部分 服务器缓存:主要是基于web反向代理的静态服务器nginx和squid,还有apache2的mod_proxy和mod_cache模 浏览器缓存:包括页面html缓存和图片js,css等资源的缓存 PHP缓存:有很多免费的PHP缓冲加速工具,如apc eaccerlertor等 内存缓存:主要是采用memcache这种分布式缓存机制 数据库缓存:通过配置数据库缓存,以及数据存储过程,连接池技术等 下面重点介绍浏览器缓存原理: 从上图:我们

论前端工程化(转载)

在不知道什么时候,突然有人提起前端工程化这东西,一开始觉得又是某个大神故意提起的高深词汇,专门来吓唬人的. 继而我疯狂查找了很多的资料,在接近二十篇的相关资料,每一篇文章都写得神乎其神,大有唯我独尊的意味,但每篇看下来,总感觉不对经--就是大家都把自己一套比较规范的开发套路充当出前端工程化,前端工程化变成了前端优化,让人看了,"对啊,这样做规范多了,优化不错啊,巴拉巴拉",但又觉得工程化不应该只是这些,像缺什么,让人看得云里雾里,似懂非懂.这种文章虽不算误人子弟,但讳莫如深,妖魔化了前

谈谈对程序员的培养(转载),或许我们可以停下来思考思考

申明:本文转载来自原创:http://raychase.iteye.com/blog/1450079 这篇文字是我好久以来的想法,有一些感悟,有一些激烈的言辞,我很自豪我就是一名程序员,我希望给程序员或者前程序员们带来一点启发.也许你认可我的言辞,也许你不屑我的观点,无论如何,欢迎谈谈你的看法. 让程序员做更多种类的事 为什么有人说小公司锻炼人?在小公司,条件并不那么齐备,很多事情都需要程序员自己做,自己去澄清需求.自己做设计.自己搭建环境.自己测试,甚至自己上线.自己维护(这件事情在我们团队被

前端资源汇总[转载]

JavaScript 框架/库 Animations vivus:可以动态描绘 SVG 的 JS 库, 支持多种动画 Web Animation:Javascript 实现的 Web Animation API scrollReveal.js:使元素以非常酷帅的方式进入画布 (Viewpoint) snabbt.js:一个利用 Javascript 和 CSS transform 的 animation 库 matter-js:2D 物理效果引擎,碰撞.弹跳等 parallax:一个用于响应智能

网页设计对搜索引擎营销推广的影响 转载

由于不同的搜索引擎在网页支持方面存在差异,因此在设计网页时不要只注意外观漂亮,许多平常设计网页时常用到的元素到了搜索引擎那里会产生问题. 框架结构(Frame Sets)     有些搜索引擎(如FAST)是不支持框架结构的,他们的“蜘蛛”程序无法阅读这样的网页. 图象区块(Image Maps)     除AltaVista.Google和Northern Light(现已停止公共搜索服务)明确支持图像区块链接外,其他引擎是不支持它的.当“蜘蛛”程序遇到这种结构时,往往会感到茫然不知所措.因此

浅谈域名发散与域名收敛

性能优化一直是前端工作中十分重要的一环,都说从 10 到 1 容易,从 1 到 0 很难.而随着前端技术的飞速发展,没有什么技术或者法则是金科玉律一成不变的. 很佩服那些勇于挑战权威,推陈出新的勇者,是他们让我们的技术不断的变革更加的卓越.好像扯远了,本文主要想谈谈两个名词,域名发散和域名收敛.    域名发散 这个很好理解,前端er都知道,PC 时代为了突破浏览器的域名并发限制,遵循这样一条定律: · http 静态资源采用多个子域名 嗯,为什么要这样做呢,目的是充分利用现代浏览器的多线程并发

前端笔试总结

一.HTML和CSS 1.你做的页面在哪些流览器测试过?这些浏览器的内核分别是什么? IE: trident内核 Firefox:gecko内核 Safari:webkit内核 Opera:以前是presto内核,Opera现已改用Google Chrome的Blink内核 Chrome:Blink(基于webkit,Google与Opera Software共同开发) 2.每个HTML文件里开头都有个很重要的东西,Doctype,知道这是干什么的吗? <!DOCTYPE> 声明位于文档中的最

阿里前端两年随想

阿里前端两年随想 其实按照我的情怀和尿性,文章的标题应该是 前端登堂入室宝典.前端成长就这三招 之类,奈何这是篇软文 ~ 看官先别急Command + W,尤其是和我经历类似 做着其它岗位的工作,却多少会接触一些前端 发现有些兴趣,但又不肯定这应该是自己未来 也会有些成就感,但似乎挫折和沮丧来的更多一些 我可以负责任的说,这是一篇有态度的软文 欲语泪先流 我希望做些有用的事情,甚至可以做个有用的人 才毕业工作的第一年我是满足的,学到了很多新知识,写的代码不但能work,还能真的跑在生产环境中 我