最近2018中文字幕在日韩欧美国产成人片_国产日韩精品一区二区在线_在线观看成年美女黄网色视频_国产精品一区三区五区_国产精彩刺激乱对白_看黄色黄大色黄片免费_人人超碰自拍cao_国产高清av在线_亚洲精品电影av_日韩美女尤物视频网站

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
通過(guò)Node.js,Express.js實(shí)現(xiàn)HTTP/2ServerPush

什么是 HTTP/2 Server Push

成都創(chuàng)新互聯(lián)公司專注于惠東網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠(chéng)為您提供惠東營(yíng)銷型網(wǎng)站建設(shè),惠東網(wǎng)站制作、惠東網(wǎng)頁(yè)設(shè)計(jì)、惠東網(wǎng)站官網(wǎng)定制、微信平臺(tái)小程序開發(fā)服務(wù),打造惠東網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供惠東網(wǎng)站排名全網(wǎng)營(yíng)銷落地服務(wù)。

HTTP/2 是 Web 開發(fā)的新標(biāo)準(zhǔn),擁有很多不錯(cuò)的優(yōu)點(diǎn)能夠讓 Web 訪問(wèn)更快且開發(fā)的工作更輕松簡(jiǎn)單。比如,引入多路復(fù)用傳輸不用合并資源,服務(wù)器推送(Server Push)資源讓瀏覽器預(yù)加載。

該文不會(huì)講述 HTTP/2 的所有優(yōu)勢(shì)。你可以通過(guò)上篇文章了解更多{% post_link http2-node-express %}。該文主要關(guān)注于在 Node.js環(huán)境使用 Express.js 和 HTTP/2 庫(kù) spdy。

服務(wù)器推送(Server Push)工作方式是通過(guò)在一個(gè) HTTP/2 請(qǐng)求中捆綁多個(gè)資源。在底層,服務(wù)器會(huì)發(fā)送一個(gè) PUSH_PROMISE,客戶端(包括瀏覽器)就可以利用它且不基于 HTML 文件是否需要該資源。如果瀏覽器檢測(cè)到需要該資源,就會(huì)匹配到收到的服務(wù)器推送的 PROMISE 然后讓該資源表現(xiàn)的就像正常的瀏覽器 Get 請(qǐng)求資源。顯而易見,如果匹配到有推送,瀏覽器就不需要重新請(qǐng)求,然后直接使用客戶端緩存。這推薦幾篇文章關(guān)于服務(wù)器推送(Server Push)的好處:

  • What’s the benefit of Server Push?
  • Announcing Support for HTTP/2 Server Push
  • Innovating with HTTP 2.0 Server Push

這是個(gè)關(guān)于在 Node.js 實(shí)現(xiàn)服務(wù)器推送(Server Push)實(shí)踐教程。為了更清晰精簡(jiǎn),我們只實(shí)現(xiàn)一個(gè)路由地址 /pushy 的 Node.js和 Express.js 服務(wù)器,它會(huì)推送一個(gè) JS 文件,正如之前所說(shuō),我們會(huì)用到一個(gè) HTTP/2 庫(kù) spdy。

HTTP/2 和 Node.js

先解釋一下,為啥在 Node.js 環(huán)境選擇 HTTP/2 庫(kù) spdy。當(dāng)前來(lái)說(shuō),為 Node.js 主要有兩個(gè)庫(kù)實(shí)現(xiàn)了 HTTP/2 :

  • spdy
  • http2

兩個(gè)庫(kù)都跟 Node.js 核心模塊的 http 和 https 模塊 api 很相似。這就意味著如果你不使用 Express ,這兩個(gè)庫(kù)就沒(méi)什么區(qū)別。然而, spdy 庫(kù)支持 HTTP/2 和 Express,而 http2 庫(kù)當(dāng)前不支持 Express。這就是為什么我們選擇使用 spdy , Express 是Node.js 適合搭配的實(shí)踐標(biāo)準(zhǔn)的服務(wù)框架。之所以叫 spdy是來(lái)自于 Google 的 SPDY 協(xié)議后來(lái)升級(jí)成 HTTP/2。

HTTPS密鑰和證書

要在瀏覽器(Firefox, Safari, Chrome, 或者 Edge)中訪問(wèn)使用 HTTPS ,你需要生成密鑰和證書。去搜索 “ssl 密鑰生成” 或者按照以下步驟去生成密鑰、證書。在該文提供的源碼中沒(méi)有上傳生成的密鑰和證書

 
 
 
 
  1. $ mkdir http2-node-server-push 
  2. $ cd http2-node-server-push
  3. $ openssl genrsa -des3 -passout pass:x -out server.pass.key 2048
  4. ...
  5. $ openssl rsa -passin pass:x -in server.pass.key -out server.key
  6. writing RSA key
  7. $ rm server.pass.key
  8. $ openssl req -new -key server.key -out server.csr
  9. ...
  10. Country Name (2 letter code) [AU]:US
  11. State or Province Name (full name) [Some-State]:California
  12. ...
  13. A challenge password []:
  14. ...
  15. $ openssl x509 -req -sha256 -days 365 -in server.csr -signkey server.key -out server.crt

按照以上步驟,你就會(huì)產(chǎn)生三個(gè) SSL 文件:

  • server.crt
  • server.csr
  • server.key

你就可以在 Node.js 的 server 腳本中讀取 server.key 和 server.crt。

搭建項(xiàng)目

首先,通過(guò) package.json 初始化項(xiàng)目和下載項(xiàng)目依賴:

 
 
 
 
  1. npm init -y
  2. npm i [email protected] [email protected] [email protected] --save
  3. npm i [email protected] --save-dev

當(dāng)前的目錄結(jié)構(gòu)如下

 
 
 
 
  1. /http2-node-server-push
  2. /node_modules
  3. index.js
  4. package.json
  5. server.crt
  6. server.csr
  7. server.key

然后,在 package.json 的 scripts 中添加兩個(gè)腳本行,去簡(jiǎn)化命令(node-dev、自動(dòng)重載):

 
 
 
 
  1. "start": "./node_modules/.bin/node-dev .",
  2. "start-advanced": "./node_modules/.bin/node-dev index-advanced.js"

現(xiàn)在就可以開始使用 Node.js 、 Express.js 、 spdy 編寫這個(gè)簡(jiǎn)單實(shí)現(xiàn)的帶服務(wù)器推送 HTTP/2 服務(wù)器

編寫腳本

首先,創(chuàng)建 index.js 腳本,并引入以及實(shí)例化依賴,看看查看上面的項(xiàng)目目錄結(jié)構(gòu)。其中,我使用了 ES6/ES2015 的語(yǔ)法 const來(lái)聲明依賴,如果你不熟悉該聲明語(yǔ)法,你可以進(jìn)一步閱讀Top 10 ES6 Features Every Busy JavaScript Developer Must Know。

 
 
 
 
  1. const http2 = require('spdy')
  2. const logger = require('morgan')
  3. const express = require('express')
  4. const app = express()
  5. const fs = require('fs')

然后,設(shè)置 morgan logger 來(lái)監(jiān)聽服務(wù)器服務(wù)了哪些請(qǐng)求。

 
 
 
 
  1. app.use(logger('dev'))

設(shè)置主頁(yè),該頁(yè)面顯示了 /pushy 是我們服務(wù)器推送的頁(yè)面。

 
 
 
 
  1. app.get('/', function (req, res) {
  2.   res.send(`hello, http2! go to /pushy`)
  3. })

服務(wù)器推送只需簡(jiǎn)單的調(diào)用 spdy 實(shí)現(xiàn)的 res.push ,我們將文件路徑名傳輸進(jìn)去作為第一個(gè)參數(shù),瀏覽器會(huì)使用這個(gè)路徑名來(lái)匹配push promise 資源。res.push() 的第一個(gè)參數(shù) /main.js 一定得跟 HTML 文件中需要的文件名相匹配。

而第二個(gè)參數(shù)是一個(gè)可選的對(duì)象,設(shè)置了該資源的一些資源信息描述。

 
 
 
 
  1. app.get('/pushy', (req, res) => {
  2.   var stream = res.push('/main.js', {
  3.     status: 200, // optional
  4.     method: 'GET', // optional
  5.     request: {
  6.       accept: '*/*'
  7.     },
  8.     response: {
  9.       'content-type': 'application/javascript'
  10.     }
  11.   })
  12.   stream.on('error', function() {
  13.   })
  14.   stream.end('alert("hello from push stream!");')
  15.   res.end('')
  16. })

你可以看到,stream 對(duì)象有兩個(gè)方法 on 和 end。前者監(jiān)聽了 error 和 finish 事件,而后者則監(jiān)聽完成傳輸 end,然后就會(huì)main.js 就會(huì)觸發(fā)彈窗。

或者,如果你擁有多個(gè)數(shù)據(jù)塊,你可以選擇使用 res.write() 然后最后使用 res.end(),其中 res.end() 會(huì)自動(dòng)關(guān)閉結(jié)束response 而 res.write() 則讓它保持開啟。(該文的源碼中未實(shí)現(xiàn)這種情況)

最后,讀取 HTTPS 密鑰和證書并使用 spdy 啟動(dòng)運(yùn)轉(zhuǎn)服務(wù)器。

 
 
 
 
  1. var options = {
  2.   key: fs.readFileSync('./server.key'),
  3.   cert: fs.readFileSync('./server.crt')
  4. }
  5. http2
  6.   .createServer(options, app)
  7.   .listen(8080, ()=>{
  8.     console.log(`Server is listening on https://localhost:8080.
  9.     You can open the URL in the browser.`)
  10.   }
  11. )

該實(shí)現(xiàn)的關(guān)鍵就在于,圍繞著 streams(流)。不是樹林中的河流,而是指開發(fā)者使用的從源頭到客戶端的建立起的數(shù)據(jù)通道流。如果你幾乎不懂流以及 Node.js 和 Express.js 的 HTTP 的請(qǐng)求和返回信息

啟動(dòng)和對(duì)比 HTTP/2 Server Push

使用命令 node index.js 或者 npm stat 運(yùn)行服務(wù)端腳本,然后訪問(wèn) https://localhost:3000/pushy,就可以看到彈窗!而且我們?cè)谠撀酚刹淮嬖谖募?,你可以查看服?wù)器終端的 logs ,只會(huì)有一個(gè)請(qǐng)求,而不是沒(méi)使用服務(wù)器推送的時(shí)候的兩個(gè)請(qǐng)求(一個(gè) HTML、一個(gè) JS)。

可以在瀏覽器中檢測(cè)收到服務(wù)器端推送的行為。Chrome 啟動(dòng)開發(fā)者工具,打開 Network 標(biāo)簽,你可以看到 main.js 不存在綠色時(shí)間條,就是說(shuō)明沒(méi)有等待時(shí)間 TTFB (Time to First Byte)詳細(xì)

再仔細(xì)看,可以看到請(qǐng)求是由 Push 開始發(fā)起的(Initiator列查看),沒(méi)有使用服務(wù)器推送的 HTTP/2 服務(wù)器或者 HTTP/1,這一列就會(huì)顯示文件名稱,如 index.html 發(fā)起的顯示就是 index.html。

實(shí)踐就結(jié)束了,使用了 Express 和 Spdy 簡(jiǎn)單就實(shí)現(xiàn)了推送 JS 資源,而該資源可以用于后面 HTML 中