专栏首页京程一灯使用 Node.js 进行 HTTP/2 Server Push

使用 Node.js 进行 HTTP/2 Server Push

Node.js 8.4.0 开始实验性的支持HTTP/2,可以使用--expose-http2参数来启用。

在这篇博客中,我们将要介绍HTTP/2的服务端推送并且创建一个小的Node.js 应用来进行尝试。

关于 HTTP/2

HTTP/2的主要目标是通过启用完整的请求和响应复用来减少延迟,通过HTTP头域的高效压缩来最大限度地减少协议开销,并增加对请求优先级和服务器推送的支持。

了解更多关于 HTTP/2,请阅读 HTTP/2 介绍。

Server Push

HTTP/2 Server Push 可以让服务器在用户允许的情况下,主动向浏览器发送资源。

在我们使用 HTTP/2 之前,让我们了解一下 HTTP/1 如何实现:

在HTTP/1中,客户端向服务器发送一个请求,通常是一个 HTML 文件,里面包含着很多资源的链接(.js、.css 等文件),服务器根据这些链接返回资源。当浏览器处理这个初始 HTML 文件时,它开始解析这些链接,并分别请求它们。

下面的图片演示了这个过程。请注意时间表上的独立请求以及这些请求的启动时间:

HTTP/1 资源加载

这是HTTP/1的工作原理,我们使用这种方式开发应用已经很多年了。为什么要改变呢?

当前方法的问题是,用户必须等待浏览器解析相应,获取链接并且加载资源。这样延缓渲染并且增加加载时间。有一些解决方案,如内联一些资源,但这样让初始的相应变得更大、更慢。

这是使用 HTTP/2 Server Push 的图片,服务器可以在资源甚至要求之前将资源发送给浏览器。

下面这张图展示的是相同的网页,在 HTTP/2 下访问的情况。检查一下时间轴和初始化内容。您可以看到 HTTP/2 通过复用减少了请求数量,并且资源与初始请求一起立即发送。

HTTP/2 Server Push

让我们看一下如何通过 Node.js 使用 HTTP/2 Server Push 来提升客户端加载时间。

Node.js HTTP/2 Server Push 例子

通过要求内置的 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.jsbundle2.js将会在没有被请求的时候bei推送到浏览器。


往期精选文章

使用虚拟dom和JavaScript构建完全响应式的UI框架

扩展 Vue 组件

使用Three.js制作酷炫无比的无穷隧道特效

一个治愈JavaScript疲劳的学习计划

全栈工程师技能大全

WEB前端性能优化常见方法

一小时内搭建一个全栈Web应用框架

干货:CSS 专业技巧

四步实现React页面过渡动画效果

让你分分钟理解 JavaScript 闭包



小手一抖,资料全有。长按二维码关注京程一灯,阅读更多技术文章和业界动态。

本文分享自微信公众号 - 京程一灯(jingchengyideng)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-09-26

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 认识Set和Map数据结构

    tips : 由于 Set 结构没有键名,只有键值(或者说键名和键值是同一个值),所以keys方法和values方法的行为完全一致,而entries方法返回的...

    JianLiang
  • 用beego vue.js element axios 写flow办公流程——系列五

    自己的认识:一定要用独立的前端,即vue.js前端项目必须是独立的,独立的服务,不要放beego里的view里作为tpl页面。虽然,放beego view里的t...

    hotqin888
  • 快速入门Vue

    刚进公司做的第一个项目,刚好前端人手不足,需要我们后端同时兼顾前后端的工作,采用的iview UI框架,基于vue.js。

    KEN DO EVERTHING
  • 聊聊flink的Execution Plan Visualization

    本文主要研究一下flink的Execution Plan Visualization

    codecraft
  • 分布式阿波罗Apollo配置中心

    为什么要使用apollo,在我们开发分布式微服务项目的时候,那些配置一旦变更,就需要重启服务,这样非常不友好。因此我们考虑动态更改配置文件当中的配置,所以把那些...

    编程软文
  • 2019开发者调查趋势与方向报告出炉

    近日国外开发者平台 HankerRank 发布了 2019 年开发者技能调查报告,该报告根据对71,281位开发者的调查得出。作者从中选取了一部分,给大家解读一...

    Rookie
  • 基于django的视频点播网站开发-step9-后台视频管理功能

    从本讲开始,我们开始视频管理功能的开发,视频管理包括视频上传、视频列表、视频编辑、视频删除。另外还有视频分类的功能,会一同讲解。这一讲非常重要,因为你将学习到一...

    山东程序员
  • js通过input框输入属性和值,改变div的属性

    js实现在input框里面输入属性和值,页面的 div的属性根据输入的属性和值进行变化。

    祈澈菇凉
  • vue-cli3项目创建-配置-发布

    (2) 修改user module -- src/store/module/user.js

    RtyXmd
  • mpvue网络接口请求封装

    在mpvue中我们同样使用小程序的原生API wx.request进行请求,具体方法如下:

    honey缘木鱼

扫码关注云+社区

领取腾讯云代金券