天天看点

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

在响应过程中增加 html 解析器有个明显的缺点:这将增加页面加载的延时(到加载第一个字节所花的时间)。大多数情况下,所新增的延时被应用里的其他耗时掩盖掉了,比如数据库访问。为了解决这个问题,netjet 包含了一个可调节的 lru 缓存,该缓存以 http 的 etag 头部作为索引,这使得 netjet 可以非常快的为已经解析过的页面插入 link 头部。

不过,如果我们现在从头设计一款全新的应用,我们就应该考虑把页面内容和页面中的元数据分开存放,从而整体地减少 html 解析和其它可能增加的延时了。

任意的 node.js html 框架,只要它支持类似 express 这样的中间件,netjet 都是能够兼容的。只要把 netjet 像下面这样加到中间件加载链里就可以了。

<code>var express = require('express');</code>

<code>var netjet = require('netjet');</code>

<code>var root = '/path/to/static/folder';</code>

<code></code>

<code>express()</code>

<code>.use(netjet({</code>

<code>cache: {</code>

<code>max: 100</code>

<code>}</code>

<code>}))</code>

<code>.use(express.static(root))</code>

<code>.listen(1337);</code>

稍微加点代码,netjet 也可以摆脱 html 框架,独立工作:

<code>var http = require('http');</code>

<code>var port = 1337;</code>

<code>var hostname = 'localhost';</code>

<code>var preload = netjet({</code>

<code>});</code>

<code>var server = http.createserver(function (req, res) {</code>

<code>preload(req, res, function () {</code>

<code>res.statuscode = 200;</code>

<code>res.setheader('content-type', 'text/html');</code>

<code>res.end('&lt;!doctype html&gt;&lt;h1&gt;hello world&lt;/h1&gt;');</code>

<code>server.listen(port, hostname, function () {</code>

<code>console.log('server running at http://' + hostname + ':' + port+ '/');</code>

<a target="_blank"></a>

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

不过,目前 firefox 的开发者工具还不能直观的展示被推送的资源。不过我们可以通过页面响应头部里的<code>cf-h2-pushed</code>头部看到一个列表,这个列表包含了本页面主动推送给浏览器的资源。

希望大家能够踊跃为 netjet 添砖加瓦,我也乐于看到有人正在使用 netjet。

ghost 真是包罗万象。在 ghost 团队的帮助下,我把 netjet 也集成到里面了,而且作为测试版内容可以在 ghost 的 0.8.0 版本中用上它。

如果你正在使用 ghost,你可以通过修改 config.js、并在<code>production</code>配置块中增加 <code>preloadheaders</code> 选项来启用服务端推送。

<code>production: {</code>

<code>url: 'https://my-ghost-blog.com',</code>

<code>preloadheaders: 100,</code>

<code>// ...</code>

原文发布时间为:2016-09-14

本文来自云栖社区合作伙伴“linux中国”