Suurepärase veebisaidi kasutajakogemuse pakkumiseks peame optimeerima esimese lehe esmase laadimisaja ja lehe reageerimise interaktsioonile. Mida kiiremini teie leht kasutaja sisendile reageerib, seda parem.
Reageerige 18 eesmärk oli aidata parandada interaktiivsust selliste funktsioonidega nagu selektiivne hüdratsioon koos Suspense
et muuta hüdratsioon mitteblokeerivaks ja pakkuda meile rohkem läbipaistvust selle kohta, kuidas meie arhitektuuri- valikud mõjutavad meie rakenduse kasutajakogemust ja jõudlust. React 18 parandab jõudlust ja lisab tuge Suspense
serveripoolsel renderdamisel (SSR), mis võimaldab rakenduse osi asünkroonselt teenindada, saate oma rakenduse aeglase osa mässida Suspense'i komponenti, käske Reactil aeglase komponendi laadimist edasi lükata.
Server-side rendering lets you generate HTML from React components on the server, and send that HTML to your users. SSR lets your users see the page’s content before your JavaScript bundle loads and runs, after which the JavaScript code loads and merges with the HTML, attaching event handlers – which is hüdratsioon. Erinevalt traditsioonilisest HTML-i voogedastusest ei pea see toimuma ülalt-alla järjekorras.
koos Suspense
, saate käsul React saata esmalt teiste komponentide HTML-i koos kohahoidja HTML-iga, näiteks laadimiskeerutaja. See parandab oluliselt kasutajakogemust ja kasutaja tajutavat latentsust.
Seal on kaks peamist SSR-i funktsiooni React 18 avas Suspense:
- HTML-i voogesitus serveris.
- Valikuline hüdratsioon kliendil.
Uurime React Andmete toomise lähenemisviisid koos useEffect
ja Suspense
proovige võrrelda taustaandmete toomise praktilisi lahendusi, meie puhul valime kiire ja intuitiivse peata CMS-i Kosmiline. Meie koodinäiteid saate kontrollida lingi kaudu StackBlitz.
Integratsioon Cosmic Headless CMS
Andmete toomiseks kasutame Kosmiline peata CMS on ainult taustapõhine sisuhaldussüsteem (CMS) on ainult taustapõhine sisuhaldussüsteem (CMS), mis on algusest peale üles ehitatud sisuhoidlana, mis muudab sisu juurdepääsetavaks. Cosmicu integreerimiseks ja väärtuste saamiseks peame teie projekti installima mooduli Cosmic.
npm i cosmicjs yarn add cosmicjs
Seejärel looge a tasuta Cosmicu konto ja mine Kosmiline armatuurlaud Your Bucket > Settings > API Access
ja leidke oma Bucket slug ja API lugemisvõti ning lisage need kosmilise toomise funktsiooni loomisele fetchDataByType
taotlege oma Cosmic ämbrisse ja tooge loodud kategooriate sisu Kosmiline päring tüüp categories
.
import Cosmic from 'cosmicjs'; const bucket = Cosmic().bucket({ slug: 'your_cosmic_slug', read_key: 'your_cosmic_read_key',
}); export async function fetchDataByType(objectType = 'categories') { const params = { query: { type: objectType, }, props: 'title,slug,id,metadata', sort: '-created_at', }; try { const data = await bucket.getObjects(params); return data.objects; } catch (error) { return { error }; }
}
Cosmic pakub ka võimsaid sisu modelleerimisfunktsioone, mis võimaldavad teil luua mis tahes sisu ülikiiret ja mitme kanaliga avaldamist, et saaksite luua ühe korra ja avaldada kõikjal.
Too renderdamisel
Renderdamisel toomine võrgupäring käivitatakse komponendis endas pärast ühendamist, taotlust ei käivitata enne, kui komponent renderdab. Kui te ei kirjuta puhastusfunktsiooni, mis eirab aegunud vastuseid, märkate a võistluse seisund (in React) viga, kui on tehtud kaks veidi erinevat andmepäringut ja rakendus kuvab erineva tulemuse olenevalt sellest, kumb päring esimesena täidetakse. Kui lubate oma rakenduses StrictMode'i rakenduses React 18, siis arendusrežiimis saate teada, et useEffecti kasutamine käivitatakse kaks korda, sest nüüd ühendab React teie komponendi, eemaldab ja seejärel ühendab selle uuesti, et kontrollida, kas teie kood töötab korralikult.
Parandame andmete toomise võistluse tingimuse, kasutades ära useEffect
puhastusfunktsioon. Kui saame teha mitu taotlust, kuid renderdame ainult viimase tulemuse, saame kasutada tõeväärtuslippu isMount
:
import React, { useEffect, useState } from 'react';
import Category from './components/Category';
import { fetchDataByType } from './cosmic.js'; const App = () => { const [categories, setCategories] = useState([]); const getCategories = async () => { const result = await fetchDataByType('categories'); if (result.length) { setCategories(result); } }; useEffect(() => { let isMount = true; if (isMount) { getCategories(); } return () => { isMount = false; }; }, []); return ( <div className={cn('container', styles.container)}> <div className={styles.sidebar}> <div className={styles.collections}> {categories?.map((category) => ( <Category key={category.id} info={category} /> ))} </div> </div> </div> );
}; export default App;
Lisaks, kui komponent renderdub mitu korda (nagu tavaliselt), puhastatakse eelmine efekt enne järgmise efekti käivitamist.
Sel juhul on meil endiselt võistlustingimus selles mõttes, et mitu taotlust Cosmicule saadetakse lennu ajal, kuid kasutatakse ainult viimase tulemusi.
Samuti kui Dan Abramov selgitab, Too renderdamisel tagab aeglase navigeerimise ekraanide vahel. Kui teil on vanema ja lapse komponendid mõlemad toovad sisse useEffects
, siis ei saa alamkomponent hankimist alustada enne, kui ülemkomponent on toomise lõpetanud. Seda tüüpi jõudlusprobleemid on ühelehelistes rakendustes väga levinud ja põhjustavad palju rohkem aeglust kui "liigne uuesti renderdamine" ja kui meil on keeruline rakendus mitme paralleelse päringuga, näeksime rakenduse laadimise erinevaid osi juhuslikus järjekorras. . Rakenduse loomulikum käitumine on asjade ülevalt alla renderdamine.
Renderda nagu-toomine
Lähenemisviis renderdamise järgi võimaldab meil alustada oma komponendi renderdamist kohe pärast võrgupäringu käivitamist ja me hakkame renderdama peaaegu kohe pärast võrgupäringu käivitamist.
Andmete toomise põnevus
Suspense'iga ei oota me enne renderdamise alustamist vastuse naasmist ja vähendame oma näite kogu blokeerimisaega (TBT) 106 ms-lt 56 ms-le.
Reacti põhimeeskonna samaaegsete funktsioonide komplekt, mis muudab Reactis andmete toomise lihtsamaks. Pinge is among these, and it aims to simplify managing loading states in React components. It’s a feature for managing asynchronous operations in a React app and lets you also use <Suspense>
deklaratiivselt "ootama" kõike muud, sealhulgas andmeid, ja ei pea enam ootama, kuni kogu JavaScript laaditakse, et alustada lehe osade niisutamist.
Esiteks käivitame võrgupäringu enne mis tahes komponendi renderdamist esimesel real. Peamiselt App
komponent, me mähkime mõlemad Category
ja Cards
, Main
komponendid eraldi Suspense
komponendid koos nende tagavaradega.
Kui App
paigaldatakse esimest korda, proovib see renderdada Category
ja see käivitab resourseCategories.read()
rida. Kui andmed pole veel valmis (st taotlust ei ole lahendatud), edastatakse need tagasi Suspense'ile, mis seejärel renderdab <p>Loading…</p>
. Sama asi juhtub ka Cards
ja Main
import React, { Suspense } from 'react'; const App = () => { return ( <main> <Suspense fallback={<p>Loading.....</p>}> <Cards /> </Suspense> <div> <Suspense fallback={<p>Loading.....</p>}> <Category /> </Suspense> </div> </main> );
}; export default App;
Suspense
see ei ole uus liides andmete toomiseks, kuna see töö on endiselt delegeeritud teekidele, nagu toomine või Axios, ja Suspense
tõeline ülesanne on lihtsalt öelda "näita seda koodi laadimise ajal ja näita seda, kui see on tehtud", ei midagi muud.
Mähkige oma toomisloogika wrapPromise.js
Vajame ka wrap toomise loogikat, et teha erand, kui meie komponendid laadivad andmeid või see ebaõnnestus, kuid tagastab vastuse lihtsalt pärast Promise
on edukalt lahendatud ja kui see on veel pooleli, viskab see lubaduse tagasi.
function wrapPromise(promise) { let status = 'pending'; let response; const suspender = promise.then( res => { status = 'success'; response = res.objects; }, err => { status = 'error'; response = err; }, ); const handler = { pending: () => { throw suspender; }, error: () => { throw response; }, default: () => response, }; const read = () => { const result = handler[status] ? handler[status]() : handler.default(); return result; }; return { read };
} export default wrapPromise;
Aasta lõpus wrapPromise
funktsioon kontrollib meie lubaduse olekut ja tagastab seejärel objekti, mis sisaldab read
toimivad meetodina ja see on see, millega meie Reacti komponendid lubaduse väärtuse leidmiseks suhtlevad.
Nüüd peame kosmilise kõne funktsioonid ümber mähkima wrapPromise
:
export function fetchDataByType(objectType = 'categories') { const params = { query: { type: objectType, }, props: 'title,slug,id,metadata', sort: '-created_at', }; const data = bucket.getObjects(params); return wrapPromise(data);
}
Ülaltoodu on vaid abstraktsioon kosmilise toomise funktsioonide jaoks Suspense
ja too üks kord.
Lugege komponendis olevaid andmeid
Kui kõik on asjade toomise poolel kokku pandud, tahame seda oma komponendis kasutada. Mis siis juhtub, kui nimetame komponenti read()
funktsioon hakkab tegema erandeid, kuni see on täielikult lahendatud, ja kui see juhtub, jätkab see ülejäänud koodiga, meie puhul selle renderdamisega.
import React from 'react';
import { fetchDataByType } from '../../cosmic.js';
import styles from '../../styles/Collection.module.scss'; const resourseCategories = fetchDataByType(); const Category = () => { const categories = resourseCategories.read(); const renderCategories = categories?.map((info) => ( <div key={info?.id} className={styles.user}> <div className={styles.avatar}> <img className={styles.image} src={info?.metadata?.image?.imgix_url} alt="Avatar" /> </div> <div className={styles.description}> <div className={styles.name}>{info?.metadata?.title}</div> <div className={styles.money} dangerouslySetInnerHTML={{ __html: info?.content }} /> </div> </div> )); return <div className={styles.collections}>{renderCategories}</div>;
}; export default Category;
Põhikomponent
Suspense
annab Reactile juurdepääsu meie rakenduste ootelolekutele ja seetõttu teab React, et toimub võrgukõne, mis võimaldab meil ooteajal deklaratiivselt renderdada varukomponendi.
import React, { Suspense } from 'react';
import Cards from './components/Cards';
import Category from './components/Category';
import Main from './components/Main';
import styles from './styles/Collection.module.scss'; const App = () => { return ( <div className={styles.wrapper}> <div className={cn('section-pb', styles.section)}> <div className={cn('container', styles.container)}> <div className={styles.row}> <Suspense fallback={<p>Loading.....</p>}> <Main /> <Cards /> </Suspense> </div> <div className={styles.sidebar}> <div className={styles.info}> Collections <span className={styles.smile} role="img" aria-label="fire"> 🔥 </span> </div> <Suspense fallback={<p>Loading.....</p>}> <Category /> </Suspense> </div> </div> </div> </div> );
}; export default App;
Järeldus
Nüüd, kus Suspense
, saate jagada oma rakenduse väikesteks eraldiseisvateks üksusteks, mida saab ilma ülejäänud rakenduseta renderdada, võimaldades sisu kasutajale kättesaadavaks saada veelgi kiiremini kui varem. Uurisime võrdlemiseks erinevaid andmete toomise lähenemisviise.
Proovige seda oma projektis ja andke meile tagasisidet. Võite alustada Kosmiline kiireks CMS-iks, millega andmete toomist testida Suspense
veebisaitide ja rakenduste jaoks.
- SEO-põhise sisu ja PR-levi. Võimenduge juba täna.
- Platoblockchain. Web3 metaversiooni intelligentsus. Täiustatud teadmised. Juurdepääs siia.
- Allikas: https://www.codementor.io/nairage/react-18-suspense-fetch-data-from-a-headless-cms-1wh1armfwa
- a
- MEIST
- üle
- juurdepääs
- juurdepääsetav
- Lisab
- ADEelis
- mõjutada
- pärast
- Eesmärgid
- Materjal: BPA ja flataatide vaba plastik
- Lubades
- võimaldab
- vahel
- ja
- API
- app
- taotlus
- rakendused
- lähenemisviisid
- apps
- saadaval
- avatar
- Axios
- tagasi
- Back-end
- Taustaprogramm
- sest
- enne
- Parem
- vahel
- blokeerimine
- põhi
- Murdma
- Bug
- ehitatud
- Kimp
- helistama
- Saab
- Kaardid
- juhul
- kategooriad
- Kategooria
- Põhjus
- kontrollima
- laps
- valikuid
- Vali
- klient
- Cms
- kood
- Kollektsioonid
- Tulema
- ühine
- võrdlema
- võrdlus
- Lõpetab
- keeruline
- komponent
- komponendid
- järeldus
- konkurent
- seisund
- sisu
- jätkama
- tuum
- looma
- loodud
- loomine
- andmed
- viivitus
- tarnima
- Olenevalt
- kavandatud
- & Tarkvaraarendus
- erinev
- Näidikute
- Ei tee
- teeme
- Ära
- lihtsam
- mõju
- võimaldama
- viga
- Isegi
- sündmus
- kõik
- näide
- näited
- erand
- kogemus
- Selgitab
- uurima
- uurida
- Ebaõnnestunud
- KIIRE
- kiiremini
- tunnusjoon
- FUNKTSIOONID
- tagasiside
- leidma
- Tulekahju
- esimene
- Esimest korda
- Määrama
- Alates
- täielikult
- funktsioon
- funktsioonid
- tekitama
- saama
- Andma
- annab
- Go
- suur
- juhtuda
- juhtub
- aitama
- Kuidas
- HTML
- HTTPS
- pilt
- kohe
- parandama
- parandusi
- in
- Kaasa arvatud
- esialgne
- sisend
- paigaldama
- integreerima
- integratsioon
- suhelda
- suhtlemist
- interaktiivsus
- Interface
- intuitiivne
- IT
- ise
- JavaScript
- töö
- Võti
- Laps
- viimane
- Hilinemine
- Pikkus
- Lets
- raamatukogud
- joon
- LINK
- koormus
- laadimine
- saadetised
- enam
- Partii
- tehtud
- põhiline
- peamine
- tegema
- TEEB
- Tegemine
- juhtimine
- juhtiv
- ühineb
- Metaandmed
- meetod
- viis
- moodul
- rohkem
- MOUNT
- mitmekordne
- Natural
- NAVIGATSIOON
- Vajadus
- võrk
- Uus
- järgmine
- objekt
- esemeid
- Hästi
- ONE
- Operations
- optimeerima
- et
- Muu
- enda
- Parallel
- osa
- osad
- jõudlus
- kohatäide
- Platon
- Platoni andmete intelligentsus
- PlatoData
- võimalik
- võimas
- Praktiline
- ilus
- eelmine
- probleeme
- projekt
- lubadus
- korralikult
- anda
- annab
- avaldama
- Kirjastamine
- Kiire
- Rass
- juhuslik
- RE
- Reageerima
- Lugenud
- valmis
- reaalne
- realiseerimisel
- vähendama
- rendering
- muudab
- Hoidla
- taotleda
- Taotlusi
- lahendatud
- vastus
- REST
- kaasa
- Tulemused
- tagasipöördumine
- sama
- ekraanid
- tunne
- teenindavad
- komplekt
- seaded
- mitu
- näitama
- märgatavalt
- lihtsustama
- lihtsalt
- veidi erinev
- aeglane
- väike
- So
- Lahendused
- algus
- alustatud
- riik
- Ühendriigid
- olek
- Veel
- streaming
- edu
- Edukalt
- toetama
- süsteem
- võtmine
- meeskond
- test
- .
- oma
- asi
- asjad
- aeg
- korda
- Kapslid
- et
- ülemine
- Summa
- traditsiooniline
- läbipaistvus
- vallandada
- vallandas
- käivitamine
- liigid
- tüüpiliselt
- üksused
- us
- kasutama
- Kasutaja
- User Experience
- Kasutajad
- ux
- väärtus
- Väärtused
- eri
- ootama
- ootamine
- webp
- veebisait
- veebilehed
- M
- Mis on
- mis
- kuigi
- will
- jooksul
- ilma
- töö
- oleks
- pakkima
- Pakendatud
- kirjutama
- XML
- Sinu
- youtube
- sephyrnet