Olemme faneja Mukautetut elementit täällä päin. Niiden suunnittelu tekee niistä soveltuu erityisesti laiskalle lastaukselle, mikä voi olla siunaus suorituskyvylle.
Innoittamana kollegan kokeiluissa, ryhdyin äskettäin kirjoittamaan yksinkertaista automaattista latausohjelmaa: Aina kun mukautettu elementti ilmestyy DOM:iin, haluamme ladata vastaavan toteutuksen, jos se ei ole vielä saatavilla. Selain huolehtii sitten tällaisten elementtien päivittämisestä sieltä eteenpäin.
Todennäköisesti et tarvitse kaikkea tätä; yleensä on yksinkertaisempi tapa. Tässä esitetyt tekniikat voivat olla tarkoituksella käytettynä hyödyllinen lisä työkaluvalikoimaasi.
Johdonmukaisuuden vuoksi haluamme, että automaattinen latausohjelmamme on myös mukautettu elementti – mikä tarkoittaa myös, että voimme määrittää sen helposti HTML:n kautta. Mutta ensin tunnistetaan nämä ratkaisemattomat mukautetut elementit vaihe vaiheelta:
class AutoLoader extends HTMLElement { connectedCallback() { let scope = this.parentNode; this.discover(scope); }
}
customElements.define("ce-autoloader", AutoLoader);
Olettaen, että olemme ladanneet tämän moduulin etukäteen (käyttäen async
on ihanteellinen), voimme pudottaa a <ce-autoloader>
elementti osaksi <body>
asiakirjastamme. Tämä käynnistää välittömästi kaikkien alielementtien etsintäprosessin <body>
, joka nyt muodostaa juurielementtimme. Voisimme rajoittaa löytämisen asiakirjamme alipuuhun lisäämällä <ce-autoloader>
sen sijaan vastaavaan säiliöelementtiin – meillä voi jopa olla useita esiintymiä eri alipuille.
Tietysti meidän on vielä pantava se täytäntöön discover
menetelmä (osana AutoLoader
luokka yllä):
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); } }
}
Täällä tarkistamme juurielementtimme jokaisen yksittäisen jälkeläisen (*
). Jos se on mukautettu elementti – kuten tavutustunnisteet osoittavat – mutta sitä ei ole vielä päivitetty, yritämme ladata vastaavan määritelmän. DOM-kyselyn tekeminen tällä tavalla voi olla kallista, joten meidän tulee olla hieman varovaisia. Voimme keventää pääsäikeen kuormitusta lykkäämällä tätä työtä:
connectedCallback() { let scope = this.parentNode; requestIdleCallback(() => { this.discover(scope); });
}
requestIdleCallback
ei ole vielä yleisesti tuettu, mutta voimme käyttää requestAnimationFrame
varapuheenvuorona:
let defer = window.requestIdleCallback || requestAnimationFrame; class AutoLoader extends HTMLElement { connectedCallback() { let scope = this.parentNode; defer(() => { this.discover(scope); }); } // ...
}
Nyt voimme siirtyä puuttuvan toteuttamiseen load
menetelmä injektoida dynaamisesti a <script>
elementti:
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`;
}
Huomaa kovakoodattu käytäntö elementURL
. src
attribuutin URL olettaa, että siellä on hakemisto, jossa kaikki mukautetun elementin määritelmät sijaitsevat (esim <my-widget>
→ /components/my-widget.js
). Voisimme keksiä monimutkaisempia strategioita, mutta tämä riittää tarkoitukseemme. Tämän URL-osoitteen siirtäminen erilliseen menetelmään mahdollistaa projektikohtaisen alaluokituksen tarvittaessa:
class FancyLoader extends AutoLoader { elementURL(tag) { // fancy logic }
}
Joka tapauksessa huomaa, että luotamme siihen this.rootDir
. Tässä tulee esiin edellä mainittu konfiguroitavuus. Lisätään vastaava 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;
}
Saatat ajatella observedAttributes
nyt, mutta se ei todellakaan tee asioista helpompaa. Plus päivitys root-dir
ajon aikana näyttää siltä, mitä emme koskaan tarvitse.
Nyt voimme – ja meidän täytyy – määrittää elementtihakemistomme: <ce-autoloader root-dir="/components">
.
Tämän ansiosta automaattikuormaajamme voi tehdä työnsä. Paitsi että se toimii vain kerran elementeille, jotka ovat jo olemassa, kun automaattinen lataus alustetaan. Haluamme todennäköisesti ottaa huomioon myös dynaamisesti lisätyt elementit. Siellä MutationObserver
tulee peliin:
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();
}
Tällä tavalla selain ilmoittaa meille aina, kun uusi elementti ilmestyy DOM:iin - tai pikemminkin vastaavaan alipuuomme - jota käytämme sitten etsintäprosessin käynnistämiseen. (Saatat väittää, että keksimme täällä uudelleen mukautettuja elementtejä, ja olet tavallaan oikeassa.)
Automaattilataimemme on nyt täysin toimiva. Tulevat parannukset saattavat tarkastella mahdollisia kilpailuolosuhteita ja tutkia optimointeja. Mutta on mahdollista, että tämä riittää useimpiin skenaarioihin. Kerro minulle kommenteissa, jos sinulla on erilainen lähestymistapa, niin voimme vertailla muistiinpanoja!
- SEO-pohjainen sisällön ja PR-jakelu. Vahvista jo tänään.
- Platoblockchain. Web3 Metaverse Intelligence. Tietoa laajennettu. Pääsy tästä.
- Lähde: https://css-tricks.com/an-approach-to-lazy-loading-custom-elements/
- 1
- a
- Meistä
- edellä
- Tili
- todella
- lisä-
- Lisäksi
- Kaikki
- lievittää
- mahdollistaa
- jo
- ja
- lähestymistapa
- kiistellä
- noin
- saatavissa
- selain
- ehdokkaat
- ei voi
- joka
- varovainen
- mahdollisuudet
- tarkastaa
- lapsi
- luokka
- Tulla
- kommentit
- verrata
- olosuhteet
- Kontti
- Sopimus
- vastaava
- voisi
- kurssi
- asiakassuhde
- Malli
- eri
- löytö
- asiakirja
- ei
- DOM
- Pudota
- dynaamisesti
- helpompaa
- helposti
- Kehittää
- elementtejä
- tarpeeksi
- virhe
- Eetteri (ETH)
- EV
- Jopa
- Joka
- Paitsi
- kallis
- Epäonnistui
- fanit
- Etunimi
- alkaen
- täysin
- toiminnallinen
- tulevaisuutta
- menee
- hyvä
- pää
- tätä
- HTML
- HTTPS
- ihanteellinen
- tunnistaa
- heti
- toteuttaa
- täytäntöönpano
- täytäntöönpanosta
- in
- sen sijaan
- tutkia
- IT
- JavaScript
- Job
- laji
- Tietää
- Pituus
- RAJOITA
- vähän
- kuormitus
- lastaus
- katso
- tärkein
- tehdä
- TEE
- välineet
- menetelmä
- ehkä
- puuttuva
- moduuli
- lisää
- eniten
- liikkua
- mozilla
- moninkertainen
- Tarve
- tarvitaan
- Uusi
- solmu
- osa
- suorituskyky
- Platon
- Platonin tietotieto
- PlatonData
- Pelaa
- plus
- mahdollinen
- todennäköisesti
- prosessi
- tarkoituksiin
- Rotu
- äskettäin
- poistaa
- ne
- palata
- juuri
- skenaariot
- laajuus
- näyttää
- erillinen
- setti
- shouldnt
- esitetty
- Yksinkertainen
- single
- So
- jotain
- Alkaa
- Vaihe
- Yhä
- strategiat
- niin
- Tuetut
- TAG
- vie
- tekniikat
- -
- heidän
- asiat
- Ajattelu
- että
- totta
- päivittäminen
- päivitetty
- URI
- URL
- us
- käyttää
- yleensä
- kautta
- joka
- tulee
- Referenssit
- toimii
- kirjoittaminen
- Sinun
- zephyrnet