Oleme fännid Kohandatud elemendid siinkandis. Nende disain teeb need eriti vastuvõtlik laisale laadimisele, mis võib olla tulemuslikkuse õnnistuseks.
Inspireeritud kolleegi oma katseid, asusin hiljuti kirjutama lihtsat automaatset laadijat: kui DOM-is kuvatakse kohandatud element, tahame laadida vastava teostuse, kui see pole veel saadaval. Seejärel hoolitseb brauser selliste elementide uuendamise eest sealt edasi.
Tõenäoliselt pole teil seda kõike vaja; tavaliselt on lihtsam lähenemine. Tahtlikul kasutamisel võivad siin näidatud tehnikad teie tööriistakomplekti siiski kasulikuks lisada.
Järjepidevuse huvides soovime, et meie automaatlaadur oleks ka kohandatud element – mis tähendab ka seda, et saame seda hõlpsasti HTML-i kaudu konfigureerida. Kuid kõigepealt tuvastame samm-sammult need lahendamata kohandatud elemendid.
class AutoLoader extends HTMLElement { connectedCallback() { let scope = this.parentNode; this.discover(scope); }
}
customElements.define("ce-autoloader", AutoLoader);
Eeldusel, et oleme selle mooduli juba ette laadinud (kasutades async
on ideaalne), võime loobuda a <ce-autoloader>
element sisse <body>
meie dokumendist. See käivitab kohe kõigi alamelementide avastamisprotsessi <body>
, mis moodustab nüüd meie juurelemendi. Võiksime avastamist piirata oma dokumendi alampuuga, lisades <ce-autoloader>
selle asemel vastavale konteinerielemendile – meil võib olla isegi mitu eksemplari erinevate alampuude jaoks.
Muidugi peame selle veel ellu viima discover
meetod (osana AutoLoader
klass ülal):
discover(scope) { let candidates = [scope, ...scope.querySelectorAll("*")]; for(let el of candidates) { let tag = el.localName; if(tag.includes("-") && !customElements.get(tag)) { this.load(tag); } }
}
Siin kontrollime oma juurelementi koos iga järeltulijaga (*
). Kui see on kohandatud element – nagu näitavad sidekriipsuga sildid –, kuid pole veel täiendatud, proovime laadida vastava definitsiooni. DOM-i päringute tegemine sel viisil võib olla kulukas, seega peaksime olema veidi ettevaatlikud. Peamise lõime koormust saame leevendada, lükates selle töö edasi:
connectedCallback() { let scope = this.parentNode; requestIdleCallback(() => { this.discover(scope); });
}
requestIdleCallback
pole veel üldiselt toetatud, kuid me saame seda kasutada requestAnimationFrame
tagavaraks:
let defer = window.requestIdleCallback || requestAnimationFrame; class AutoLoader extends HTMLElement { connectedCallback() { let scope = this.parentNode; defer(() => { this.discover(scope); }); } // ...
}
Nüüd saame liikuda edasi puuduva elluviimise juurde load
meetod dünaamiliseks süstimiseks a <script>
Element:
load(tag) { let el = document.createElement("script"); let res = new Promise((resolve, reject) => { el.addEventListener("load", ev => { resolve(null); }); el.addEventListener("error", ev => { reject(new Error("failed to locate custom-element definition")); }); }); el.src = this.elementURL(tag); document.head.appendChild(el); return res;
} elementURL(tag) { return `${this.rootDir}/${tag}.js`;
}
Pange tähele kõvakodeeritud tava elementURL
. src
atribuudi URL eeldab, et seal on kataloog, kus asuvad kõik kohandatud elementide määratlused (nt <my-widget>
→ /components/my-widget.js
). Võiksime välja mõelda keerukamaid strateegiaid, kuid see on meie eesmärkide jaoks piisavalt hea. Selle URL-i eraldamine eraldi meetodile võimaldab vajadusel projektipõhist alamklassi liigitada:
class FancyLoader extends AutoLoader { elementURL(tag) { // fancy logic }
}
Igal juhul pange tähele, et me toetume sellele this.rootDir
. Siin tulebki sisse eelmainitud konfigureeritavus. Lisame vastava getteri:
get rootDir() { let uri = this.getAttribute("root-dir"); if(!uri) { throw new Error("cannot auto-load custom elements: missing `root-dir`"); } if(uri.endsWith("/")) { // remove trailing slash return uri.substring(0, uri.length - 1); } return uri;
}
Sa võid mõelda observedAttributes
nüüd, aga see ei tee asja tegelikult lihtsamaks. Lisaks värskendamine root-dir
käitusajal tundub midagi, mida me kunagi ei vaja.
Nüüd saame ja peame oma elementide kataloogi konfigureerima: <ce-autoloader root-dir="/components">
.
Sellega saab meie automaatlaadur oma tööd teha. Välja arvatud see, et see töötab ainult üks kord, elementide puhul, mis on automaatse laadija lähtestamise ajal juba olemas. Tõenäoliselt tahame arvestada ka dünaamiliselt lisatud elementidega. See on koht MutationObserver
mängu tuleb:
connectedCallback() { let scope = this.parentNode; defer(() => { this.discover(scope); }); let observer = this._observer = new MutationObserver(mutations => { for(let { addedNodes } of mutations) { for(let node of addedNodes) { defer(() => { this.discover(node); }); } } }); observer.observe(scope, { subtree: true, childList: true });
} disconnectedCallback() { this._observer.disconnect();
}
Nii teavitab brauser meid iga kord, kui DOM-i - või õigemini meie vastavasse alampuusse - ilmub uus element, mida me seejärel kasutame avastamisprotsessi taaskäivitamiseks. (Võite vastu vaielda, et me leiutame siin kohandatud elemente uuesti, ja teil on õigus.)
Meie automaatlaadur on nüüd täielikult töökorras. Tulevased täiustused võivad uurida võimalikke võistlustingimusi ja uurida optimeerimisi. Kuid on tõenäoline, et see on enamiku stsenaariumide jaoks piisavalt hea. Andke mulle kommentaarides teada, kui teil on teistsugune lähenemine ja saame märkmeid võrrelda!
- SEO-põhise sisu ja PR-levi. Võimenduge juba täna.
- Platoblockchain. Web3 metaversiooni intelligentsus. Täiustatud teadmised. Juurdepääs siia.
- Allikas: https://css-tricks.com/an-approach-to-lazy-loading-custom-elements/
- 1
- a
- MEIST
- üle
- konto
- tegelikult
- lisatud
- lisamine
- Materjal: BPA ja flataatide vaba plastik
- leevendada
- võimaldab
- juba
- ja
- lähenemine
- vaielda
- ümber
- saadaval
- brauseri
- kandidaadid
- ei saa
- mis
- ettevaatlik
- vastuolu
- kontrollima
- laps
- klass
- Tulema
- kommentaarid
- võrdlema
- Tingimused
- Konteiner
- Konventsioon
- Vastav
- võiks
- kursus
- tava
- Disain
- erinev
- avastus
- dokument
- Ei tee
- DOM
- Drop
- dünaamiliselt
- lihtsam
- kergesti
- Töötage välja
- elemendid
- piisavalt
- viga
- Eeter (ETH)
- EV
- Isegi
- Iga
- Välja arvatud
- kallis
- Ebaõnnestunud
- fännid
- esimene
- Alates
- täielikult
- funktsionaalne
- tulevik
- läheb
- hea
- juhataja
- siin
- HTML
- HTTPS
- ideaalne
- identifitseerima
- kohe
- rakendada
- täitmine
- rakendamisel
- in
- selle asemel
- uurima
- IT
- JavaScript
- töö
- Laps
- Teadma
- Pikkus
- LIMIT
- vähe
- koormus
- laadimine
- Vaata
- põhiline
- tegema
- TEEB
- vahendid
- meetod
- võib
- puuduvad
- moodul
- rohkem
- kõige
- liikuma
- Mozilla
- mitmekordne
- Vajadus
- vaja
- Uus
- sõlme
- osa
- jõudlus
- Platon
- Platoni andmete intelligentsus
- PlatoData
- mängima
- pluss
- potentsiaal
- tõenäoliselt
- protsess
- eesmärkidel
- Rass
- hiljuti
- kõrvaldama
- need
- tagasipöördumine
- juur
- stsenaariumid
- ulatus
- tundub
- eri
- komplekt
- peaks
- näidatud
- lihtne
- ühekordne
- So
- midagi
- algus
- Samm
- Veel
- strateegiad
- selline
- Toetatud
- TAG
- võtab
- tehnikat
- .
- oma
- asjad
- Mõtlemine
- et
- tõsi
- ajakohastamine
- täiendatud
- URI
- URL
- us
- kasutama
- tavaliselt
- kaudu
- mis
- will
- Töö
- töötab
- kirjutamine
- Sinu
- sephyrnet