译者注:朋友们,是时候拥抱新一代的HTTP协议了!译者:Fundebug原文:HTTP/2ServerPushwithNode.jsNode.js8.4.0已经开始支持HTTP/2。执行node命令时,加上--expose-http2选项即可使用。在这篇博客中,我们将介绍如何使用HTTP/2进行服务器推送(serverpush)。此外,我们还编写了一个简单的Node.js示例。关于HTTP/2HTTP/2是新一代HTTP协议,支持多路复用(MultiPlexing)、头部压缩、服务器推送(serverpush)等特性,有效降低延迟。如果您对HTTP/2感兴趣,可以查看HTTP/2简介。HTTP/1VSHTTP/2HTTP/2服务器推送允许服务器在浏览器请求资源之前推送资源,从而减少页面加载时间。这里,我们不妨对比一下HTTP/1和HTTP/2。HTTP/1客户端向服务器发送请求,服务器返回请求的资源,通常是HTML文件,HTML文件中包含一些资源链接(如.js、.css等)。浏览器解析HTML文件,获取资源链接,然后分别请求这些资源。下图显示了这个过程。注意:时间轴上有3个独立的请求,bundle1.js和bundle2.js请求的发起者是(index)Parser。这就是HTTP/1的工作方式,我们多年来一直这样做,为什么要改变呢?问题是用户需要等待浏览器解析HTML文件,获取链接,然后再请求资源。这会减慢前端渲染速度并增加页面加载时间。在HTML中嵌入一些资源是一种变通方法,但这会使第一个请求变大且变慢。HTTP/2下图显示了在服务器上启用HTTP/2时网站如何加载。从timeline和initiator可以看出,多路复用减少了请求次数,bundle1.js和bundle2.js在第一个请求时被推送到前端。Node.js示例使用内置的http2模块,我们可以创建一个http2服务器。有意思的是,当请求index.html时,我们主动推送其他资源:bundle1.js和bundle2.js。这样,bundle1.js和bundle2.js可以在浏览器请求它们之前被推送。consthttp2=require('http2')constserver=http2.createSecureServer({cert,key},onRequest)functionpush(stream,filePath){const{file,headers}=getFile(filePath)constpushHeaders={[HTTP2_HEADER_PATH]复制代码:filePath}stream.pushStream(pushHeaders,(pushStream)=>{pushStream.respondWithFD(file,headers)})}functiononRequest(req,res){//使用index.html推送文件if(reqPath==='/index.html'){push(res.stream,'bundle1.js')push(res.stream,'bundle2.js')}//服务文件res.stream.respondWithFD(file.fileDescriptor,file.headers)}一个完整的示例可以在GitHub存储库中找到:RisingStack/http2-push-exampleHTTP/2&Node.js启用HTTP/2功能的Node.js可以帮助我们优化客户端和服务器之间的交互性能。使用服务器推送,我们可以在浏览器请求资源之前将资源推送到浏览器,这样可以减少页面加载时间,提高用户体验。
