Express http 2 服务器推送

Posted

技术标签:

【中文标题】Express http 2 服务器推送【英文标题】:Express http 2 server push 【发布时间】: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 网络协议栏中看到。但是没有提到推送。您的扩展程序中也没有提及它(顺便说一句,它对我来说是蓝色的)。 【参考方案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 模块,但看起来像来自 here 和 here 这个模块不像其他服务器(例如 Apache)那样使用 Link 标头来推送资源。因此,除非您在 HTTP/2 模式下使用 Apache,否则我怀疑您的代码会推送资源。

【讨论】:

以上是关于Express http 2 服务器推送的主要内容,如果未能解决你的问题,请参考以下文章

使用 Express.js 进行 OAuth 和推送

使用 NodeJs Express 在 JavaScript 上推送通知

HTTP/2 服务器推送但它在 Apache2.4 上重新加载了推送的文件

HTTP/2 协议-服务端主动推送消息

HTTP/2 推送 AWS API Gateway + Lambda

HTTP/2 服务器两次推送资产下载