简述HTTP/2的特性及其对前端的影响
去年5月HTTP/2正式发布,自1999年引入HTTP1.1已逾15年。这些年的发展使得页面相比2000年实不可同日而语,而基础协议却始终没有迎来什么变革。早前虽然有Google的SPDY,并且因为Google号召力各方面的支持度并不低,但毕竟不是行业标准。所以如今的HTTP/2上马绝对称得上是众望所归了。
HTTP/2发布伊始,浏览器方的支持相对还要更好一些,服务器端的跟进稍慢,但到了1年多后的现在都已经相当成熟了。不知不觉间访问的很多网站都已经部分或全部都切换到HTTP/2,着实像是一股风潮,不赶一下好像显得有些落伍一样:)
HTTP/2与HTTP1.1的区别
HTTP/2解决了很多当前HTTP1.1中的问题,而且着眼点是毫无疑问,是性能。个人觉得最核心的是:连接复用(减少昂贵的连接开销),二进制传输(更高效的传输方式)。
当然也可以用官方的FAQ方式阐述:
- 二进制替代文本
- 完全复用替代顺序阻塞
- 可以使用一个连接并行
- 使用头部压缩来减少开销
- 允许服务器主动推送响应到客户端缓存
其中最后一点是被称为“Server Push”的特性,看名称容易发生混淆,所以很多地方都改称之为“Cache Push”。并非指WebSocket那样的推送,而是指服务器在客户发起请求前就主动将关联资源通过共享连接下发,就这点而言,收益最多的毫无疑问是:CSS样式文件。
虽然HTTP/2并没有要求HTTPS,但主流浏览器支持却均将HTTPS列为必要前提,这使得部署HTTPS已经实质上成为部署HTTP/2的先决条件。这也是我最近启用HTTPS的原因,对于个人网站来说HTTPS并不能带来决定性好处,但HTTP/2的性能优势却着实很诱人。
HTTP/2对前端的影响
这些年来,前端在性能优化方面真的是费尽心血,各种最佳实践可以列出整整3页A4吧...其中最为核心的无疑是:减少请求数。无论是图片sprite,CSS合并,JS合并等等。所以,与其说是HTTP/2给前端带来的影响,更准确的说,是连接成本的下降带来的变化。
一直以来的思路总是,连接是昂贵的。如果哪一天这种思路被彻底颠覆,连接变成白菜一般廉价,甚至所有的内容在一个连接里完成了下载,那么那些优化连接数来提升性能的做法,将渐渐成为历史。典型的,当HTTP/2彻底普及的时候,为了节省连接数的丑陋的内联样式的做法就显得毫无必要了。
未来前端需要将更多的精力集中在页面本身而非页面性能,只是这个未来还比较遥远。短期内还会出现两种形态并存的情况,页面性能的话题反而会因为涉及面更广而变得更复杂。所以现阶段并不需要做什么特别的事,只需要分清楚哪些是将来依旧长期有效的方法、而哪些只是现阶段流行做法即可。
HTTP/2的部署
以nginx(1.9.5以上)为例,当前的部署已经非常成熟,在配置好HTTPS的情况下,只是配置文件添加些微启用配置而已。然而,却需要注意OpenSSL的版本过低问题,因为Chrome从版本51开始仅支持ALPN,使得带有低版本OpenSSL编译的服务器启用HTTP/2在Chrome51上的表现将会降级到HTTP1.1。(详参:为什么我们应该尽快支持 ALPN?)
上周,我将nginx升级到了1.11.2,事后才发现降级的事,ubuntu14.04附带的OpenSSL 1.0.1f版本过低。对于OpenSSL的问题我个人还是推荐更新系统,自己重新编译nginx并指定OpenSSL的版本终究只能算是一个临时策略,如果不是特别麻烦的话还是换掉系统来的彻底。可惜上周我停掉服务器,准备换系统的时候,发现阿里云丫还没有上马ubuntu16.04!真是尴尬,一阵脱力之后,我打算暂时不管这事了...
没错,写这么多,其实我就是为了吐槽阿里云的!