Hrvatski

Otključajte brže početno učitavanje i poboljšane performanse za svoje React aplikacije pomoću lazy loadinga i podjele koda komponenti.

React Lazy Loading: Podjela koda komponenti za optimizirane performanse

U današnjem brzom digitalnom svijetu, performanse web stranica su od najveće važnosti. Korisnici očekuju trenutno zadovoljstvo, a sporo učitavanje može dovesti do frustracije, napuštenih košarica i negativne slike o brendu. Za React aplikacije, optimizacija performansi je ključna za pružanje glatkog i angažirajućeg korisničkog iskustva. Jedna moćna tehnika za postizanje ovoga je lazy loading uz podjelu koda komponenti.

Što su Lazy Loading i Podjela koda?

Lazy loading je tehnika kojom se resursi, kao što su slike, skripte i komponente, učitavaju samo kada su potrebni, umjesto da se učitaju odjednom tijekom početnog učitavanja stranice. Ovo značajno smanjuje količinu podataka koju je potrebno preuzeti i parsirati unaprijed, što rezultira bržim početnim vremenima učitavanja i poboljšanim percipiranim performansama.

Podjela koda je proces dijeljenja koda vaše aplikacije na manje, lakše upravljive dijelove (ili pakete). Ovo omogućuje pregledniku da preuzme samo kod potreban za početni prikaz, odgađajući učitavanje ostalog koda dok se zapravo ne zatraži. Lazy loading koristi podjelu koda za učitavanje specifičnih komponenti samo kada će se one renderirati.

Zašto koristiti Lazy Loading i Podjelu koda u Reactu?

Evo zašto biste trebali razmotriti implementaciju lazy loadinga i podjele koda u svoje React projekte:

Kako implementirati Lazy Loading u Reactu

React pruža ugrađenu podršku za lazy loading pomoću komponenti React.lazy i Suspense. Evo korak-po-korak vodiča:

1. Korištenje React.lazy()

React.lazy() vam omogućuje dinamičko uvoženje komponenti, učinkovito dijeleći vaš kod na odvojene pakete. Prihvaća funkciju koja poziva import(), a koja vraća Promise koji se rješava s komponentom.


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

U ovom primjeru, MyComponent će se učitati tek kada bude spreman za renderiranje.

2. Omotavanje s <Suspense>

Budući da React.lazy() koristi dinamičko uvoženje, koje je asinkrono, morate omotati lijeno učitanu komponentu s <Suspense> komponentom. <Suspense> komponenta omogućuje prikazivanje rezervnog korisničkog sučelja (npr. indikatora učitavanja) dok se komponenta učitava.


import React, { Suspense } from 'react';

function MyPage() {
  return (
    Učitavanje...
}> ); }

U ovom primjeru, prikazat će se poruka Učitavanje... dok se MyComponent učitava. Kada se komponenta učita, zamijenit će rezervni prikaz.

3. Praktični primjer: Lazy loading velike galerije slika

Razmotrimo scenarij u kojem imate veliku galeriju slika. Učitavanje svih slika odjednom može značajno utjecati na performanse. Evo kako možete koristiti lazy loading za slike pomoću React.lazy() i <Suspense>:


import React, { Suspense } from 'react';

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

function ImageGallery() {
  const images = [
    { id: 1, src: 'image1.jpg', alt: 'Slika 1' },
    { id: 2, src: 'image2.jpg', alt: 'Slika 2' },
    { id: 3, src: 'image3.jpg', alt: 'Slika 3' },
    // ... više slika
  ];

  return (
    
{images.map(image => ( Učitavanje slike...
}> ))} ); } export default ImageGallery;

I Image.js komponenta:


import React from 'react';

const Image = ({ src, alt }) => {
  return {alt};
};

export default Image;

U ovom primjeru, svaka slika je omotana s <Suspense> komponentom, tako da će se prikazati poruka o učitavanju za svaku sliku dok se ona učitava. Ovo sprječava blokiranje cijele stranice dok se slike preuzimaju.

Napredne tehnike i razmatranja

1. Granice grešaka (Error Boundaries)

Kada koristite lazy loading, važno je obraditi potencijalne greške koje se mogu pojaviti tijekom procesa učitavanja. Granice grešaka mogu se koristiti za hvatanje tih grešaka i prikazivanje rezervnog korisničkog sučelja. Možete stvoriti komponentu granice grešaka na sljedeći način:


import React, { Component } from 'react';

class ErrorBoundary extends Component {
  constructor(props) {
    super(props);
    this.state = { hasError: false };
  }

  static getDerivedStateFromError(error) {
    // Ažuriraj stanje kako bi sljedeći render prikazao rezervni prikaz.
    return { hasError: true };
  }

  componentDidCatch(error, errorInfo) {
    // Također možete prijaviti grešku servisu za izvješćivanje o greškama
    console.error(error, errorInfo);
  }

  render() {
    if (this.state.hasError) {
      // Možete renderirati bilo koji prilagođeni rezervni prikaz
      return 

Nešto je pošlo po zlu.

; } return this.props.children; } } export default ErrorBoundary;

Zatim omotajte <Suspense> komponentu s <ErrorBoundary>:



  Učitavanje...}>
    
  


Ako se dogodi greška tijekom učitavanja MyComponent, <ErrorBoundary> će je uhvatiti i prikazati rezervni prikaz.

2. Server-Side Rendering (SSR) i Lazy Loading

Lazy loading se također može koristiti u kombinaciji sa server-side renderingom (SSR) kako bi se poboljšalo početno vrijeme učitavanja vaše aplikacije. Međutim, to zahtijeva dodatnu konfiguraciju. Morat ćete osigurati da server može ispravno obraditi dinamičke uvoze i da su lijeno učitane komponente pravilno hidratizirane na strani klijenta.

Alati poput Next.js i Gatsby.js pružaju ugrađenu podršku za lazy loading i podjelu koda u SSR okruženjima, čineći proces mnogo lakšim.

3. Preloading lijeno učitanih komponenti

U nekim slučajevima, možda ćete htjeti pred-učitati lijeno učitanu komponentu prije nego što se ona zapravo zatreba. Ovo može biti korisno za komponente koje će se vjerojatno uskoro renderirati, poput komponenti koje se nalaze ispod vidljivog dijela stranice, ali će vjerojatno biti pomaknute u vidno polje. Možete pred-učitati komponentu pozivanjem import() funkcije ručno:


import('./MyComponent'); // Pred-učitaj MyComponent

Ovo će započeti učitavanje komponente u pozadini, tako da će biti dostupna brže kada se zapravo renderira.

4. Dinamičko uvoženje s Webpack Magic Comments

Webpackovi "magic comments" pružaju način za prilagođavanje naziva generiranih dijelova koda. Ovo može biti korisno za otklanjanje grešaka i analizu strukture paketa vaše aplikacije. Na primjer:


const MyComponent = React.lazy(() => import(/* webpackChunkName: "my-component" */ './MyComponent'));

Ovo će stvoriti dio koda nazvan "my-component.js" (ili slično) umjesto generičkog naziva.

5. Izbjegavanje uobičajenih grešaka

Primjeri iz stvarnog svijeta i slučajevi upotrebe

Lazy loading se može primijeniti u širokom rasponu scenarija za poboljšanje performansi React aplikacija. Evo nekoliko primjera:

Primjer: Međunarodna e-trgovina

Zamislite e-trgovinu koja prodaje proizvode globalno. Različite zemlje mogu imati različite valute, jezike i kataloge proizvoda. Umjesto učitavanja svih podataka za svaku zemlju unaprijed, možete koristiti lazy loading za učitavanje podataka specifičnih za lokaciju korisnika tek kada posjete stranicu.


const CurrencyFormatter = React.lazy(() => import(`./CurrencyFormatter/${userCountry}`))
const ProductCatalog = React.lazy(() => import(`./ProductCatalog/${userCountry}`))

function ECommerceSite() {
  const userCountry = getUserCountry(); // Funkcija za određivanje zemlje korisnika

  return (
    Učitavanje sadržaja za vašu regiju...}>
      
      
    
  );
}

Zaključak

Lazy loading i podjela koda komponenti moćne su tehnike za optimizaciju performansi React aplikacija. Učitavanjem komponenti samo kada su potrebne, možete značajno smanjiti početno vrijeme učitavanja, poboljšati korisničko iskustvo i poboljšati svoj SEO. Reactove ugrađene React.lazy() i <Suspense> komponente olakšavaju implementaciju lazy loadinga u vaše projekte. Prihvatite ove tehnike kako biste izgradili brže, responzivnije i angažiranije web aplikacije za globalnu publiku.

Ne zaboravite uvijek uzeti u obzir korisničko iskustvo prilikom implementacije lazy loadinga. Pružite informativne rezervne prikaze, elegantno obradite potencijalne greške i pažljivo analizirajte performanse svoje aplikacije kako biste osigurali da postižete željene rezultate. Nemojte se bojati eksperimentirati s različitim pristupima i pronaći najbolje rješenje za svoje specifične potrebe.