Ветка: bugfix/MEDIAWEB-6278, коммит 4ee1ac1b51.
Сравнение: прод kion.ru (старый код, до фикса) против локального SSR ветки (npm run start:web, прод-бэкенды), гость.
Ключи на локальном стенде форсились через декоратор @IsForceOverride() на полях
WebConfigDefaults (значение берётся из локального дефолта вместо бэкенда). Правки дефолтов
тестовые, в коммит не входят, после прогона откатены.
Ключи на проде форсились cookie remote-config-override = URL-encoded JSON
{"ключ":"значение",...} (значения строками). SSR читает её в main.server.ts
(addKeyOverride по каждому ключу), а через injectToDocument(remoteConfigService.getAll())
форс-значения попадают в <script id="remote-config-state"> — браузер после гидрации живёт
на тех же значениях. UI этого механизма — страница /remote-config-dev-tools (пишет ту же куку).
Эффективные ключи прода вычленялись curl-ом из SSR-ответа:
curl -s https://kion.ru/ -H 'Cookie: remote-config-override=%7B%22moneta_header_top_button%22%3A%22true%22%7D' \
| grep -o '<script id="remote-config-state"[^>]*>.*</script>'
Отключение JavaScript — честное, на уровне браузера: CDP-команда
Emulation.setScriptExecutionDisabled(true) перед загрузкой (эквивалент галки
«Disable JavaScript» в DevTools). Рендерится только SSR-HTML + CSS, гидрации нет.
Вьюпорты: десктоп 1280px, мобила 375px.
Ограничение куки на проде: ключи, которые код читает как поле напрямую (например,
vitrina_filters_available в HeaderComponent), нельзя выключить — строка 'false' truthy,
а булев false отбрасывается проверкой configOverrides[key] ? ... в remote-config.service.ts.
Ключи через isKeyEnabled(...) и сравнения === '1' выключаются нормально
(подтверждено кейсом 3: фильтры на проде остались, остальное выключилось).
| Ключ | Значение на проде |
|---|---|
moneta_header_top_button |
'false' |
acq_promocode_button_header |
'1' |
acq_promocode_button_text |
'Промокод' |
moneta_special_offer_enabled |
'true' (гостю недоступно) |
vitrina_filters_available |
'true' |
vitrina_kids_header_button |
'true' |
Совпадает с кейсом 1 — сравнение до/после фикса прямое.
Ключи (локально — @IsForceOverride(); на проде — текущие значения, кука не нужна):
| Ключ | Значение |
|---|---|
moneta_header_top_button |
false |
acq_promocode_button_header |
'1' |
acq_promocode_button_text |
'Промокод' |
vitrina_filters_available |
true |
vitrina_kids_header_button |
true |
Ожидание на ветке: десктоп — меню, фильтры, лупа, «Промокод» с текстом, «Дети», «Войти»; мобила — подарок-иконка, фильтры, лупа («Дети»/«Войти» скрыты). Пары JS on/off идентичны. На проде js-off-мобила показывает десктопную раскладку — баг из тикета.
| Прод (до фикса) | Ветка (после фикса) | |
|---|---|---|
| JS on, мобила | ![]() |
![]() |
| JS on, десктоп | ![]() |
![]() |
| JS off, мобила | ❌ баг: ![]() |
✅ ![]() |
| JS off, десктоп | ![]() |
![]() |
Ключи — как в кейсе 1, кроме moneta_header_top_button = true.
На проде: cookie {"moneta_header_top_button":"true"} (проверено curl-ом: значение уходит
в remote-config-state, в SSR-разметке появляется web-kion-top-button).
Ожидание: КИОН Топ вместо промокода и «Детей»; на десктопе web-логотип, на мобиле app-логотип (подмена медиазапросом, без JS). На проде js-off-мобила — снова десктопная раскладка.
| Прод (до фикса) | Ветка (после фикса) | |
|---|---|---|
| JS on, мобила | ![]() |
![]() |
| JS on, десктоп | ![]() |
![]() |
| JS off, мобила | ❌ баг: ![]() |
✅ ![]() |
| JS off, десктоп | ![]() |
![]() |
Локально (@IsForceOverride()): moneta_header_top_button=false, acq_promocode_button_header='0',
vitrina_filters_available=false, vitrina_kids_header_button=false.
На проде: cookie {"moneta_header_top_button":"false","acq_promocode_button_header":"0","vitrina_kids_header_button":"false","vitrina_filters_available":"false"} —
фильтры на проде остались (ограничение куки для прямых булевых полей, см. методику),
поэтому колонки различаются наличием кнопки фильтров: на ветке её нет, на проде есть.
Ожидание на ветке: десктоп — меню, лупа, «Войти»; мобила — только лупа.
| Прод (до фикса, фильтры не выключаемы кукой) | Ветка (после фикса) | |
|---|---|---|
| JS on, мобила | ![]() |
![]() |
| JS on, десктоп | ![]() |
![]() |
| JS off, мобила | ❌ баг: ![]() |
✅ ![]() |
| JS off, десктоп | ![]() |
![]() |
moneta_special_offer_enabled='true' на проде, но гостю недоступно —
см. HeaderComponent#initSpecialOffer) — вытеснение промокода покрыто юнит-тестом
(«should hide promo button when special offer is visible»).vitrina_header_image_background (фон шапки) — независимый косметический ключ, в прогон не вошёл.