Cache untuk digunakan dengan Blazor WebAssembly dan prerendering server. Mencegah/memudahkan flash UI inisialisasi ganda.
Ini adalah upaya untuk memecahkan/memudahkan masalah, di mana Blazor WebAssembly + Server prerendering pada halaman dapat menyebabkan "flash UI".
Waktu yang dibutuhkan untuk mengambil data untuk kedua kalinya adalah apa yang menyebabkan UI berkedip.

Sepotong kode ini menambahkan cache, yang menangani banyak hal seperti iMemoryCache (yang merupakan salah satu cara yang disarankan untuk menyelesaikan masalah ini di tempat pertama).
Padahal, alih -alih menyimpan cache di server (dengan demikian menghapus misalnya perjalanan kedua ke database), cache disimpan di halaman prerender statis.
Kemudian, ketika halaman mendapat inisialisasi kedua, cache dimuat dari halaman statis dan data ditarik dari sana. Ini mencegah perjalanan ke server sepenuhnya, menghapus langkah async dan secara drastis mengurangi/menghapus fase pemuatan kedua.
Perpustakaan tersedia sebagai paket Nuget untuk Konvienence, tetapi sangat kecil sehingga mungkin lebih baik untuk hanya menyalin 2 file ke dalam proyek Anda.
Install-Package Flyingpie.Blazor.PrerenderCache
builder . Services
. AddScoped < IPrerenderCache , PrerenderCache > ( )
;< component type = " typeof(Flyingpie.Blazor.PrerenderCache.PrerenderCacheStore) " render-mode = " Static " />Perhatikan bahwa komponen ini harus ditambahkan ke bagian paling bawah halaman, sehingga dimuat setelah semua komponen lainnya.
Ini untuk mencegah komponen dari rendering sebelum semua-menjadi-cacing-data tersedia dari iprerendercache.
[ Inject ]
public IPrerenderCache Cache { get ; set ; }
protected override async Task OnInitializedAsync ( )
{
// Original
// VM = await StashApiClient.GetPostsAsync();
// Cacheable
VM = await Cache . GetOrAdd ( nameof ( Articles ) , ( ) => StashApiClient . GetPostsAsync ( ) ) ;
}Argumen pertama dari metode getoradd adalah kunci cache, yang harus unik dalam halaman.
Anda dapat melihat hasil cache dengan melihat sumber halaman:
< script type =" text/javascript " >
window . prerenderCache = {
cache : { "Articles" : { "Limit" : 25 , "Offset" : 0 , "Count" : 4 , "Posts" : [ { "Id" : "37af5802-7ea4-4def-b090-5bd4ebf4dabc" , ... } ] } } ,
load : ( ) => window . prerenderCache . cache
} ;
</ script >