Komponent Lazy Image przy użyciu API Intersection Observer w Vue.js

Wstęp

Kluczowym aspektem tworzenia efektywnej strony internetowej jest optymalizacja jej wydajności, co bezpośrednio przekłada się na satysfakcję użytkowników. Jednym ze sposobów na zwiększenie szybkości działania serwisu jest zastosowanie techniki „lazy loading” obrazów. Ta metoda polega na odroczeniu ładowania grafik do momentu, gdy staną się widoczne w oknie przeglądarki. Dzięki temu strona wczytuje się szybciej, a użytkownik nie musi pobierać zbędnych danych, co jest szczególnie istotne przy korzystaniu z urządzeń mobilnych i wolniejszych połączeń internetowych.

API Intersection Observer oferuje natywne wsparcie dla leniwego ładowania obrazów w nowoczesnych przeglądarkach. W tym poradniku pokażemy, jak stworzyć komponent Lazy Image w środowisku Vue.js, który wykorzystuje to API. Umożliwi to łatwe wdrożenie leniwego ładowania obrazów w Twojej aplikacji webowej.

Tworzenie komponentu Lazy Image

2.1. Proces tworzenia komponentu

Aby stworzyć komponent Lazy Image, wykonaj kroki opisane poniżej:

  1. W katalogu przeznaczonym na komponenty utwórz nowy plik z rozszerzeniem .vue.
  2. Nazwij ten plik LazyImage.vue.
  3. Wklej następujący kod do nowo utworzonego pliku:

<template>
<img
:src=”imageSrc”
:width=”width”
:height=”height”
:alt=”alt”
:style=”{ display: isVisible ? 'inline’ : 'none’ }”
/>
</template>

<script>
import { ref, onMounted, onUnmounted } from 'vue’
import { useIntersectionObserver } from '@vueuse/core’

export default {
props: {
imageSrc: String,
width: String,
height: String,
alt: String
},
setup(props, { emit }) {
const isVisible = ref(false)
const imgRef = ref(null);

const { observe, unobserve } = useIntersectionObserver(
imgRef,
([{ isIntersecting }]) => {
if (isIntersecting) {
isVisible.value = true;
unobserve(imgRef)
emit(’load’);
}
}
)

onMounted(() => {
observe(imgRef)
});

onUnmounted(() => {
unobserve(imgRef)
});

return {
isVisible,
imgRef
}
}
}
</script>

<style>
img {
object-fit: contain;
}
</style>

2.2. Analiza kodu

  • template: Ten fragment kodu odpowiada za strukturę wizualną komponentu. Zawiera element img, który służy do wyświetlania obrazu. Jego widoczność jest dynamicznie kontrolowana za pomocą stanu isVisible, początkowo ustawionego na false.
  • script: Sekcja script wykorzystuje funkcję ref z Vue.js do utworzenia reaktywnej zmiennej isVisible oraz imgRef do przechowywania referencji do elementu `img`. Dodatkowo wykorzystywana jest funkcja useIntersectionObserver z biblioteki @vueuse/core. Pozwala ona na monitorowanie czy element znajduje się w obszarze widocznym. Po wykryciu przecięcia elementu z widocznym obszarem, zmienna `isVisible` jest ustawiana na `true`, a obserwator wyłączany.
  • style: Arkusz stylów zawiera regułę ustawiającą właściwość display elementu img na inline, gdy isVisible jest ustawione na true.

Wdrażanie komponentu Lazy Image

3.1. Importowanie komponentu

Aby wykorzystać komponent Lazy Image w innym komponencie Vue.js, należy go najpierw zaimportować. W tym celu na początku pliku .vue dodaj poniższą instrukcję:

javascript
import LazyImage from '@/components/LazyImage.vue'

3.2. Wykorzystanie komponentu

Komponent Lazy Image można teraz umieścić w szablonie innego komponentu. Poniżej znajduje się przykład:

<template>
<LazyImage v-for=”(image, index) in images”
:key=”index”
:imageSrc=”image.src”
:width=”image.width”
:height=”image.height”
:alt=”image.alt”
@load=”onImageLoad(index)”
/>
</template>

<script>
import { ref } from 'vue’
import LazyImage from '@/components/LazyImage.vue’

export default {
components: {
LazyImage
},
setup() {
const images = ref([
{
src: 'image1.jpg’,
width: '200px’,
height: '200px’,
alt: 'Image 1′
},
{
src: 'image2.jpg’,
width: '300px’,
height: '250px’,
alt: 'Image 2′
}

// …
])

const onImageLoad = (index) => {
console.log(`Obrazek o indeksie ${index} został załadowany`);
};

return {
images,
onImageLoad
}
}
}
</script>

W powyższym przykładzie komponent Lazy Image jest używany w pętli dla każdego obrazu w tablicy images. Każdy z tych obrazów ma przypisane odpowiednie wartości właściwości imageSrc, width, height i alt. Dodatkowo dodany jest nasłuch na zdarzenie 'load’, które jest emitowane po załadowaniu obrazka.

Zalety leniwego ładowania obrazów

Leniwe ładowanie obrazów przynosi szereg korzyści, w tym:

  • Skrócenie czasu wczytywania strony: Dzięki opóźnieniu ładowania obrazów, które nie są widoczne na ekranie, strona wczytuje się szybciej, co poprawia komfort użytkownika.
  • Oszczędność transferu danych: Pobieranie tylko widocznych obrazów redukuje zużycie transferu, co jest szczególnie istotne dla użytkowników z wolniejszym połączeniem internetowym lub korzystających z limitowanych pakietów danych.
  • Zwiększenie wydajności: Leniwe ładowanie obrazów odciąża system, co skutkuje płynniejszym działaniem aplikacji.
  • Lepsze doświadczenie użytkownika: Szybko działająca strona z mniejszym zużyciem danych gwarantuje lepsze wrażenia użytkownika, co przekłada się na większe zaangażowanie i satysfakcję.

Obsługiwane przeglądarki

API Intersection Observer jest standardem obsługiwanym przez większość współczesnych przeglądarek, takich jak:

  • Chrome
  • Firefox
  • Safari
  • Edge
  • Opera

W przypadku potrzeby obsługi starszych przeglądarek, które nie mają wbudowanego wsparcia dla API Intersection Observer, można skorzystać z biblioteki polyfill, np. intersection-observer.

Podsumowanie

Leniwe ładowanie obrazów z użyciem API Intersection Observer w Vue.js to efektywny sposób na poprawę wydajności stron internetowych. Zaprezentowany w tym artykule komponent Lazy Image znacznie ułatwia implementację tej techniki w aplikacjach Vue.js. Wykorzystując leniwe ładowanie, można znacząco skrócić czas ładowania strony, zmniejszyć zużycie transferu i zapewnić lepsze wrażenia użytkownikom.

Najczęściej zadawane pytania

1. Jakie są korzyści z leniwego ładowania obrazów?

Leniwe ładowanie obrazów redukuje czas ładowania strony, minimalizuje zużycie danych, poprawia ogólną wydajność i zwiększa satysfakcję użytkownika.

2. Czym jest API Intersection Observer?

API Intersection Observer to wbudowane w przeglądarkę narzędzie do śledzenia przecięcia elementu z widocznym obszarem. Jest wykorzystywane do leniwego ładowania, gdy dany obraz znajdzie się w polu widzenia użytkownika.

3. W jaki sposób używać komponentu Lazy Image w Vue.js?

Aby skorzystać z komponentu Lazy Image, należy go zaimportować w innym komponencie i użyć go w szablonie, tak jak przedstawiono w tym artykule.

4. Czy komponent Lazy Image jest kompatybilny ze wszystkimi przeglądarkami?

Komponent Lazy Image działa bez problemu w większości współczesnych przeglądarek. Jeśli konieczne jest wsparcie starszych przeglądarek, można dodać bibliotekę typu polyfill.

5. Jak zmienić wygląd obrazów ładowanych leniwie?

Stylizację leniwie ładowanych obrazów można dostosować poprzez modyfikację stylów CSS w komponencie Lazy Image.

6. Czy istnieją alternatywy dla API Intersection Observer?

Alternatywą może być użycie zdarzenia scroll, jednak API Intersection Observer jest bardziej efektywne i polecane.

7. Gdzie znaleźć dodatkowe informacje na temat leniwego ładowania?

Poniżej zamieszczono odnośniki do przydatnych źródeł:

8. Czy komponent Lazy Image działa z Vue 3?

Tak, komponent Lazy Image jest w pełni kompatybilny z Vue 3.