当前位置: 首页 > 科技观察

使用HTTP-2服务器端推送技术加速Node.js应用

时间:2023-03-19 23:26:53 科技观察

4月,我们宣布支持HTTP/2服务器端推送技术,我们通过HTTPLink标头实现了这种支持。我的同事John曾经通过一个例子展示了在PHP中支持服务器端推送功能是多么容易。我们希望能够更轻松地实现当今使用Node.js构建的网站的性能改进。为此,我们开发了netjet中间件,它可以解析应用生成的HTML,并自动添加Link头。在示例Express应用程序中使用此中间件时,我们可以看到应用程序的输出具有以下HTTP标头:ThisblogispublishedusingGhost(LCTT译注:博客发布平台),因此如果您的浏览器支持HTTP/2,并且您已经在不知不觉中享受到服务器端推送技术的好处。接下来,我们将进行更详细的解释。netjet使用带有自定义插件的PostHTML来解析HTML。目前,netjet使用它来查找图像、脚本和外部CSS样式表。您还可以使用其他技术来实现此目的。将HTML解析器添加到响应过程有一个明显的缺点:它会增加页面加载延迟(加载第一个字节所需的时间)。在大多数情况下,增加的延迟会被应用程序的其他耗时方面所掩盖,例如数据库访问。为了解决这个问题,netjet包含了一个可调整的LRU缓存,它由HTTPETag标头索引,这使得netjet可以非常快速地为解析的页面插入Link标头。但是,如果我们现在从头开始设计一个全新的应用程序,我们应该考虑将页面内容和页面中的元数据分开存储,从而从整体上减少HTML解析和其他可能的延迟。任何支持Express等中间件的Node.jsHTML框架都与netjet兼容。只需将netjet添加到中间件加载链,如下所示。varexpress=require('express');varnetjet=require('netjet');varroot='/path/to/static/folder';express().use(netjet({cache:{max:100}})).use(express.static(root)).listen(1337);代码多一点,netjet也可以摆脱HTML框架,独立工作:varhttp=require('http');varnetjet=require('netjet');varport=1337;varhostname='localhost';varpreload=netjet({cache:{max:100}});varserver=http.createServer(function(req,res){preload(req,res,function(){res.statusCode=200;res.setHeader('Content-Type','text/html');res.end('

HelloWorld

');});});server.listen(port,hostname,function(){console.log('Serverrunningathttp://'+hostname+':'+port+'/');});netjet文档中有更多选项。查看推送了哪些数据访问本文时,通过Chrome的开发者工具,我们可以轻松验证一个网站是否使用了服务器推送技术(LCTT译注:Chrome版本至少为53)。在“Network”选项卡中,我们可以看到一些资源的“Initiator”栏中有Push字样,这些资源是由服务器推送的。但是目前Firefox的开发者工具无法直观显示推送的资源。但是我们可以通过页面响应头中的cf-h2-pushed头看到一个列表,里面包含了这个页面主动推送给浏览器的资源。我希望每个人都能为netjet做出贡献,我很乐意看到人们使用netjet。Ghost与服务端推送技术Ghost真是包罗万象。在Ghost团队的帮助下,我也集成了netjet,它在Ghost版本0.8.0中作为测试内容提供。如果您使用的是Ghost,您可以通过修改config.js并在生产配置块中添加preloadHeaders选项来启用服务器端推送。production:{url:'https://my-ghost-blog.com',preloadHeaders:100,//...}Ghost为其用户整理了一份支持文档。总结使用netjet,您的Node.js应用程序还可以使用浏览器预加载技术。CloudFlare已经使用它来提供HTTP/2服务器推送。