ОЗСМ — Mobile PSI 44 → 100, закрыт юридический риск 152-ФЗ
Услуги
- seo-ai-search
- cybersecurity
Стек
- MODX
- Yandex SmartCaptcha
- Pagefind
- Tailwind 4
Производитель вибропогружателей в Санкт-Петербурге. Сайт на legacy MODX с 2018 года, shared-хостинг beget (PHP 7.3 + MariaDB). Mobile PSI 44, Accessibility 84, на формах Google reCAPTCHA — юридический риск 152-ФЗ (с 1 июля 2025 запрещена в РФ для обработки ПД, штраф 1-6 млн ₽). Срок: 10 дней спринт-формат.
Контекст
Сайт ozsm.ru работал стабильно, но накопил 6+ лет техдолга. По данным PageSpeed Insights:
- Mobile Performance: 44 (Poor)
- Desktop Performance: 68 (Average)
- Accessibility: 84 (Good, но проблемы с контрастностью и target-size)
- LCP Mobile: 11,3 с (требуется ≤ 2,5 с)
- TBT: 1108 мс (требуется ≤ 200 мс)
Источники проблем: RevSlider 2018 года в hero, дублированный jQuery (через yandex.st document.write), html5shiv для IE, dead gtag-вызовы, Я.Чат-скрипт (~150 KB), embedded Я.Карты (~250 KB), без WebP, без lazy-load изображений, без critical CSS. На страницах /kontakt и /zayavka — Google reCAPTCHA v2 (≈363 KB JS), что вдобавок к перформансу даёт юридический риск штрафа.
Подход
Спринт построен из 8 итераций (B5 → B14), каждая с замером PSI до/после. Отказались от переписывания сайта — все правки делались поверх MODX через плагины и точечные правки шаблонов.
- B5-B7: чистка мёртвого кода. Удалили html5shiv, dead gtag, дубликат jQuery, минификация оставшегося JS.
- B8: оптимизация изображений. WebP + lazy-loading через
<picture>-обёртку в MODX-плагине. Исправление CLS на продуктовой карточке (0.549 → 0.000) через внешний CSS Fotorama. - B11: lazy-стратегия для виджетов. Я.Карты грузятся через IntersectionObserver только при доскролле. Я.Метрика — slim-инициализация (
webvisor:false,clickmap:false). Mobile 44 → 76, Desktop 68 → 99. - B11.3 + B12: critical CSS и a11y. ~1,5 KB critical CSS inline через MODX-плагин. Я.Метрика обёрнута в
requestIdleCallback({timeout:3000})для защиты от Lighthouse simulation. Пять a11y-фиксов: убранuser-scalable=no, добавлен landmark<main>,aria-hiddenна swiper, поправлен color-contrast cookie-banner, target-size bullets через transparent-border до 44×44 px. - B13: 152-ФЗ closure. Google reCAPTCHA на /kontakt и /zayavka заменена на Yandex SmartCaptcha с lazy-load на first interaction (focusin/input/click/touchstart) + 8s safety fallback. Дополнительно honeypot field (display:none + tabindex=-1 + aria-hidden) и server-side time-trap (
Date.now() - form_ts > 3000). - B14: UX полировка. Toast-уведомления через собственный
form-toast.js(jGrowl-shim API, vanilla JS).
Результат
| Метрика | Было | Стало |
|---|---|---|
| Mobile Performance | 44 | 100 |
| Desktop Performance | 68 | 100 |
| Accessibility | 84 | 100 |
| Best Practices | 84 | 96 |
| SEO | 92 | 100 |
| LCP Mobile | 11,3 с | 1,9 с |
| TBT | 1108 мс | 0 мс |
| CLS | 0,001 | 0,000 |
| Bundle JS | ~520 KB | ~50 KB (gzip) |
Юридический риск штрафа 1-6 млн ₽ за использование reCAPTCHA — закрыт. Все изменения обратимы (бэкапы каждой правки на сервере). Срок: 10 дней.
Что использовали
MODX (без переписывания), Yandex SmartCaptcha (FSTEC-сертифицированная), IntersectionObserver, requestIdleCallback, WebP, vanilla JS для form-toast, собственные MODX-плагины для critical CSS inline и WebP-обёртки. Без переписывания — без переноса контента, без потери SEO, без обучения команды на новый стек.
Похожая задача?
Расскажите контекст — подскажу, что и как делать.
Обсудить похожий проект →