#firebase #caching #cdn #firebase-hosting #google-cloud-run
#firebase #кэширование #cdn #firebase-хостинг #google-cloud-run
Вопрос:
Я уже давно кэширую свои статические ресурсы, такие как: css, изображения, js-файлы и т.д. Поскольку все эти файлы получают идентификаторы хэша содержимого в моем процессе сборки, вот как я обрабатываю их с точки зрения кэша:
// STATIC FILES LIKE IMAGES, FONTS, CSS AND JS
Cache-Control: "public,max-age=31536000"
Таким образом, я получаю кэш клиента и CDN на срок до года, и это здорово. Все работает нормально.
Но мое веб-приложение — это одностраничное приложение React, поэтому всякий раз, когда я его обновляю, единственный index.html
файл, который мои пользователи получили из моего приложения, автоматически становится устаревшим и бесполезным, потому что он указывает на старые статические JS-файлы, которые все сейчас обновлены.
Так что в принципе я не могу позволить им зачерстветь index.html
, несмотря ни на что.
Я также хотел бы получить преимущества от кэша CDN для этого файла. И вот тут-то все может стать сложнее.
Прямо сейчас, на всякий случай, вот что я делаю:
// For index.html
Cache-Control: "no-cache, no-store, must-revalidate"
Я подумывал о том, чтобы сменить его на:
// FOR index.html
Cache-Control: "max-age=0, s-maxage=86400, must-revalidate"
Таким образом, я получил бы кэш CDN на 1 день, что было бы неплохо. Но я все равно не хочу рисковать и подавать несвежее index.html
.
Вот что говорит об этом Firebase Hosting:
Любой запрошенный статический контент автоматически кэшируется в CDN. При повторном развертывании содержимого вашего сайта Firebase Hosting автоматически очищает весь ваш кэшированный статический контент в CDN до следующего запроса.
Но проблема в том, что мой сервер размещен в облаке. И Firebase размещает практически rewrites
каждый запрос к нему. Что-то вроде:
firebase.json
"rewrites": [
{
"source": "**",
"run": {
"serviceId": "server",
"region": "uscentral-1"
}
}
]
Итак, всякий раз, когда я обновляю свое приложение, я повторно развертываю его в Cloud Run, но я не запускаю новую firebase deploy --only hosting
команду. Потому что в моем firebase.json
файле ничего не меняется между новыми развертываниями кода облачного запуска.
ВОПРОС
Безопасно ли добавлять s-maxage=86400
заголовок в этой ситуации?
Предположение, что новое развертывание в облаке не приведет к очистке кэша CDN. Могу ли я что-нибудь сделать, чтобы вызвать это? Нравится какая firebase deploy --only hosting:clear-cdn
-то команда?
Потому что, даже если я firebase deploy --only hosting
снова запущу, я не совсем уверен, что кэшированные файлы будут удалены, потому что моя /public
папка хостинга Firebase всегда является пустой папкой. Таким образом, хостинг Firebase может «почувствовать», что ничего не изменилось.
Ответ №1:
После дня тестирования вот результаты:
Если вы зададите Cache-Control
заголовки, которые позволят использовать совместное кэширование (CDN), например public
или no-cache
, ваши ответы будут кэшироваться как в браузере клиента, так и в кэшировании CDN.
- При повторном развертывании в Cloud Run будет ли автоматически очищен кэш CDN?
Нет. При обновлении и повторном развертывании файлов вашего приложения в Cloud Run эти кэшированные файлы на CDN будут устаревшими и не будут автоматически удалены из CDN. Поэтому, даже если ничего не изменилось в отношении хостинга Firebase, вам нужно запустить firebase deploy --only hosting
снова. Это заставит CDN очистить все ваши кэшированные файлы, и новые запросы сразу начнут получать свежие данные.
- Я не совсем уверен, что кэшированные файлы будут удалены, потому что моя папка Firebase Hosting / public всегда является пустой папкой. Таким образом, хостинг Firebase может «почувствовать», что ничего не изменилось.
Даже если в вашей папке хостинга Firebase ничего public
не изменилось (в моем случае это пустая папка) и в вашей ничего firebase.json
не изменилось, он все равно создаст новую версию Firebase Hosting и очистит ваши кэшированные файлы из CDN, как сказано в документе:
Любой запрошенный статический контент автоматически кэшируется в CDN. При повторном развертывании содержимого вашего сайта Firebase Hosting автоматически очищает весь ваш кэшированный статический контент в CDN до следующего запроса.
Внимание на динамический контент
Например, если у вас есть динамический контент, который вы будете редактировать через пользовательский интерфейс администратора. Имейте в виду, что кэш CDN будет хранить устаревший кэш этого содержимого до истечения срока его действия.
Например: кэширование CDN /blog/some-post
с s-maxage of 1 day
помощью . Даже если вы динамически измените содержимое своего сообщения, CDN будет сохранять CDN в течение 1 полного дня, пока не истечет срок его действия и он не будет запрошен снова.