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 相关文章推荐
URL编码转换,escape() encodeURI() encodeURIComponent()
Dec 27 Javascript
固定表格行列(expression)在IE下适用
Jul 25 Javascript
利用JQuery和Servlet实现跨域提交请求示例分享
Feb 12 Javascript
提取jquery的ready()方法单独使用示例
Mar 25 Javascript
JS数组的常见用法实例
Feb 10 Javascript
js中字符串编码函数escape()、encodeURI()、encodeURIComponent()区别详解
Apr 01 Javascript
Node.js开启Https的实践详解
Oct 25 Javascript
JS实现求数组起始项到终止项之和的方法【基于数组扩展函数】
Jun 13 Javascript
axios对请求各种异常情况处理的封装方法
Sep 25 Javascript
微信小程序页面间传值与页面取值操作实例分析
Apr 30 Javascript
javscript 数组扁平化的实现
Feb 03 Javascript
javascript设计模式 ? 代理模式原理与用法实例分析
Apr 16 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中的实现trim函数代码
2007/03/19 PHP
php将HTML表格每行每列转为数组实现采集表格数据的方法
2015/04/03 PHP
PHP互换两个变量值的方法(不用第三变量)
2016/11/14 PHP
Javascript实例教程(19) 使用HoTMetal(3)
2006/12/23 Javascript
扩展javascript的Date方法实现代码(prototype)
2010/11/20 Javascript
javascript实现上传图片并预览的效果实现代码
2011/04/11 Javascript
在Javascript里访问SharePoint列表数据的实现方法
2011/05/22 Javascript
Jquery给基本控件的取值、赋值示例
2014/05/23 Javascript
JavaScript 学习笔记之变量及其作用域
2015/01/14 Javascript
Nodejs关于gzip/deflate压缩详解
2015/03/04 NodeJs
js淡入淡出的图片轮播效果代码分享
2015/08/24 Javascript
javascript实现拖动元素交换位置
2015/11/29 Javascript
Angular2搜索和重置按钮过场动画
2017/05/24 Javascript
angular 用拦截器统一处理http请求和响应的方法
2017/06/08 Javascript
react高阶组件经典应用之权限控制详解
2017/09/07 Javascript
jquery中ajax请求后台数据成功后既不执行success也不执行error的完美解决方法
2017/12/24 jQuery
Vue使用vux-ui自定义表单验证遇到的问题及解决方法
2018/05/10 Javascript
微信小程序动画(Animation)的实现及执行步骤
2018/10/28 Javascript
JavaScript函数Call、Apply原理实例解析
2020/02/17 Javascript
[01:09:19]DOTA2-DPC中国联赛 正赛 VG vs Aster BO3 第二场 2月28日
2021/03/11 DOTA
Python编程给numpy矩阵添加一列方法示例
2017/12/04 Python
详解如何在python中读写和存储matlab的数据文件(*.mat)
2018/02/24 Python
Python实现压缩文件夹与解压缩zip文件的方法
2018/09/01 Python
python对html过滤处理的方法
2018/10/21 Python
python tkinter canvas 显示图片的示例
2019/06/13 Python
解决Django 在ForeignKey中出现 non-nullable field错误的问题
2019/08/06 Python
深入浅析python的第三方库pandas
2020/02/13 Python
StubHub墨西哥:购买和出售您的门票
2016/09/17 全球购物
北美领先的智能产品购物网站:Wellbots
2018/06/11 全球购物
印度服装购物网站:Limeroad
2018/09/26 全球购物
泰国第一在线超市:Tops
2021/02/13 全球购物
高中毕业自我鉴定
2013/12/13 职场文书
出国留学计划书
2014/04/27 职场文书
大学生社会实践活动总结
2014/07/03 职场文书
thinkphp 获取控制器及控制器方法
2021/04/16 PHP
Windows Server 2012 R2服务器安装与配置的完整步骤
2022/07/15 Servers