yanni4night

使用 HTTP2 服务端推送加速 Node.js 应用

yanni4night · 2016-08-22翻译 · 1022阅读 原文链接

四月份的时候,我们(指 https://www.cloudflare.com/ 网站 —— 译者注)宣布了已经通过 HTTP 的 Link 头部支持了 HTTP2 的服务端推送。我们的同事 John 也演示了向 PHP 应用添加 HTTP2 服务端推送是件多么容易的事。

遵循 知识共享 2.0 协议Nicky Fernandes

我们的目的是让优化 Node.js 网站变得更容易。我们开发了 netjet 中间件来解析 HTML 并自动插入 Link 头。在这个 Express 的例子中,可以看见增加的头部:

我们使用 Ghost 来增强本博客的性能,如果你的浏览器支持 HTTP2,你已经在不知不觉中受益于服务端推送了(请见博客原文——译者注)。下面还有更多。

在 netjet 中,我们使用 PostHTML 项目与一个普通插件一起解析 HTML。现在它查找的是图片、脚本和外链样式表。你也可以在其它环境中实现同样的技术。

在 HTTP 的响应中解析 HTML 有一个缺点:增加加载延迟(或者“首字节到达时间”)。大多数情况下,增加的延迟会被其它环节掩盖,如数据库访问。然而,netjet 包含了一个可伸缩的由 ETag 头实现的 LRU 缓存,允许对于了已经解析过页面快速插入 Link 头。

如果你在设计一个很有野心的应用,你应该在内容中嵌入资源上考虑存储源信息,移除 HTML 的解析过程,以及可能的延迟增加。

Netjet 与任何支持像 Express 中间件一样的 Node.js 框架兼容。入门就如把 netjet 加入中间件链一样简单。

var express = require('express');  
var netjet = require('netjet');  
var root = '/path/to/static/folder';

express()  
  .use(netjet({
    cache: {
      max: 100
    }
  }))
  .use(express.static(root))
  .listen(1337);

在没有任何框架的情况下使用 netjet,只需要一点点额外的工作。

var http = require('http');
var netjet = require('netjet');

var port = 1337;
var hostname = 'localhost';
var preload = netjet({
  cache: {
    max: 100
  }
});

var server = http.createServer(function (req, res) {
  preload(req, res, function () {
      res.statusCode = 200;
      res.setHeader('Content-Type', 'text/html');
      res.end('<!doctype html><h1>Hello World</h1>');
  });
});

server.listen(port, hostname, function () {
  console.log('Server running at http://' + hostname + ':' + port+ '/');
});

关于被支持的选项,请查阅 netjet 文档

查看推送的资源

Chrome 的开发者工具使得鉴别网站是否使用服务端推送变得很简单。网络选项卡在 initiator 列的开头以 “push” 来标记被推送的资源。

不幸的是,Firefox 的开发者工具没有直接指明资源是否是被推送的。但是你可以查看页面响应头的 cf-h2-pushed 值,它包含了 CloudFlare 推送给浏览器的资源列表。

欢迎为 netjet 及其文档贡献力量。我很愿意听说有人在用 netjet。

Ghost 和服务端推送

Ghost(指 https://ghost.org/ —— 译者注) 是一个令人兴奋的整合平台。在 Ghost 团队的帮助下,我已经把 netjet 整合了进去,在 0.8.0 版本后已经可以作为一个可选的配置。

如果你在运行一个 Ghost 实例,你可以通过修改 config.js 文件、在 production 配置块中增加 preloadHeaders 选项的方式开启服务端推送。

production: {  
  url: 'https://my-ghost-blog.com', 
  preloadHeaders: 100, 
  // ... 
}

Ghost 为用户提供了一个帮助文档

总结

使用 netjet 后,你的 Node.js 应用可以开发使用浏览器预加载,在 CloudFlare 中,HTTP2 的服务端推送可以被开启。

在 CloudFlare,我们很高兴能开发能提高网站性能的工具。如果你感兴趣,我们正在德州的奥斯丁、伊利诺斯州的尚佩恩、伦敦、旧金山和新加坡招聘

相关文章