fix(delivery): immutable-кэш ассетов — отключить дефолтный cacheControl @fastify/static (#452) #455
Reference in New Issue
Block a user
Delete Branch "fix/452-immutable-cache-control"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
Immutable-кэш хэшированных ассетов не работал:
@fastify/staticс дефолтнымcacheControl:trueпишет свойCache-Control: public, max-age=0ПОСЛЕsetHeaders-колбэка, затираяimmutable-заголовок изresolveStaticAssetHeaders. Итог на проде —cache-control: public, max-age=0, повторные заходы ревалидируют каждый ассет. Фикс —cacheControl:false(одна строка), колбэк владеет заголовком. Хвост #346.closes #452
How verified
cacheControl:falseв регистрацииfastifyStatic(static.module.ts),setHeaders/resolveStaticAssetHeadersне тронуты./assets/<hashed>→public, max-age=31536000, immutable; locales/vad/иконки → толькоvary(нет cache-control → браузер ревалидирует по etag, приемлемо);index.html— отдельный wildcard-роут со своимno-cache, не затронут; preCompressed.brполучает путь с/assets/→ маппинг матчит.Fastify()+inject()с теми же опциями, temp-dir сassets/index-a1b2c3.jsиlocales/en.json→/assets/…содержитimmutable+max-age=31536000,/locales/en.json— нет. Мутационно:cacheControl:trueроняет ассертimmutable.jest static.module→ 5 passed (3 юнит + 2 интеграционных);tscбез новых ошибок (единственная — предсуществующая@fastify/compressв main.ts, на базе тоже).Прод-проверка после деплоя (в тексте #452):
curl -sI …/assets/<hashed>.js | grep cache-control→max-age=31536000, immutable.Checklist
Ревью — #455
fix(delivery): immutable-кэш ассетов — отключить дефолтный cacheControl @fastify/static (#452)Вердикт: PASS ✅
Полный веер из 9 аспектов (merge-base
f8d37d89; +5 прод / +71 тест). Гейт зелёный: server tsc 0,static.module.spec5/5.Фикс:
cacheControl: falseна @fastify/static. ДефолтныйcacheControl:trueписал свойCache-Control(из maxAge=0) ПОСЛЕsetHeaders, затирая immutable-заголовок, который ставитresolveStaticAssetHeaders. Отключение отдаёт владение заголовком setHeaders.Проверено — корректность кеш-заголовков (клик)
/assets/(хешированные) →public, max-age=31536000, immutable(цель фикса).index.html→no-cache, no-store, must-revalidate(НЕ immutable — index.html переписывается на бут с window.CONFIG). Классический риск «залипший старый бандл после деплоя» ИСКЛЮЧЁН.cacheControl:falseили сломать матч/assets/. Etag/Last-Modified для нехешированных проверены.⚠️ К сведению (by-design, не блок)
С
cacheControl:falseнехешированные файлы (manifest.json, brand-SVG, locales) больше НЕ получаютCache-Control: max-age=0(@fastify/static-дефолт) — только Etag/Last-Modified → браузер применит эвристическое кеширование (может подержать свежим короткое окно вместо немедленной ревалидации). Осознанно (resolveStaticAssetHeaders намеренно отдаёт их на etag), файлы стабильны + есть Etag. Если захочешь строгую ревалидацию нехешированных — можно явно ставить имno-cacheв resolveStaticAssetHeaders, но не обязательно.DO/ESCALATE нет. Фикс корректен (immutable для хешированных доживает, index.html no-cache — нет залипания), покрыт и мутационно-гардирован. Approve.
9 аспектов. index.html-no-cache / assets-immutable / no-header-фолл-тру / мутационный гард проверены мной + консолидированным субагентом. Нехешированные-эвристика — by-design к сведению. Escalate нет.