Українська

Повний посібник з відкладеного завантаження зображень та компонентів для підвищення продуктивності сайту та покращення користувацького досвіду для глобальної аудиторії.

Відкладене завантаження: оптимізація веб-продуктивності за допомогою зображень та компонентів

У сучасному цифровому світі продуктивність веб-сайту має першочергове значення. Користувачі очікують швидких, чутливих інтерфейсів, а пошукові системи надають пріоритет сайтам, які це забезпечують. Однією з ключових технік для підвищення продуктивності є відкладене завантаження (lazy loading). Ця стаття є повним посібником з відкладеного завантаження зображень та компонентів, що допоможе вам оптимізувати ваш сайт для глобальної аудиторії.

Що таке відкладене завантаження?

Відкладене завантаження — це техніка, яка відкладає завантаження ресурсів (зображень, iframe, компонентів тощо), доки вони не знадобляться — зазвичай, коли вони ось-ось потраплять у видиму область екрана (viewport). Це означає, що замість завантаження всіх ресурсів одразу, браузер завантажує лише ті, що видимі користувачеві під час початкового завантаження сторінки. Коли користувач прокручує сторінку вниз, додаткові ресурси завантажуються в міру їх появи.

Уявіть, що ви пакуєте валізи для подорожі. Замість того, щоб тягнути весь свій гардероб із самого початку, ви пакуєте лише той одяг, який точно знадобиться негайно. Просуваючись у подорожі, ви розпаковуєте додаткові речі, коли вони вам потрібні. Саме так працює відкладене завантаження для веб-сайтів.

Навіщо використовувати відкладене завантаження?

Відкладене завантаження пропонує декілька значних переваг:

Відкладене завантаження зображень

Зображення часто є найбільшими ресурсами на веб-сайті, що робить їх головними кандидатами на відкладене завантаження. Ось як реалізувати відкладене завантаження для зображень:

Нативне відкладене завантаження

Сучасні браузери (Chrome, Firefox, Safari та Edge) тепер підтримують нативне відкладене завантаження за допомогою атрибута loading. Це найпростіший та найефективніший спосіб відкладеного завантаження зображень.

Щоб увімкнути нативне відкладене завантаження, просто додайте атрибут loading="lazy" до вашого тегу <img>:

<img src="image.jpg" alt="My Image" loading="lazy">

Атрибут loading може мати три значення:

Приклад:

<img src="london_bridge.jpg" alt="London Bridge" loading="lazy" width="600" height="400">
<img src="tokyo_skyline.jpg" alt="Tokyo Skyline" loading="lazy" width="600" height="400">
<img src="rio_de_janeiro.jpg" alt="Rio de Janeiro" loading="lazy" width="600" height="400">

У цьому прикладі зображення Лондонського мосту, горизонту Токіо та Ріо-де-Жанейро завантажуватимуться лише тоді, коли користувач до них доскролить. Це надзвичайно корисно, особливо якщо користувач не прокручує сторінку до самого кінця.

Відкладене завантаження за допомогою JavaScript

Для старих браузерів, які не підтримують нативне відкладене завантаження, ви можете використовувати JavaScript-бібліотеки або написати власний скрипт. Ось базовий приклад з використанням Intersection Observer API:

const images = document.querySelectorAll('img[data-src]');

const observer = new IntersectionObserver((entries, observer) => {
  entries.forEach(entry => {
    if (entry.isIntersecting) {
      const img = entry.target;
      img.src = img.dataset.src;
      img.removeAttribute('data-src');
      observer.unobserve(img);
    }
  });
});

images.forEach(img => {
  observer.observe(img);
});

Пояснення:

  1. Ми вибираємо всі елементи <img>, які мають атрибут data-src.
  2. Ми створюємо новий екземпляр IntersectionObserver. Функція зворотного виклику виконується, коли спостережуваний елемент входить у видиму область екрана або виходить з неї.
  3. Усередині функції зворотного виклику ми перебираємо entries (елементи, які перетнули видиму область).
  4. Якщо елемент перетинається (entry.isIntersecting є істинним), ми встановлюємо атрибут src зображення на значення атрибута data-src.
  5. Потім ми видаляємо атрибут data-src і припиняємо спостереження за зображенням, оскільки воно більше не потрібне.
  6. Нарешті, ми спостерігаємо за кожним зображенням за допомогою observer.observe(img).

Структура HTML:

<img data-src="image.jpg" alt="My Image">

Зверніть увагу, що фактична URL-адреса зображення розміщена в атрибуті data-src, а не в атрибуті src. Це запобігає негайному завантаженню зображення браузером.

Використання бібліотек для відкладеного завантаження

Кілька JavaScript-бібліотек можуть спростити процес відкладеного завантаження зображень. Деякі популярні варіанти:

Ці бібліотеки зазвичай надають простий API для ініціалізації відкладеного завантаження та пропонують додаткові функції, такі як зображення-заповнювачі (placeholders) та ефекти переходу.

Відкладене завантаження компонентів

Відкладене завантаження стосується не лише зображень; його також можна застосовувати до компонентів, особливо в сучасних JavaScript-фреймворках, таких як React, Angular та Vue. Це особливо корисно для великих односторінкових застосунків (SPA) з великою кількістю компонентів.

Відкладене завантаження в React

React надає вбудовану функцію React.lazy() для відкладеного завантаження компонентів. Ця функція дозволяє динамічно імпортувати компоненти, які завантажуються лише тоді, коли вони рендеряться.

import React, { Suspense } from 'react';

const MyComponent = React.lazy(() => import('./MyComponent'));

function App() {
  return (
    <Suspense fallback={<div>Завантаження...</div>}>
      <MyComponent />
    </Suspense>
  );
}

export default App;

Пояснення:

  1. Ми використовуємо React.lazy() для динамічного імпорту MyComponent. Функція import() повертає проміс, який розпізнається в модуль компонента.
  2. Ми обгортаємо MyComponent у компонент <Suspense>. Компонент Suspense дозволяє відображати резервний інтерфейс (у цьому випадку, "Завантаження...") поки компонент завантажується.

Відкладене завантаження в Angular

Angular підтримує відкладене завантаження модулів за допомогою властивості loadChildren у конфігурації маршрутизації.

const routes: Routes = [
  {
    path: 'my-module',
    loadChildren: () => import('./my-module/my-module.module').then(m => m.MyModuleModule)
  }
];

Пояснення:

  1. Ми визначаємо маршрут для шляху my-module.
  2. Ми використовуємо властивість loadChildren, щоб вказати, що MyModuleModule має бути завантажений відкладено. Функція import() динамічно імпортує модуль.
  3. Метод then() використовується для доступу до модуля та повернення класу MyModuleModule.

Відкладене завантаження у Vue.js

Vue.js підтримує відкладене завантаження компонентів за допомогою динамічних імпортів та тегу component.

<template>
  <component :is="dynamicComponent"></component>
</template>

<script>
export default {
  data() {
    return {
      dynamicComponent: null
    }
  },
  mounted() {
    import('./MyComponent.vue')
      .then(module => {
        this.dynamicComponent = module.default
      })
  }
}
</script>

Пояснення:

  1. Ми використовуємо тег <component> з атрибутом :is для динамічного рендерингу компонента.
  2. У хуці життєвого циклу mounted ми використовуємо функцію import() для динамічного імпорту MyComponent.vue.
  3. Потім ми встановлюємо властивість даних dynamicComponent на експорт за замовчуванням модуля.

Найкращі практики для відкладеного завантаження

Щоб переконатися, що відкладене завантаження реалізовано ефективно, враховуйте ці найкращі практики:

Аспекти інтернаціоналізації

При впровадженні відкладеного завантаження для глобальної аудиторії враховуйте ці фактори інтернаціоналізації:

Висновок

Відкладене завантаження — це потужна техніка для оптимізації продуктивності веб-сайту та покращення користувацького досвіду. Відкладаючи завантаження ресурсів за межами екрана, ви можете скоротити час початкового завантаження сторінки, зменшити споживання трафіку та знизити навантаження на сервер. Незалежно від того, чи створюєте ви невеликий особистий веб-сайт або великий корпоративний застосунок, відкладене завантаження повинно бути ключовою частиною вашої стратегії оптимізації продуктивності. Дотримуючись найкращих практик, викладених у цій статті, та враховуючи фактори інтернаціоналізації, ви можете забезпечити ефективність вашої реалізації відкладеного завантаження та позитивний користувацький досвід для глобальної аудиторії.

Використовуйте відкладене завантаження та відкрийте для всіх швидший, ефективніший та зручніший веб-досвід.