【问题标题】:Express http 2 server pushExpress http 2 服务器推送
【发布时间】:2017-09-06 23:19:33
【问题描述】:

我已经制作了一个小型服务器来在节点上尝试 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);

在开发工具中,发起者说:“其他”。

【问题讨论】:

  • 尝试在chrome中使用this,蓝色表示spdy,红色表示http1.1,绿色表示quic
  • @alpheus http2 工作正常,我可以在 devtool 网络协议栏中看到。但是没有提到推送。您的扩展程序中也没有提及它(顺便说一句,它对我来说是蓝色的)。

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


【解决方案1】:

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

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/

实现此功能后,您可以在 Chrome 开发工具中看到推送的项目,如 BazzaDP 的回答。

【讨论】:

    【解决方案2】:

    如果资产是从服务器推送的,Chrome 会在 Developer Tools->Network 的 Initiator 栏中显示“Push / Other”:

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

    【讨论】:

      猜你喜欢
      • 2017-04-06
      • 2019-05-24
      • 1970-01-01
      • 2018-07-26
      • 2017-03-04
      • 2019-10-10
      • 2020-04-23
      • 2011-08-17
      • 2020-03-24
      相关资源
      最近更新 更多