使用 HTTP/2 加速 Node.js 應用

roc_guo發表於2023-05-08

當在一個示例的 Express 應用中使用這個中介軟體時,我們可以看到應用程式的輸出多瞭如下 HTTP 頭:
使用 HTTP/2 加速 Node.js 應用使用 HTTP/2 加速 Node.js 應用
本文是使用 Ghost(一個部落格釋出平臺)進行釋出的,因此如果你的瀏覽器支援 HTTP/2,你已經在不知不覺中享受了服務端推送技術帶來的好處了。接下來,我們將進行更詳細的說明。netjet 使用了帶有定製外掛的 PostHTML 來解析 HTML。目前,netjet 用它來查詢圖片、 和外部 CSS 樣式表。你也可以用其它的技術來實現這個。在響應過程中增加 HTML 解析器有個明顯的缺點:這將增加頁面載入的延時(到載入第一個位元組所花的時間)。大多數情況下,所新增的延時被應用裡的其他耗時掩蓋掉了,比如資料庫訪問。為了解決這個問題,netjet 包含了一個可調節的 LRU 快取,該快取以 HTTP 的 ETag 頭部作為索引,這使得 netjet 可以非常快的為已經解析過的頁面插入 Link 頭部。
不過,如果我們現在從頭設計一款全新的應用,我們就應該考慮把頁面內容和頁面中的後設資料分開存放,從而整體地減少 HTML 解析和其它可能增加的延時了。
任意的 Node.js HTML 框架,只要它支援類似 Express 這樣的中介軟體,netjet 都是能夠相容的。只要把 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 也可以擺脫 HTML 框架,獨立工作:

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 );
});

netjet 文件裡有更多選項的資訊。

檢視推送了什麼資料

使用 HTTP/2 加速 Node.js 應用使用 HTTP/2 加速 Node.js 應用
訪問 本文時,透過 Chrome 的開發者工具,我們可以輕鬆的驗證網站是否正在使用伺服器推送技術(LCTT 譯註: Chrome 版本至少為 53)。在“Network”選項卡中,我們可以看到有些資源的“Initiator”這一列中包含了 Push字樣,這些資源就是伺服器端推送的。
不過,目前 Firefox 的開發者工具還不能直觀的展示被推送的資源。不過我們可以透過頁面響應頭部裡的 cf-h2-pushed頭部看到一個列表,這個列表包含了本頁面主動推送給瀏覽器的資源。
希望大家能夠踴躍為 netjet 添磚加瓦,我也樂於看到有人正在使用 netjet。

Ghost 和服務端推送技術

Ghost 真是包羅永珍。在 Ghost 團隊的幫助下,我把 netjet 也整合到裡面了,而且作為測試版內容可以在 Ghost 的 0.8.0 版本中用上它。

如果你正在使用 Ghost,你可以透過修改 config.js、並在 production配置塊中增加  preloadHeaders 選項來啟用服務端推送。

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

Ghost 已經為其使用者整理了一篇支援文件。

總結

使用 netjet,你的 Node.js 應用也可以使用瀏覽器預載入技術。並且 CloudFlare 已經使用它在提供了 HTTP/2 服務端推送了。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69901823/viewspace-2950797/,如需轉載,請註明出處,否則將追究法律責任。

相關文章