ПРИХОДИТЕ УЧИТЬСЯ НОВОЙ ПРОФЕССИИ ЛЕТОМ СО СКИДКОЙ ДО 70%Забронировать скидку

Предварительная загрузка изображений в JavaScript: решение

Пройдите тест, узнайте какой профессии подходите и получите бесплатную карьерную консультацию
В конце подарим скидку до 55% на обучение
Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для эффективной предварительной загрузки изображений создайте экземпляр new Image() и задайте значение для свойства src:

JS
Скопировать код
const preloadImage = src => (new Image().src = src);
// Немедленная предзагрузка:
['img1.jpg', 'img2.jpg'].forEach(preloadImage);  // Мы же не хотим навечно видеть индикаторы загрузки!

Этот подход позволяет быстро загружать изображения при добавлении их в DOM.

Пройдите тест и узнайте подходит ли вам сфера IT
Пройти тест

Продвинутая предварительная загрузка с обработчиками событий

Основной метод подойдет для большинства случаев, но когда важно убедиться, что изображение полностью загружено перед использованием, на помощь приходят обработчики событий onload и onerror:

JS
Скопировать код
const preloadImageWithEvents = (src, callback) => {
  const img = new Image();
  img.onload = () => callback(null, src);  // Готово к показу!
  img.onerror = error => callback(error, src);  // Бывают и неудачи
  img.src = src;
};

Для асинхронной загрузки нескольких изображений одновременно примените Promise.all:

JS
Скопировать код
const imageSources = ['img1.jpg', 'img2.jpg'];
const imagePromises = imageSources.map(src => {
  return new Promise((resolve, reject) => {
    preloadImageWithEvents(src, (error) => {
      if (error) reject(error); else resolve();
    });
  });
});

Promise.all(imagePromises)
  .then(() => console.info('Изображения предварительно загружены. Превосходно!'))
  .catch(error => console.error('Предварительная загрузка не удалась. Ошибка:', error));

Техники обеспечения совместимости с браузерами

Разные браузеры ведут себя по-разному, но следующие приемы улучшат совместимость:

  1. Используйте тег <link> для предварительной загрузки:
HTML
Скопировать код
<link rel="preload" href="img1.jpg" as="image"> <!-- Гораздо лучше, чем ждать наподобие времен далекого прошлого -->
  1. Примените JavaScript для динамической предварительной загрузки изображений:
JS
Скопировать код
function preloadImages(urls) {
  urls.forEach(preloadImage); // Быстро, как гонщики!
}
  1. Следите за прогрессом, работая с большим количеством изображений:

Используйте счетчики для простого отслеживания или Promise при работе с асинхронной загрузкой.

Управление вопросами совместимости

Тег <link> с атрибутом rel="preload" — современный метод, поддерживаемый большинством браузеров. Подстрахуйтесь, добавив предзагрузку на JavaScript как альтернативу для устаревших браузеров.

Визуализация

Передставьте каждое изображение, как гоночный автомобиль (🏎️), готовый к старту:

Markdown
Скопировать код
Предварительно загружаемые изображения:  [🏎️🖼️, 🏎️🖼️, 🏎️🖼️]

Каждый знак символизирует изображение, которое мгновенно появляется на экране со времени загрузки страницы:

Гонка начинается:

Markdown
Скопировать код
Вперед! 🚦 1... 2... 3... Они потягиваются! 🖼️🖼️🖼️

Изображения моментально отображаются на экране без каких-либо задержек на загрузку.

Обработка большого количества изображений

При работе с сотнями изображений:

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

Отладка процесса предварительной загрузки

Если возникают проблемы с предварительной загрузкой:

  • Примените console.log() для отслеживания процесса загрузки.
  • Реализуйте обработку onerror для фиксирования ошибок каждого изображения.
  • Проверьте сетевую панель в инструментах разработчика для контроля загрузки изображений.

Учет медленных подключений

Не все пользователи имеют доступ к быстрому интернету. Для оптимизации их опыта:

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

Полезные материалы

  1. rel=preload – HTML: HyperText Markup Language | MDN — Инструкция по использованию rel="preload" для эффективной предварительной загрузки контента на MDN Web Docs.
  2. Fast load times | web.dev — Рекомендации от Google об приоритетности ресурсов для ускорения загрузки страниц.
  3. The Complete Guide to Lazy Loading Images | CSS-Tricks — Руководство по внедрению отложенной загрузки изображений на CSS-Tricks.
  4. Preloading images with Javascript — Обсуждение на Stack Overflow о последних подходах к предварительной загрузке изображений с помощью JavaScript.