我正在尝试提高客户端从我的 Compojure 网络服务器获取页面的性能。我们使用 (compojure.route/resources "/")
提供一堆静态文件(JS,CSS),它在文件系统上查找文件,将它们转换为 URL,然后将它们提供给响如溪流。通过转换为流,它似乎丢失了所有文件元数据,例如 mod 时间。
我可以包装静态资源处理程序并添加 Expires
或 Cache-Control: max-age
header ,但这会阻止客户端发送任何请求.很有用,但这些文件有时会更改(当我们发布版本时)。
理想情况下,我希望客户端在一个小时内信任自己的缓存版本,并在该小时过后使用 If-Modified-Since
header 发出请求。然后我们可以只返回 304 Not Modified
并且客户端避免下载几百公斤的 javascript。
看起来我可以在提供响应时设置 Last-Modified
header ,这会导致客户端使用 If-Modified-Since
header 来限定后续请求。很好,除了我必须重写 compojure.route/resources
中的大部分代码以添加 Last-Modified
- 不难,但很乏味 - 并发明一些更多代码来识别和响应 If-Modified-Since
header 。这不是一项艰巨的任务,但也不是一项简单的任务。
这是否已经存在于某处?我找不到它,但它似乎是一个足够普遍、足够大的任务,以至于现在有人会为它编写一个库。
最佳答案
FWIW,我通过使用 Ring 的 wrap-file-info 中间件让它工作;我有点尴尬,我在 Compojure 而不是 Ring 中寻找这个。但是,compojure.route
的 files
和 resources
处理程序都提供流而不是文件或 URL,当然 Ring 无法计算从中提取元数据。
我基本上不得不编写一份 resources
的副本,它返回一个 File
;当包裹在满足我需要的 wrap-file-info
中时。仍然不介意不涉及从 Compojure 复制一大块代码的稍微更好的解决方案。
关于http - 如何使用 Compojure 生成修改后的 http header ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6119490/