Использование паттернов «Отложенная инициализация (загрузка)» (Lazy initialization (load)) и «Заместитель» (Proxy) при отображении видео на сайте

Отображением на сайте видео с различных видеохостингов (того же YouTube) сегодня уже никого не удивить. Однако, если на странице находится не одно видео, а несколько возникает не совсем приятная ситуация.

Дело в том, что для отображения даже стандартного preview браузеру необходимо направить соответствующий запрос к видео хостингу, а это требует времени. И чем больше видео на странице, тем больше времени потребуется для обработки запросов к видеохостингу и тем дольше страница будет загружаться.

Как оптимизировать скорость загрузки страницы?

1.Старайтесь не размещать на странице вашего сайта код вставки видео, если планируется добавить на неё несколько видеороликов

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

2.Загружайте видео динамически

И здесь мы уже вплотную подошли к использованию паттернам «Отложенная инициализация» и «Заместитель».

Вкратце напомним их суть.

  • «Отложенная инициализация»
    Н
    екоторая ресурсоёмкая операция (создание объекта, вычисление значения) выполняется непосредственно перед тем, как будет использован её результат (Википедия);
  • «Заместитель»
    В приложение вместо самого объекта помещается своего рода объект-«заместитель» («заглушка»). Когда программа обращается к объекту-«заместителю» загружается исходный объект.

По существу «Заместитель» можно рассматривать как частный случай «Отложенной инициализации».

На самом деле для того чтобы показать несколько видеороликов на сайте вовсе не обязательно загружать их на страницу все сразу. Это можно делать динамически при помощи JavaScript, например, по клику на вышеописанной «заглушке».

Рассмотрим данный приём более подробно на примере YouTube.

1й способ. Показ видео в одном и том же контейнере

Этот способ основан на паттерне «Отложенная инициализация».

Создадим две «заглушки». В атрибуте rel у каждой из них укажем идентификатор видео на YouTube.

Видео 1

Видео 2

Далее создадим контейнер, в котором будем показывать видео.

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

По клику на «заглушке» мы будем удалять из контейнера имеющийся в нём код вставки видео (если он там есть), а на его место размещать новый со ссылкой уже на другое видео.

Таким образом видео будет загружаться только одно и только тогда когда посетитель страницы захочет его посмотреть. В результате объём трафика между браузером и видеохостингом существенно уменьшается и скорость загрузки страницы возрастает.

2й способ. Показ каждого видео в индивидуальном контейнере

Если показ видео в одном и том же контейнере не подходит (в том числе с точки зрения дизайна), можно создать отдельный контейнер для каждого видео. В этом случае при клике на «заглушку» будет изменяться содержимое соответствующего контейнера.

Ниже показа один из возможных вариантов реализации.

Создаём контейнеры для видеозаписей и помещаем в них «заглушки».

Видео 1

Видео 2

При клике на «заглушки» очищаем соответствующий контейнер и загружаем в него видео.

По своей сути этот способ представляет собой классическую реализацию паттерна «Заместитель», так как видео загружается не просто «по запросу», а вместо самой «заглушки». Более того при загрузке видео в индивидуальный контейнер нет необходимости загружать его повторно, если посетитель страницы вновь захочет его посмотреть. Что даёт дополнительную оптимизацию быстродействия по сравнению с первым способом.

Но, такой подход также не всегда приемлем в плане дизайна.

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *