天天看點

使用 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中國”