問題:為什麼我們會看到形如下列格式的日志?
每次新的請求到達 SSR 時,都會調用檔案 spartacus-setup-ssr.js 中的 renderResponse 函數。
在其中, this.shouldRender 被調用,以評估應如何處理此請求。
在 shouldRender 中:
step1:評估目前并發數是否達到上限。 評估邏輯是通過将目前并發值(在 this.concurrency 中維護)與客戶傳遞的選項( this.ssrOptions.concurrency )進行比較來完成的:
源代碼:
step2:評估同一頁面是否已經有渲染過程。
如何判斷兩個渲染請求是否代表同一個頁面?
這是由第 97 行中的函數 this.getRenderingKey(request) 完成的。
預設的區分邏輯是使用請求的 originalUrl 字段,即如果兩個請求的 originalUrl 相同,則 SSR 将它們視為同一個頁面。
如何判斷給定頁面是否已經有正在進行的渲染過程?
在 spartacus-setup-ssr.js 的 RenderingCache 類中,我們使用 Map 通過鍵值結構來維護每個頁面的渲染過程,參見下面的第 9 行
預設情況下,key 是請求的 originalUrl,value 是一個包含布爾标志的對象:true 或 false。
如果可以從 RenderingCache 的 Map 中找到等于 true 的給定值,我們認為給定頁面正在渲染。 同時,如果另一個請求帶有完全相同的頁面鍵(即相同的 originalUrl ),我們将不會通過 SSR 提供第二個請求,而是觸發 CSR 回退,并在下面的第 99 行列印日志。