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的知识,能够去知乎搜相关文章和回答。