Node.js学习教程之HTTP/2服务器推送【译】


Posted in Javascript onOctober 31, 2017

前言

最近Node.js v8.4+版本发布带来了体验版的HTTP/2,你可以自己通过设置参数--expose-http2启动。

这篇文章,我将介绍HTTP/2最重要的一方面服务器推送并且创建一个小的Node.js程序案例来使用它。下面话不多说了,来一起看看详细的介绍吧。

关于HTTP/2

HTTP/2 的目的是通过支持完整的请求与响应复用来减少延迟,通过有效压缩 HTTP 标头字段将协议开销降至最低,同时增加对请求优先级和服务器推送的支持。

更多关于HTTP/2内容,请查看文章HTTP/2。

服务器推送

HTTP/2 服务器推送(Server Push)允许服务器在浏览器请求之前将资源发送到浏览器。

在我们转到HTTP/2之前,我们来看看它如何与HTTP/1配合使用:

在HTTP/1中,客户端向服务器发送一个请求,服务器返回一个包含许多外部资源(.js,.css等文件)链接的HTML文件。当浏览器处理这个初始HTML文件时,它开始解析这些链接,并分别加载它们。

查看下面的demo加载过程的图像。 请注意时间表上的独立请求以及这些请求的启动:

Node.js学习教程之HTTP/2服务器推送【译】

HTTP/1资源加载

这是HTTP/1的工作原理,这就是我们如何开发这么多年的应用程序。为什么要改变它呢?

当前方法的问题是用户必须等待浏览器解析响应,发现链接并获取资源。 这会延迟渲染并增加加载时间。 有一些解决方案,如内联一些资源,但也使得初始响应越来越大。

这是HTTP/2服务器推送功能进入视线的地方,因为服务器可以在浏览器请求之前将资源发送到浏览器。
看看下面的图片,通过HTTP/2提供相同服务的网站。查看时间轴和启动器。 你可以看到HTTP/2复用减少了请求数量,并且资源与初始请求一起立即发送。

Node.js学习教程之HTTP/2服务器推送【译】

HTTP/2服务器推送

让我们看看今天如何在Node.js中使用HTTP/2服务器推送,来加快客户端的加载时间。

一个Node.js HTTP/2服务器推送案例

通过加载内置的http2模块,我们可以创建我们的服务器,就像我们使用https模块一样。

有趣的部分是在请求index.html时推送其他资源:

const http2 = require('http2') 
const server = http2.createSecureServer( 
 { cert, key },
 onRequest
)

function push (stream, filePath) { 
 const { file, headers } = getFile(filePath)
 const pushHeaders = { [HTTP2_HEADER_PATH]: filePath }

 stream.pushStream(pushHeaders, (pushStream) => {
 pushStream.respondWithFD(file, headers)
 })
}

function onRequest (req, res) { 
 // Push files with index.html
 if (reqPath === '/index.html') {
 push(res.stream, 'bundle1.js')
 push(res.stream, 'bundle2.js')
 }

 // Serve file
 res.stream.respondWithFD(file.fileDescriptor, file.headers)
}

这样bundle1.js和bundle2.js资源即使在它要求它们之前也会被发送到浏览器。

你可以查看完整的案例:https://github.com/RisingStack/http2-push-example

HTTP/2 & Node

HTTP/2可以帮助我们在很多方面优化我们的客户端与服务器之间的通信。

通过服务器推送,我们可以将资源发送到浏览器,减少用户的初始加载时间。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

原文:https://blog.risingstack.com/node-js-http-2-push/

译者:Jin

作者:Péter Márton

Javascript 相关文章推荐
js中的escape及unescape函数的php实现代码
Sep 04 Javascript
jQuery MD5加密实现代码
Mar 15 Javascript
javascript 面向对象 function类
May 13 Javascript
js+xml生成级联下拉框代码
Jul 24 Javascript
javascript中input中readonly和disabled区别介绍
Oct 23 Javascript
解决jQuery使用JSONP时产生的错误
Dec 02 Javascript
JavaScript实现ASC转汉字及汉字转ASC的方法
Jan 23 Javascript
老生常谈javascript的类型转换
Oct 12 Javascript
详解vue2.0 使用动态组件实现 Tab 标签页切换效果(vue-cli)
Aug 30 Javascript
JavaScript常见鼠标事件与用法分析
Jan 03 Javascript
使用 vue 实现灭霸打响指英雄消失的效果附demo
May 06 Javascript
JS指定音频audio在某个时间点进行播放
Nov 28 Javascript
详解Vue用自定义指令完成一个下拉菜单(select组件)
Oct 31 #Javascript
原生js实现仿window10系统日历效果的实例
Oct 31 #Javascript
ES6使用Set数据结构实现数组的交集、并集、差集功能示例
Oct 31 #Javascript
Vue实战之vue登录验证的实现代码
Oct 31 #Javascript
jQuery ajax读取本地json文件的实例
Oct 31 #jQuery
ES6解构赋值的功能与用途实例分析
Oct 31 #Javascript
js原生日历的实例(推荐)
Oct 31 #Javascript
You might like
用PHP实现递归循环每一个目录
2010/08/08 PHP
php中将指针移动到数据集初始位置的实现代码[mysql_data_seek]
2012/11/01 PHP
ThinkPHP调用百度翻译类实现在线翻译
2014/06/26 PHP
smarty模板判断数组为空的方法
2015/06/10 PHP
微信支付PHP SDK之微信公众号支付代码详解
2015/12/09 PHP
零基础学JavaScript最新动画教程+iso光盘下载
2008/01/22 Javascript
JS函数实现动态添加CSS样式表文件
2012/12/15 Javascript
莱鸟介绍javascript onclick事件
2016/01/06 Javascript
Node.js用readline模块实现输入输出
2016/12/16 Javascript
JS和canvas实现俄罗斯方块
2017/03/14 Javascript
ES6正则的扩展实例详解
2017/04/25 Javascript
提升页面加载速度的插件InstantClick
2017/09/12 Javascript
React-Native之定时器Timer的实现代码
2017/10/04 Javascript
详解React+Koa实现服务端渲染(SSR)
2018/05/23 Javascript
微信h5静默和非静默授权获取用户openId的方法和步骤
2020/06/08 Javascript
jQuery实现购物车全功能
2021/01/11 jQuery
[01:31:22]Ti4 循环赛第四日附加赛LGD vs Mouz
2014/07/13 DOTA
[06:45]DOTA2-DPC中国联赛 正赛 Magma vs LBZS 选手采访
2021/03/11 DOTA
Python中转换角度为弧度的radians()方法
2015/05/18 Python
Python实现将doc转化pdf格式文档的方法
2018/01/19 Python
Python 取numpy数组的某几行某几列方法
2019/10/24 Python
Python对Excel按列值筛选并拆分表格到多个文件的代码
2019/11/05 Python
基于jupyter代码无法在pycharm中运行的解决方法
2020/04/21 Python
html5的canvas方法使用指南
2014/12/15 HTML / CSS
澳大利亚Rockwear官网:女子瑜伽、健身和运动服
2021/01/26 全球购物
Bath & Body Works阿联酋:在线购买沐浴和身体用品
2021/02/27 全球购物
荷兰最大的鞋子、服装和运动折扣店:Bristol
2021/01/07 全球购物
GWT都有什么特性
2016/12/02 面试题
教育学专业实习生的自我鉴定
2013/11/26 职场文书
《金子》教学反思
2014/04/13 职场文书
中学生社会实践活动总结
2014/07/03 职场文书
教师自查自纠材料
2014/10/14 职场文书
财务务虚会发言材料
2014/10/20 职场文书
银行先进个人总结
2015/02/15 职场文书
MySQL数字类型自增的坑
2021/05/07 MySQL
python自动计算图像数据集的RGB均值
2021/06/18 Python