Есть ли способ использовать кеш браузера для запросов AngularJS JSON ($http/$resource)?

Мы разрабатываем приложение с сервисами AngularJS и RESTful. Данные, возвращаемые службами, изменяются нечасто, и мне бы очень хотелось кэшировать ответы на определенный период времени. Я устанавливаю Cache-Control: no-transform, max-age=604800 в ответ.

Есть ли способ заставить запросы AngularJS JSON ($http/$resource) учитывать кеш браузера вместо использования полностью параллельного встроенного кеша AngularJS (http://www.metaltoad.com/blog/angularjs-vs)-browser-http-cache) или библиотеку angular-cache (http://angular-data.pseudobry.com/documentation/api/angular-cache) ? Из того, что я вижу, наблюдая за сетью, по умолчанию запросы $http игнорируют заголовки Cache-Control.


person DKroot    schedule 24.07.2014    source источник


Ответы (2)


Браузер будет учитывать время кэширования, установленное ответом для этого конкретного актива. Любой последующий GET должен обращаться к кешу, пока не истечет время ожидания.

Возможно, у вас есть devtools, игнорирующие это.

person Dane Macaulay    schedule 24.07.2014

Где я спотыкался, так это в перезагрузке страниц и в том, как они ведут себя по-разному.

Разделим варианты использования на два:

1. Посещение страницы: просто переход на ранее посещенную страницу.

Здесь я вижу то же, что и вы: большая часть контента извлекается из кеша. Chrome показывает это лучше, чем Firefox/Firebug. Firebug просто не показывает попадания в кэш на панели «Сеть».

2. Регулярные перезагрузки страницы.

Почти во всех браузерах есть два ярлыка для обновления страницы: обычная перезагрузка (Ctrl+R в Chrome/Windows) и перезагрузка с игнорированием кеша (Shift+F5 в Chrome/Windows). Я говорю о регулярных перезагрузках, так как если кеш игнорируется, то и обсуждать нечего.

Похоже, что браузер выдает запросы If-Modified-Since для всех ресурсов на странице. Затем сервер отвечает 304 Not Modified для статических ресурсов, и браузер получает их из кеша.

Проблема в том, что мы не обрабатывали If-Modified-Since в наших сервисах. Мы просто устанавливали Cache-Control со сроком действия.

Обновление кода сервера, которое начало обрабатывать If-Modified-Since, решило проблему.

Кстати, вот справочная статья о кэшировании браузера, которую я нашел весьма полезной: https://devcenter.heroku.com/articles/increasing-application-performance-with-http-cache-headers

person DKroot    schedule 31.07.2014