快递http 2服务器推送

时间:2017-04-11 13:59:52

标签: node.js http express google-chrome-devtools http2

我已经制作了一个小型服务器来尝试节点上的http2,但我无法判断推送机制是否正常工作。我的样式是通过http2加载的,但这并不意味着推送按预期工作......

const port = 3000
const spdy = require('spdy')
const express = require('express')
const path = require('path')
const fs = require('fs')
const app = express()

app.get('*', (req, res) => {
    res.set('Link', '</css/styles.css>; rel=preload; as=style');
  res.sendFile(__dirname + '/index.html')
})

const options = {
    key: fs.readFileSync(__dirname + '/keys/server.key'),
    cert:  fs.readFileSync(__dirname + '/keys/server.crt')
}

spdy.createServer(options, app).listen(3000);

在devtools中,发起人说:“其他”。

2 个答案:

答案 0 :(得分:3)

您需要明确告诉您的快速服务器要推送哪些资源。看看这里有一个体面的运行:

https://webapplog.com/http2-server-push-node-express/

该页面的示例路线:

app.get('/pushy', (req, res) => {
  var stream = res.push('/main.js', {
    status: 200, // optional
    method: 'GET', // optional
    request: {
      accept: '*/*'
    },
    response: {
      'content-type': 'application/javascript'
    }
  })
  stream.on('error', function() {
  })
  stream.end('alert("hello from push stream!");')
  res.end('<script src="/main.js"></script>')
})

调用res.push()是您要提供服务的文件的关键。

他还记录了编写一些中间件以处理资产推送的方法:

https://webapplog.com/http2-server-push-express-middleware/

实施此功能后,您可以在Ba devDP的答案中看到Chrome devtools中的推送项目。

答案 1 :(得分:1)

如果从服务器推送资源,Chrome将在开发者工具 - >网络的“发起人”列中显示“推送/其他”:

enter image description here

我不在Node中使用SDPY模块,但看起来像herehere该模块不像其他服务器(例如Apache)那样使用链接头来推送资源。因此,除非您在HTTP / 2模式下面有Apache,否则我怀疑您的代码会推送资源。