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 相关文章推荐
IE6下focus与blur错乱的解决方案
Jul 31 Javascript
js模仿html5 placeholder适应于不支持的浏览器
Jan 13 Javascript
jqplot通过ajax动态画折线图的方法及思路
Dec 08 Javascript
在JavaScript的jQuery库中操作AJAX的方法讲解
Aug 15 Javascript
使用jQuery5分钟快速搞定双色表格的简单实例
Aug 08 Javascript
BootStrap table删除指定行的注意事项(笔记整理)
Feb 05 Javascript
微信小程序 自定义消息提示框
Aug 06 Javascript
使用JavaScript实现一个小程序之99乘法表
Sep 21 Javascript
基于JavaScript实现五子棋游戏
Aug 26 Javascript
解决node修改后需频繁手动重启的问题
May 13 Javascript
ant-design表单处理和常用方法及自定义验证操作
Oct 27 Javascript
angular *Ngif else用法详解
Dec 15 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
Laravel 5框架学习之向视图传送数据
2015/04/08 PHP
PHP实现文件上传和多文件上传
2015/12/24 PHP
PHP递归的三种常用方式
2019/02/28 PHP
GreyBox技术总结(转)
2010/11/23 Javascript
jquery 年会抽奖程序
2011/12/22 Javascript
Js+Flash实现访问剪切板操作
2012/11/20 Javascript
jquery div拖动效果示例代码
2013/12/08 Javascript
nodejs实现HTTPS发起POST请求
2015/04/23 NodeJs
深入理解bootstrap框架之第二章整体架构
2016/10/09 Javascript
js 中获取制定的cook信息实现方法
2016/11/19 Javascript
js实现符合国情的日期插件详解
2017/01/19 Javascript
JS变量中有var定义和无var定义的区别以及es6中let命令和const命令
2017/02/19 Javascript
AngularJS动态添加数据并删除的实例
2018/02/27 Javascript
Vue实现的父组件向子组件传值功能示例
2019/01/19 Javascript
JavaScript接口实现方法实例分析
2020/05/16 Javascript
vue实现评价星星功能
2020/06/30 Javascript
ES6学习教程之Promise用法详解
2020/11/22 Javascript
python xml解析实例详解
2016/11/14 Python
Pandas探索之高性能函数eval和query解析
2017/10/28 Python
python-itchat 统计微信群、好友数量,及原始消息数据的实例
2019/02/21 Python
Python实现的微信支付方式总结【三种方式】
2019/04/13 Python
Matplotlib使用字符串代替变量绘制散点图的方法
2020/02/17 Python
Django如何使用jwt获取用户信息
2020/04/21 Python
Python坐标轴操作及设置代码实例
2020/06/04 Python
使用CSS3 制作一个material-design 风格登录界面实例
2016/12/12 HTML / CSS
白酒业务员岗位职责
2013/12/27 职场文书
挑战杯创业计划书的写作指南
2014/01/07 职场文书
2014年会策划方案
2014/05/11 职场文书
工商行政管理专业求职书
2014/05/23 职场文书
求职信范文大全
2014/05/26 职场文书
2015年幼儿园元旦游艺活动策划书
2014/12/09 职场文书
岳庙导游词
2015/02/04 职场文书
安全员岗位职责范本
2015/04/11 职场文书
民事上诉状范文
2015/05/22 职场文书
工作汇报材料难写?方法都在这里了!
2019/07/01 职场文书
Python Django搭建文件下载服务器的实现
2021/05/10 Python