閱讀522 返回首頁    go 阿裏雲 go 技術社區[雲棲]


使用 HTTP/2 服務端推送技術加速 Node.js 應用

netjet 使用了帶有定製插件的 PostHTML 來解析 HTML。目前,netjet 用它來查找圖片、腳本和外部 CSS 樣式表。你也可以用其它的技術來實現這個。

在響應過程中增加 HTML 解析器有個明顯的缺點:這將增加頁麵加載的延時(到加載第一個字節所花的時間)。大多數情況下,所新增的延時被應用裏的其他耗時掩蓋掉了,比如數據庫訪問。為了解決這個問題,netjet 包含了一個可調節的 LRU 緩存,該緩存以 HTTP 的 ETag 頭部作為索引,這使得 netjet 可以非常快的為已經解析過的頁麵插入 Link 頭部。

不過,如果我們現在從頭設計一款全新的應用,我們就應該考慮把頁麵內容和頁麵中的元數據分開存放,從而整體地減少 HTML 解析和其它可能增加的延時了。

任意的 Node.js HTML 框架,隻要它支持類似 Express 這樣的中間件,netjet 都是能夠兼容的。隻要把 netjet 像下麵這樣加到中間件加載鏈裏就可以了。


  1. var express = require('express');
  2. var netjet = require('netjet');
  3. var root = '/path/to/static/folder';
  4. express()
  5. .use(netjet({
  6. cache: {
  7. max: 100
  8. }
  9. }))
  10. .use(express.static(root))
  11. .listen(1337);

稍微加點代碼,netjet 也可以擺脫 HTML 框架,獨立工作:


  1. var http = require('http');
  2. var netjet = require('netjet');
  3. var port = 1337;
  4. var hostname = 'localhost';
  5. var preload = netjet({
  6. cache: {
  7. max: 100
  8. }
  9. });
  10. var server = http.createServer(function (req, res) {
  11. preload(req, res, function () {
  12. res.statusCode = 200;
  13. res.setHeader('Content-Type', 'text/html');
  14. res.end('<!doctype html><h1>Hello World</h1>');
  15. });
  16. });
  17. server.listen(port, hostname, function () {
  18. console.log('Server running at https://' + hostname + ':' + port+ '/');
  19. });

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、並在production配置塊中增加 preloadHeaders 選項來啟用服務端推送。


  1. production: {
  2. url: 'https://my-ghost-blog.com',
  3. preloadHeaders: 100,
  4. // ...
  5. }

Ghost 已經為其用戶整理了一篇支持文檔

總結

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

原文發布時間為:2016-09-14

本文來自雲棲社區合作夥伴“Linux中國”

最後更新:2017-06-07 17:03:16

  上一篇:go  PHP學習路線圖
  下一篇:go  使用 Python 和 Asyncio 編寫在線多用人遊戲(二)