6

我正在尝试提高客户端从我的 Compojure 网络服务器获取页面的性能。我们使用 提供一堆静态文件(JS、CSS)(compojure.route/resources "/"),它在文件系统上查找文件,将它们转换为 URL,然后将它们作为流提供给 Ring。通过转换为流,它似乎丢失了所有文件元数据,例如 mod 时间。

我可以包装静态资源处理程序并添加一个ExpiresorCache-Control: max-age标头,但这会阻止客户端发送任何请求。有用,但这些文件有时会更改(当我们发布版本时)。

理想情况下,我希望客户端在一个小时内信任自己的缓存版本,并If-Modified-Since在该小时过去后发出带有标头的请求。然后我们可以返回304 Not Modified,客户端避免下载几百公斤的 javascript。

看起来我可以Last-Modified在提供响应时设置一个标头,这会导致客户端使用If-Modified-Since标头限定后续请求。太好了,除了我必须重写大部分代码compojure.route/resources才能添加Last-Modified- 不难,但乏味 - 并发明更多代码来识别和响应If-Modified-Since标题。这不是一项艰巨的任务,但也不是一项简单的任务。

这是否已经存在于某个地方?我找不到它,但它似乎是一个足够普遍且足够大的任务,以至于现在有人会为它编写一个库。

4

2 回答 2

5

FWIW,我通过使用 Ring 的 wrap-file-info 中间件来实现这一点;我有点尴尬,我在 Compojure 而不是 Ring 中寻找这个。但是,compojure.route'sfilesresources处理程序都提供流而不是文件或 URL,当然 Ring 无法从中找出元数据。

我基本上必须写一个resources返回 a的副本File;当包裹在wrap-file-info满足我的需求时。仍然不会介意更好的解决方案,它不涉及从 Compojure 复制一大块代码。

于 2011-05-25T17:29:50.210 回答
1

您是否考虑过使用ring-etag-middleware?它使用文件的最后修改日期来生成实体标签。然后,它在与请求中的 if-none-match 标头匹配时键入 304。

于 2011-05-25T06:31:14.077 回答