Gelişmiş
Lazy
Dinamik import ya da herhangi bir Promise ile yüklenen içerik; yükleme akışı, seçenekler, yeniden deneme, iptal ve hata raporu.
Lazy, bir Promise üreten fonksiyonu çağırır, sonucu bileşene çevirir ve bir Frame içine yerleştirir. Kod bölme (() => import('./X')) için tasarlanmıştır ama herhangi bir Promise ile çalışır.
Kullanım
Örnekte klasör grafiği, Chart.js yalnız gerektiğinde indirilsin diye tembel yüklenir. Bileşen adlı dışa aktarım olduğu için mapResult onu modülden seçer:
<Lazy
caller={() => import("../parts/FolderChart")}
options={{
mapResult: (m) => m.FolderChart,
Loaderview: <p class="loading">Grafik yükleniyor…</p>,
Fallbackview: <p class="error">Grafik yüklenemedi.</p>,
minDelayMs: 300,
timeoutMs: 10000,
retry: 3,
}}
/>
const chart = Lazy({
caller: () => import("../parts/FolderChart"),
options: {
mapResult: (m) => m.FolderChart,
Loaderview: motifComponent("p", (p: ComponentBase) => {
p.class.add("loading");
p.setText("Grafik yükleniyor…");
}),
Fallbackview: motifComponent("p", (p: ComponentBase) => {
p.class.add("error");
p.setText("Grafik yüklenemedi.");
}),
minDelayMs: 300,
timeoutMs: 10000,
retry: 3,
},
});
<Lazy
caller={() => import("../parts/FolderChart")}
options={{
mapResult: (m) => m.FolderChart,
Loaderview: <p class="loading">Grafik yükleniyor…</p>,
Fallbackview: <p class="error">Grafik yüklenemedi.</p>,
minDelayMs: 300,
timeoutMs: 10000,
retry: 3,
}}
/>
const chart = Lazy({
caller: () => import("../parts/FolderChart"),
options: {
mapResult: (m) => m.FolderChart,
Loaderview: motifComponent("p", (p) => {
p.class.add("loading");
p.setText("Grafik yükleniyor…");
}),
Fallbackview: motifComponent("p", (p) => {
p.class.add("error");
p.setText("Grafik yüklenemedi.");
}),
minDelayMs: 300,
timeoutMs: 10000,
retry: 3,
},
});
Lazy bir fonksiyondur; Lazy({ caller, options }) çağrısı da aynı Frame'i döndürür ve controls.add ile yerleştirilebilir. frame.navigateLazy(caller, options) ve frame.navigate(promise) da aynı yolu kullanır.
Yükleme akışı
- Varsa
Placeholderview(yoksaLoaderview) hemen gösterilir. caller()hemen çağrılır (bileşen DOM'a girmeyi beklemez).timeoutMsverildiyse süre dolunca yüklemeMJX110ile başarısız sayılır;signalverildiyseabort()yüklemeyiMJX111ile keser.- Başarılı sonuç
mapResultile bileşene çevrilir. Varsayılan dönüştürücü modülündefaultdışa aktarımını alır (import()sonucu için); başka bir dışa aktarım gerekiyorsa örnekteki gibimapResult: (m) => m.FolderChartyazılır. Dönen değer sınıf isenewile, fonksiyon ise çağrılarak kurulur; hazır örnek olduğu gibi kullanılır (prop verilmez). Options API nesnesi ya da fabrikası da bileşene çevrilir.defaultdışa aktarımı olmayan modül ya da bileşen olmayan başka bir nesne yüklemeyiMJX127ile başarısız sayar ve 5. adıma geçer.nullyükleniyor görünümünü korur, metin metin düğümü olarak, promise ya da dizi çözüldüğü gibi yerleştirilir. minDelayMsverildiyse ve yükleme ondan hızlı bittiyse kalan süre beklenir (kısa yüklemelerde yükleme görünümünün yanıp sönmesini önler). Sonra içerikFrame'e yerleştirilir;Loaderviewçıkış geçişini oynatarak serbest bırakılır.- Başarısızlıkta önce
onError(err)çağrılır.Fallbackviewvarsa gösterilir ve hata orada kalır (rapor edilmez). Yoksa kapsayıcı boşaltılır ve hataerrorHandler.reportileMJX126olarak raporlanır —console.error'a yazılır veerrorHandler.addListenerdinleyicilerine gider; özgün hatacausealanındadır (bkz. Hata yönetimi - Raporları dinleme).onErrorverilmiş olması raporu kaldırmaz.
İptal edilen (signal) bir yüklemede onError bir kez MJX111 ile çağrılır; iptalin deneme sürerken ya da yeniden deneme beklemesinde gelmesi fark etmez. Fallbackview gösterilmez, içerik değişmez ve rapor yazılmaz. Kapsayıcı serbest bırakıldığında her şey serbest bırakmanın ilk anında durur: süren zamanlayıcılar ve bekleyen yeniden denemeler temizlenir, onError çağrılmaz, rapor yazılmaz, sonradan biten yükleme yok sayılır ve hiçbir şey kurulmaz.
Seçenekler (LazyOptions<T>)
| Seçenek | Tip | Açıklama |
|---|---|---|
Loaderview |
ComponentBase |
Yükleme sürerken gösterilen içerik. |
Placeholderview |
ComponentBase |
Loaderview'den önceliklidir; ikisi birden verildiğinde yalnız bu gösterilir. |
Fallbackview |
ComponentBase |
Son deneme de başarısız olunca gösterilen içerik. |
minDelayMs |
number |
İçeriğin yerleşmesi için geçmesi gereken en az süre. |
timeoutMs |
number |
Her denemenin üst sınırı; aşılınca MJX110. |
signal |
AbortSignal |
Yüklemeyi dışarıdan iptal etme; MJX111. Frame.navigate(promise) bunu kendisi verir. |
mapResult |
(sonuç) => bileşen |
Yükleme sonucunu bileşene çevirir; varsayılan default dışa aktarımı. |
onError |
(hata) => void |
Son deneme de başarısız olunca ve iptalde (MJX111), Fallbackview'den önce; serbest bırakılırken çağrılmaz. |
retry |
number \| LazyRetryOptions |
Yeniden deneme (aşağıda). |
onRetry |
(deneme, hata) => void |
Her yeniden denemeden önce; deneme 1'den başlar. |
Yeniden deneme — retry
<Lazy caller={caller} options={{ retry: 3 }} /> {/* count: 3, delayMs: 500, whenOnline: true */}
<Lazy caller={caller} options={{ retry: { count: 3, delayMs: 500, whenOnline: true } }} /> {/* açık biçim (LazyRetryOptions) */}
Lazy({ caller, options: { retry: 3 } }); // count: 3, delayMs: 500, whenOnline: true
Lazy({ caller, options: { retry: { count: 3, delayMs: 500, whenOnline: true } } }); // açık biçim (LazyRetryOptions)
<Lazy caller={caller} options={{ retry: 3 }} /> {/* count: 3, delayMs: 500, whenOnline: true */}
<Lazy caller={caller} options={{ retry: { count: 3, delayMs: 500, whenOnline: true } }} /> {/* açık biçim (LazyRetryOptions) */}
Lazy({ caller, options: { retry: 3 } }); // count: 3, delayMs: 500, whenOnline: true
Lazy({ caller, options: { retry: { count: 3, delayMs: 500, whenOnline: true } } }); // açık biçim (LazyRetryOptions)
countkadar yeniden denenir; toplam denemecount + 1.- Bekleme her denemede artar:
delayMs × deneme(500, 1000, 1500…). whenOnline: trueiken cihaz çevrimdışıysa (navigator.onLine === false) sayaç başlamaz;onlineolayı gelince bekleme başlar.- Bekleme sırasında
signaliptal edilirse deneme bırakılır veonErrorMJX111ile çağrılır; kapsayıcı serbest bırakılırsa deneme sessizce bırakılır. timeoutMsher denemeye ayrı uygulanır.
Rota sayfalarında
Rota tanımındaki control: () => import('./pages/X') ve fallbacks.notFound/error kendi tembel yükleme yolunu kullanır; Lazy seçenekleri (yükleme görünümü, yeniden deneme) orada geçerli değildir. Bir sayfanın içindeki ağır parçayı tembel yüklemek için Lazy kullanın (bkz. Rota Tablosu - Lazy yükleme).
Sonraki adım
İçeriği başka bir yuvada göstermek için Transport ve TransportTo bölümüne geçin. Çerçevenin hata raporlama modeli için Hata Yönetimi; kapsayıcının zamanlama kuralları için Frame.