biz hayranlarıyız Özel Öğeler buralarda Tasarımları onları özellikle tembel yüklemeye uygunperformans için bir nimet olabilir.
Esinlenen bir meslektaşın deneyler, yakın zamanda basit bir otomatik yükleyici yazmaya başladım: DOM'da ne zaman özel bir öğe görünse, henüz mevcut değilse ilgili uygulamayı yüklemek istiyoruz. Tarayıcı daha sonra bu tür öğelerin yükseltilmesiyle o andan itibaren ilgilenir.
Muhtemelen tüm bunlara gerçekten ihtiyacınız olmayacak; genellikle daha basit bir yaklaşım vardır. Burada gösterilen teknikler kasıtlı olarak kullanıldığında araç setinize faydalı bir katkı olabilir.
Tutarlılık için, otomatik yükleyicimizin de özel bir öğe olmasını istiyoruz; bu da onu HTML aracılığıyla kolayca yapılandırabileceğimiz anlamına geliyor. Ancak önce, bu çözülmemiş özel öğeleri adım adım belirleyelim:
class AutoLoader extends HTMLElement { connectedCallback() { let scope = this.parentNode; this.discover(scope); }
}
customElements.define("ce-autoloader", AutoLoader);
Bu modülü önceden yüklediğimizi varsayarsak (kullanarak async
ideal), bırakabiliriz <ce-autoloader>
eleman içine <body>
belgemizin. Bu, tüm alt öğeler için keşif sürecini hemen başlatacaktır. <body>
, artık kök öğemizi oluşturan. Ekleyerek keşfi belgemizin bir alt ağacıyla sınırlayabiliriz. <ce-autoloader>
bunun yerine ilgili kapsayıcı öğeye - aslında, farklı alt ağaçlar için birden çok örneğimiz bile olabilir.
Tabii ki, yine de bunu uygulamak zorundayız. discover
yönteminin bir parçası olarak AutoLoader
yukarıdaki sınıf):
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); } }
}
Burada kök öğemizi her bir alt öğeyle birlikte kontrol ediyoruz (*
). Tireli etiketlerle belirtildiği gibi özel bir öğeyse ancak henüz yükseltilmemişse ilgili tanımı yüklemeye çalışırız. DOM'u bu şekilde sorgulamak pahalı olabilir, bu yüzden biraz dikkatli olmalıyız. Bu işi erteleyerek ana iş parçacığı üzerindeki yükü hafifletebiliriz:
connectedCallback() { let scope = this.parentNode; requestIdleCallback(() => { this.discover(scope); });
}
requestIdleCallback
henüz evrensel olarak desteklenmiyor, ancak kullanabiliriz requestAnimationFrame
bir yedek olarak:
let defer = window.requestIdleCallback || requestAnimationFrame; class AutoLoader extends HTMLElement { connectedCallback() { let scope = this.parentNode; defer(() => { this.discover(scope); }); } // ...
}
Şimdi eksikleri uygulamaya geçebiliriz. load
dinamik olarak enjekte etme yöntemi <script>
eleman:
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`;
}
Sabit kodlanmış kurala dikkat edin elementURL
. src
özniteliğin URL'si, tüm özel öğe tanımlarının bulunduğu bir dizin olduğunu varsayar (örn. <my-widget>
→ /components/my-widget.js
). Daha ayrıntılı stratejiler bulabiliriz, ancak bu bizim amaçlarımız için yeterince iyi. Bu URL'yi ayrı bir yönteme atamak, gerektiğinde projeye özel alt sınıflandırmaya izin verir:
class FancyLoader extends AutoLoader { elementURL(tag) { // fancy logic }
}
Her iki durumda da, güvendiğimizi unutmayın this.rootDir
. Yukarıda bahsedilen yapılandırılabilirliğin devreye girdiği yer burasıdır. Karşılık gelen bir alıcı ekleyelim:
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;
}
düşünüyor olabilirsin observedAttributes
şimdi, ama bu gerçekten işleri kolaylaştırmıyor. Artı güncelleme root-dir
çalışma zamanında, asla ihtiyacımız olmayacak bir şey gibi görünüyor.
Artık element dizinimizi yapılandırabiliriz ve yapmalıyız: <ce-autoloader root-dir="/components">
.
Bununla, otomatik yükleyicimiz işini yapabilir. Otomatik yükleyici başlatıldığında zaten var olan öğeler için yalnızca bir kez çalışması dışında. Muhtemelen dinamik olarak eklenen öğeleri de hesaba katmak isteyeceğiz. Bu nerede MutationObserver
devreye giriyor:
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();
}
Bu şekilde, DOM'da veya daha doğrusu ilgili alt ağacımızda yeni bir öğe göründüğünde tarayıcı bizi bilgilendirir ve bunu daha sonra keşif sürecini yeniden başlatmak için kullanırız. (Burada özel öğeleri yeniden icat ettiğimizi iddia edebilirsiniz ve biraz haklı olursunuz.)
Otomatik yükleyicimiz artık tamamen işlevsel. Gelecekteki geliştirmeler, potansiyel yarış koşullarına bakabilir ve optimizasyonları araştırabilir. Ancak şanslar, bu çoğu senaryo için yeterince iyidir. Farklı bir yaklaşımınız varsa yorumlarda bana bildirin ve notları karşılaştırabiliriz!
- SEO Destekli İçerik ve Halkla İlişkiler Dağıtımı. Bugün Gücünüzü Artırın.
- Plato blok zinciri. Web3 Metaverse Zekası. Bilgi Güçlendirildi. Buradan Erişin.
- Kaynak: https://css-tricks.com/an-approach-to-lazy-loading-custom-elements/
- 1
- a
- Hakkımızda
- yukarıdaki
- Hesap
- aslında
- katma
- ilave
- Türkiye
- hafifletmek
- veriyor
- zaten
- ve
- yaklaşım
- tartışmak
- etrafında
- mevcut
- tarayıcı
- adaylar
- yapamam
- hangi
- dikkatli
- şansı
- Kontrol
- çocuk
- sınıf
- nasıl
- yorumlar
- karşılaştırmak
- koşullar
- Konteyner
- Kongre
- uyan
- olabilir
- kurs
- görenek
- Dizayn
- farklı
- keşif
- belge
- Değil
- KARAR
- Damla
- dinamik
- kolay
- kolayca
- ayrıntılı
- elemanları
- yeterli
- hata
- Eter (ETH)
- EV
- Hatta
- Her
- Dışında
- pahalı
- başarısız
- fanlar
- Ad
- itibaren
- tamamen
- fonksiyonel
- gelecek
- gidiş
- Tercih Etmenizin
- baş
- okuyun
- HTML
- HTTPS
- ideal
- belirlemek
- hemen
- uygulamak
- uygulama
- uygulanması
- in
- yerine
- araştırmak
- IT
- JavaScript
- İş
- Nezaket.
- Bilmek
- uzunluk
- LİMİT
- küçük
- yük
- yükleme
- Bakın
- Ana
- yapmak
- YAPAR
- anlamına geliyor
- yöntem
- olabilir
- eksik
- modül
- Daha
- çoğu
- hareket
- mozilla
- çoklu
- gerek
- gerekli
- yeni
- düğüm
- Bölüm
- performans
- Platon
- Plato Veri Zekası
- PlatoVeri
- OYNA
- artı
- potansiyel
- muhtemelen
- süreç
- amaçlı
- Yarış
- geçenlerde
- Kaldır
- bu
- dönüş
- kök
- senaryolar
- kapsam
- görünüyor
- ayrı
- set
- meli
- gösterilen
- Basit
- tek
- So
- bir şey
- başlama
- adım
- Yine
- stratejileri
- böyle
- destekli
- TAG
- alır
- teknikleri
- The
- ve bazı Asya
- işler
- Düşünme
- için
- gerçek
- güncellenmesi
- yükseltilmiş
- URI
- URL
- us
- kullanım
- genellikle
- üzerinden
- hangi
- irade
- İş
- çalışır
- yazı yazıyor
- zefirnet