最近,我阅读了Facebook 的一篇关于他们的新页面流水线系统的文章。目前,有几个 Github 项目具有类似的实现,但它们都是用 Php 编写的。
什么是大管?
BigPipe 是 Facebook 提出的一个系统,它使页面加载速度看起来更快。单个页面被分成小 pagelet,所以看起来像这样,其中每个框都是一个 pagelet:
所以加载整个网页的逻辑变成了:
- 从客户端向服务器发出的第一个请求,生成的骨架 html 非常快,具有 bigpipe javascript。
- 当客户端收到骨架 HTML 时,它会运行 BigPipe javascript。
- 虽然与服务器的连接保持持久,但“pagelet”会沿管道刷新到客户端并由 bigpipe javascript 呈现。
- 每个 pagelet 的 HTML、CSS 和 JS 在收到时都会下载并呈现,因此每个 pagelet 都是单独加载的,给人一种加载速度更快的感觉。
他们的数据显示页面加载时间提高了大约 2 倍。
问题
在 Pyramid 中实现这一点的主要问题是我还没有找到一种方法来保持与客户端的持久 HTTP 连接,以便能够将这些“pagelet”刷新到管道中。我已经尝试过response.app_iter
,但是生成器产量没有被刷新,而是首先生成整个响应,然后一次全部刷新到管道中。有没有办法将多个“响应”刷新到与 Pyramid 的持久连接中?