Современные браузеры поддерживают WebP, но старые версии и некоторые встроенные webview могут показать пустое место. Надежный сайт не определяет браузер по user-agent, а предоставляет несколько форматов через HTML picture или корректное согласование содержимого.
Для обычной страницы используйте picture: WebP/AVIF в source, исходный JPEG/PNG в img. Сервер должен отдавать правильный Content-Type, CDN — различать варианты, а fallback сохранять размеры, alt и визуальное качество.
Что проверить в первую очередь
Сначала зафиксируйте точный сценарий, время ошибки и последнее известное рабочее состояние. Не меняйте несколько настроек одновременно: один контролируемый шаг должен подтверждать или исключать одну гипотезу. Перед работой с данными и конфигурацией подготовьте резервную копию и понятный способ отката.
- Проверьте файл напрямую и Content-Type image/webp.
- Посмотрите итоговый HTML: есть ли img fallback внутри picture.
- Проверьте CDN/cache key и заголовок Vary, если формат выбирает сервер.
- Уточните конкретную версию браузера/webview и поддержку picture.
Почему возникает проблема
Внешний симптом обычно появляется на границе нескольких компонентов: интерфейса, backend, базы, фоновой очереди или внешнего сервиса. Поэтому важно найти первое место, где состояние становится неверным, а не исправлять последнее сообщение об ошибке.
- В img указан только .webp без альтернативы.
- Сервер отдает WebP как application/octet-stream или text/plain.
- CDN закешировал WebP и отдает его клиентам без поддержки.
- Polyfill загружается позже изображения или ломается CSP.
- URL fallback существует, но возвращает тот же WebP после rewrite.
Пошаговая диагностика
Диагностику проводите на тестовой записи или отдельном окружении. В журналах скрывайте токены, пароли и персональные данные. Для каждого шага сохраняйте измеримый результат: идентификатор события, код ответа, версию записи, состояние процесса или контрольную сумму.
- Откройте Network и сравните URL, status, Content-Type и decoded preview.
- Отключите CDN и проверьте origin на тестовом домене.
- Запросите варианты с разными Accept и проверьте Vary: Accept.
- Проверьте HTML без JavaScript.
- Сравните размеры и aspect ratio fallback/modern форматов.
Два надежных способа fallback
HTML picture проще и прозрачно кешируется. Серверное content negotiation полезно для существующих URL, но требует аккуратной настройки CDN.
- В picture браузер сам выбирает первый поддерживаемый source.
- Последний img обязателен и содержит src, alt, width и height.
- При negotiation один URL может отдавать разные bytes только при корректном Vary/cache key.
- Форматы генерируются из одного исходника с контролем качества и цветового профиля.
- SEO и accessibility опираются на img/alt, а не на CSS background для смыслового изображения.
Как исправить проблему
Исправление лучше разбить на небольшие обратимые изменения. Сначала устраните подтвержденную причину, затем повторите исходный сценарий и проверьте соседние функции. Массовую обработку данных запускайте на ограниченной выборке с отчетом и только после сверки расширяйте на весь объем.
- Добавьте JPEG/PNG fallback в img и WebP/AVIF в source.
- Настройте MIME types и удалите rewrite, подменяющий fallback.
- Исправьте CDN cache variation или используйте разные URL форматов.
- Сгенерируйте размеры/качество с проверкой прозрачности и цветового профиля.
- Оставьте lazy loading и responsive srcset согласованными для всех форматов.
Безопасный порядок внедрения
- Сохраните затрагиваемые данные, конфигурацию и текущие журналы, заранее проверив способ отката.
- Повторите проблему на тестовом объекте без реальных списаний, рассылок и изменений клиентских данных.
- Внесите одно логическое изменение и зафиксируйте его в системе контроля версий или журнале работ.
- Не отключайте авторизацию, валидацию, шифрование и другие защитные механизмы ради быстрого исчезновения ошибки.
- После выкладки контролируйте логи, метрики и полный пользовательский сценарий, а не только один успешный запрос.
Как проверить результат
Разовый успешный тест недостаточен. Повторите операцию, проверьте крайние значения, параллельные действия и восстановление после перезапуска или временного сбоя. Для важного сценария сохраните автоматический тест либо короткий регрессионный чек-лист.
- Современный браузер загружает WebP, старый — JPEG/PNG.
- При отключенном JavaScript изображение и alt остаются доступными.
- CDN не отдает формат вопреки Accept клиента.
- Layout не прыгает, качество и прозрачность соответствуют исходнику.
Типичные ошибки при исправлении
- Определять поддержку только по user-agent.
- Менять расширение файла на .jpg без перекодирования.
- Использовать один cache key для разных форматов.
- Удалять исходники после конвертации без возможности пересоздания.
Как предотвратить повторение
Профилактика строится вокруг явных контрактов, повторяемых релизов и наблюдаемости. Система должна не только работать сейчас, но и позволять быстро увидеть нарушение инварианта при следующем обновлении, росте нагрузки или сбое внешнего сервиса.
- Автоматизируйте генерацию форматов из мастер-изображения.
- Добавьте browser matrix/webview в визуальные тесты.
- Проверяйте Content-Type и размеры в CI.
- Мониторьте ошибки загрузки изображений и cache hit по формату.
Что подготовить для технического разбора
- Описание ожидаемого и фактического поведения, а также точную последовательность действий.
- Время проблемы, идентификатор тестового объекта и версии затронутых компонентов.
- Фрагменты журналов до и после ошибки без секретов и персональных данных.
- Перечень последних изменений и уже выполненных проверок.
- Безопасный доступ к тестовой среде или способ воспроизвести сбой без влияния на клиентов.
Частые вопросы
Нужен ли JavaScript-polyfill?
Обычно нет, если использовать picture с img fallback. Это работает декларативно и надежнее при отключенном JS.
Можно ли отдавать WebP по тому же .jpg URL?
Можно через negotiation, но CDN и proxy обязаны учитывать Accept. Разные URL проще диагностировать и кешировать.
Когда нужна помощь специалиста
Если после оптимизации изображения пропали в части браузеров, я могу проверить HTML, MIME, CDN и генерацию форматов, добавить надежный fallback без ухудшения скорости и качества.