DANFA

Synchronous XMLHttpRequest on the main thread is deprecated

Если вы столкнулись с предупреждением «Synchronous XMLHttpRequest on the main thread is deprecated», это значит, что ваш код совершает синхронные запросы на главную нить браузера. Подобная практика признана устаревшей и не рекомендуется из-за серьёзного негативного влияния на пользовательский опыт.

В этой статье мы расскажем, почему появились такие запросы, каковы последствия их использования и как можно исправить ситуацию.

Что такое синхронные запросы?


Синхронный запрос — это когда выполнение программы блокируется до завершения сети. Другими словами, пока запрос не получит ответ от сервера, браузер не сможет продолжать обработку скриптов и реагировать на действия пользователя.

Например, возьмем такой JavaScript-код:
var xhr = new XMLHttpRequest();
xhr.open('GET', '/api/data', false); // Параметр false делает запрос синхронным
xhr.send();
console.log(xhr.responseText);

Параметр false в третьей позиции заставляет запрос ждать завершения передачи данных от сервера, полностью блокируя исполнение других команд до получения ответа.

Негативные последствия синхронных запросов


Использование синхронных запросов приводит к ряду негативных последствий:
  1. Заблокированное взаимодействие: Пользователи не могут нажимать на кнопки, пролистывать страницу или совершать другие действия, пока синхронизированный запрос ждет ответа.
  2. Потеря производительности: Длительно работающие синхронные запросы способны серьёзно замедлить загрузку страницы и выполнение других задач.
  3. Устаревший подход: Современные браузеры считают синхронные запросы на главной нити устаревшими и рекомендуют переходить на асинхронные решения.

Как исправить проблему?


Лучший способ — заменить синхронные запросы на асинхронные. Вот несколько подходов:

1. Переход на асинхронные запросы с помощью XMLHttpRequest
Преобразуем синхронный запрос в асинхронный:
var xhr = new XMLHttpRequest();
xhr.open('GET', '/api/data', true); // true — делаем запрос асинхронным
xhr.onload = function() {
    if (xhr.status === 200) {
        console.log(xhr.responseText);
    } else {
        console.error('Ошибка запроса:', xhr.statusText);
    }
};
xhr.send();

Теперь запрос не блокирует выполнение основного потока, и браузер продолжит обрабатывать события и отображать интерфейс.

2. Использование современного API — Fetch
Ещё лучше полностью отказаться от XMLHttpRequest и использовать новый стандарт — Fetch API. Пример:
fetch('/api/data')
    .then(response => response.text())
    .then(text => console.log(text))
    .catch(error => console.error('Ошибка запроса:', error));

Fetch API предоставляет более чистую и удобную работу с асинхронными запросами и обещает лучшее будущее для JS-разработки.

Заключение
Синхронные запросы на главной нити признаны устаревшими и являются причиной серьезных проблем с производительностью и удобством пользователей. Самым правильным решением будет переделать такие запросы на асинхронные с помощью новых технологий вроде Fetch API. Это сделает ваш код более эффективным и безопасным, а взаимодействие с вашим сервисом — приятным и быстрым.
Автор:  15 часов назад