反应 renderToNodeStream 和 gzip/br/deflate

Gab*_*Mor 1 gzip stream reactjs server-side-rendering

使用 React/Express 处理 SSR 应用程序时,我试图掌握 renderToNodeStream 和一般流。

我有一个大页面(400kb 未压缩)并且使用 renderToNodeStream 提供了一个非常好的 TTFB(到第一个字节的时间),我想念的是一些压缩以使发送回的 HTML 响应更小但我不能让它与 renderToNodeStream 一起工作。

我错过了什么吗?
是否可以流式传输新鲜呈现的响应并压缩它们?

const stream = renderToNodeStream(<MyApp/>)

// this doesn't work
stream.pipe(zlib.createGzip())
stream._flush = zlib.Z_SYNC_FLUSH

stream.pipe(
 res,
 { end: "false" }
)

// stream.on("data", data => {
//   console.log(data)
// })
stream.on("end", () => {
  res.end(pageEnd())
})
Run Code Online (Sandbox Code Playgroud)

小智 5

如果您使用的是快递压缩中间件,您可能需要编写

res.setHeader('Content-Type', 'text/html');
Run Code Online (Sandbox Code Playgroud)

在流式传输到客户端之前。

压缩中间件代码所示,如果Content-Type不存在,中间件不会压缩内容。

最终代码将是:

res.setHeader('Content-Type', 'text/html');

const stream = renderToNodeStream(<MyApp/>)

stream.pipe(
 res,
 { end: "false" }
)

stream.on("end", () => {
  res.end(pageEnd())
})
Run Code Online (Sandbox Code Playgroud)