ذاكرة التخزين المؤقت للاستخدام مع Blazor Webassembly و Server Prerendering. يمنع/يخفف من فلاش واجهة المستخدم المزدوجة.
هذه محاولة لحل/تخفيف المشكلة ، حيث يمكن أن يتسبب Prerendering Blazor Webassembly + Server على الصفحات في "فلاش واجهة المستخدم".
الوقت الذي يستغرقه جلب البيانات للمرة الثانية هو ما يسبب وميض واجهة المستخدم.

يضيف قطعة الكود هذه ذاكرة التخزين المؤقت ، والتي تتعامل مع الكثير مثل ImemoryCache (والتي تعد إحدى الطرق المقترحة لحل هذه المشكلة في المقام الأول).
على الرغم من ذلك ، بدلاً من تخزين ذاكرة التخزين المؤقت على الخادم (وبالتالي إزالة الرحلة الثانية إلى قاعدة البيانات) ، يتم تخزين ذاكرة التخزين المؤقت في الصفحة الثابتة.
ثم ، عندما تحصل الصفحة على تهيئة ثانية ، يتم تحميل ذاكرة التخزين المؤقت من الصفحة الثابتة ويتم سحب البيانات من هناك. هذا يمنع الرحلة إلى الخادم تمامًا ، مما يؤدي إلى إزالة خطوة غير متزامنة وتقليل/إزالة مرحلة التحميل الثانية بشكل كبير.
المكتبة متوفرة كحزمة nuget للقافلة ، لكنها صغيرة جدًا لدرجة أنه قد يكون من الأفضل نسخ الملفان في مشروعك.
Install-Package Flyingpie.Blazor.PrerenderCache
builder . Services
. AddScoped < IPrerenderCache , PrerenderCache > ( )
;< component type = " typeof(Flyingpie.Blazor.PrerenderCache.PrerenderCacheStore) " render-mode = " Static " />لاحظ أنه يجب إضافة هذا المكون إلى أسفل الصفحة ، بحيث يتم تحميله بعد جميع المكونات الأخرى.
هذا لمنع المكون من التقديم قبل أن يتوفر كل شيء من الإفراط في الإفراط من 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 ( ) ) ;
}الوسيطة الأولى من Metoradd-Method هي مفتاح ذاكرة التخزين المؤقت ، والتي يجب أن تكون فريدة من نوعها داخل الصفحة.
يمكنك رؤية نتيجة ذاكرة التخزين المؤقت من خلال النظر إلى مصدر الصفحة:
< 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 >