แคชสำหรับใช้กับ Blazor WebAssembly และ Server Prerendering ป้องกัน/ลดการเริ่มต้น UI Flash สองครั้ง
นี่คือความพยายามที่จะแก้/บรรเทาปัญหาที่ Blazor WebAssembly + เซิร์ฟเวอร์การทำล่วงหน้าบนหน้าเว็บอาจทำให้ "UI Flash"
เวลาที่ใช้ในการดึงข้อมูลเป็นครั้งที่สองคือสิ่งที่ทำให้ UI แฟลช

รหัสชิ้นนี้เพิ่มแคชที่จัดการกับ ImemoryCache (ซึ่งเป็นหนึ่งในวิธีที่แนะนำในการแก้ปัญหานี้ตั้งแต่แรก)
แม้ว่าแทนที่จะเก็บแคชไว้บนเซิร์ฟเวอร์ (ดังนั้นการลบเช่นการเดินทางครั้งที่สองไปยังฐานข้อมูล) แคชจะถูกเก็บไว้ในหน้าแบบคงที่
จากนั้นเมื่อหน้าได้รับการเริ่มต้นครั้งที่สองแคชจะถูกโหลดจากหน้าคงที่และข้อมูลจะถูกดึงจากที่นั่น สิ่งนี้จะช่วยป้องกันการเดินทางไปยังเซิร์ฟเวอร์โดยสิ้นเชิงลบขั้นตอน Async และลด/ลบขั้นตอนการโหลดครั้งที่สองอย่างมาก
ห้องสมุดมีให้บริการเป็นแพ็คเกจ NUGET เพื่อความเชื่อมั่น แต่มันเล็กมากจนอาจจะดีกว่าที่จะคัดลอก 2 ไฟล์ลงในโครงการของคุณ
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 ( ) ) ;
}อาร์กิวเมนต์แรกของ getoradd-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 >