http2出來也有段時間了,不少網站都已經實際應用了它,而我還活在http1.1的時代,趁着還年輕,記性還行,花點時間研究了http2在nodejs中的使用。html
案例1:淘寶前端
案例2:京東node
案例3:知乎git
案例4:二月的公司
很差意思,咱們還沒用上這麼牛逼的協議。程序員
我參考了一個外國程序員和一箇中國程序員的http2方案,而後對源碼進行了調整,主要目的在於體驗一把http2,沒有很深的知識。若是你想深刻了解node中http2的使用,請看這裏:nodejs之http2大全github
mac: 10.12.6
node: v8.9.4
├── index.js // 入口文件 ├── package-lock.json ├── package.json //配置 ├── public // 前端資源文件 │ ├── bundle1.js │ ├── bundle2.js │ ├── index.html │ └── network.png ├── src //服務端文件 │ ├── helper.js │ └── server.js └── ssl //證書 ├── cert.pem └── key.pem
一、你必需要安裝http2npm
npm i --save http2
二、生成ssl證書json
我比較懶,就沒有本身生成,用別人生成好的證書來測試。api
三、項目中最核心的就是server文件瀏覽器
能夠看到代碼中用到了fs讀取文件,helper也是獲取文件的插件。和使用http1.1不一樣的是,這裏導入的是http2,而後用http2.createSecureServer()建立一個服務器。注意它的語法: http2.createSecureServer(options, callback),options表示你的證書或者其餘有關的配置選項,可是證書是必備的。
'use strict' const fs = require('fs') const path = require('path') const http2 = require('http2') const helper = require('./helper') const PORT = process.env.PORT || 8080 const PUBLIC_PATH = path.join(__dirname, '../public') const publicFiles = helper.getFiles(PUBLIC_PATH) //建立HTTP2服務器 const server = http2.createSecureServer({ cert: fs.readFileSync(path.join(__dirname, '../ssl/cert.pem')), key: fs.readFileSync(path.join(__dirname, '../ssl/key.pem')) }, onRequest) // Request 事件 function onRequest (req, res) { // 路徑指向 index.html const reqPath = req.url === '/' ? '/index.html' : req.url //獲取html資源 const file = publicFiles.get(reqPath) // 文件不存在 if (!file) { res.statusCode = 404 res.end() return } res.stream.respondWithFD(file.fileDescriptor, file.headers) } server.listen(PORT)
四、寫好服務端代碼,剩下的事情就是啓動項目,而後交給瀏覽器渲染html和加載資源。
五、關鍵點2 html文件
確保你的瀏覽器支持fetch,由於我沒有用第三方支持庫,for循環的做用是客戶端向服務器發起100個請求,讓咱們更加直觀的看到http2請求多個資源的狀況。
<html> <head> <meta charset="UTF-8"> </head> <body> <h1>體驗一把HTTP2</h1> </body> <script src="bundle1.js"></script> <script src="bundle2.js"></script> <script> for(var i=0;i<100;i++) { fetch('//localhost:8080/network.png'); } </script> </html>
六、渲染結果
從測試結果來看,能夠回顧一下http2的知識,很是明顯的一點是:同個域名只須要佔用一個 TCP 鏈接,頭部壓縮須要抓包才能分析出來,還有服務端推送等功能,在這裏沒有作測試,若是你也想體驗一把http2,下載源碼安裝好插件就能用了,同時也得注意你的開發環境是否支持。
本文內容很淺,想要了解更多http2的知識,能夠去知乎搜相關文章和回答。