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 服务器推送的主要内容,如果未能解决你的问题,请参考以下文章
使用 NodeJs Express 在 JavaScript 上推送通知
HTTP/2 服务器推送但它在 Apache2.4 上重新加载了推送的文件