Я пытаюсь повысить производительность клиентов, выбирающих страницы с моего веб-сервера Compojure.Мы обслуживаем кучу статических файлов (JS, CSS), используя (compojure.route/resources "/")
, который ищет файлы в файловой системе, преобразует их в URL-адреса, а затем передает их в Ring в виде потоков.При преобразовании в потоки, похоже, теряются все метаданные файла, такие как время мода.
Я могу обернуть обработчик статического ресурса и добавить заголовок Expires
или Cache-Control: max-age
, но это мешает клиентуот отправки любого запроса вообще.Полезно, но эти файлы иногда изменяются (когда мы выпускаем релиз).
В идеале я бы хотел, чтобы клиент доверял своей собственной кэшированной версии, скажем, в течение часа, и делал запрос сIf-Modified-Since
заголовок по истечении этого часа.Тогда мы можем просто вернуть 304 Not Modified
, и клиент избегает загрузки нескольких сотен килограмм javascript.
Похоже, я могу установить заголовок Last-Modified
при обслуживании ответа, и это приводит к тому, что клиент готовится к последующемузапросы с If-Modified-Since
заголовками.Отлично, за исключением того, что мне пришлось бы переписать большую часть кода в compojure.route/resources
, чтобы добавить Last-Modified
- не сложно, но утомительно - и придумать еще немного кода для распознавания и ответа на заголовок If-Modified-Since
.Не монументальная задача, но и не простая.
Это уже где-то существует?Я не смог его найти, но это кажется достаточно распространенной и достаточно большой задачей, и кто-то уже написал бы для нее библиотеку.