天天看點

為什麼我們會看到 SAP Spartacus 伺服器端渲染 `rendering in process` 的日志

問題:為什麼我們會看到形如下列格式的日志?

為什麼我們會看到 SAP Spartacus 伺服器端渲染 `rendering in process` 的日志

每次新的請求到達 SSR 時,都會調用檔案 spartacus-setup-ssr.js 中的 renderResponse 函數。

在其中, this.shouldRender 被調用,以評估應如何處理此請求。

為什麼我們會看到 SAP Spartacus 伺服器端渲染 `rendering in process` 的日志

在 shouldRender 中:

step1:評估目前并發數是否達到上限。 評估邏輯是通過将目前并發值(在 this.concurrency 中維護)與客戶傳遞的選項( this.ssrOptions.concurrency )進行比較來完成的:

為什麼我們會看到 SAP Spartacus 伺服器端渲染 `rendering in process` 的日志

源代碼:

為什麼我們會看到 SAP Spartacus 伺服器端渲染 `rendering in process` 的日志

step2:評估同一頁面是否已經有渲染過程。

為什麼我們會看到 SAP Spartacus 伺服器端渲染 `rendering in process` 的日志
為什麼我們會看到 SAP Spartacus 伺服器端渲染 `rendering in process` 的日志

如何判斷兩個渲染請求是否代表同一個頁面?

這是由第 97 行中的函數 this.getRenderingKey(request) 完成的。

預設的區分邏輯是使用請求的 originalUrl 字段,即如果兩個請求的 originalUrl 相同,則 SSR 将它們視為同一個頁面。

如何判斷給定頁面是否已經有正在進行的渲染過程?

在 spartacus-setup-ssr.js 的 RenderingCache 類中,我們使用 Map 通過鍵值結構來維護每個頁面的渲染過程,參見下面的第 9 行

為什麼我們會看到 SAP Spartacus 伺服器端渲染 `rendering in process` 的日志

預設情況下,key 是請求的 originalUrl,value 是一個包含布爾标志的對象:true 或 false。

如果可以從 RenderingCache 的 Map 中找到等于 true 的給定值,我們認為給定頁面正在渲染。 同時,如果另一個請求帶有完全相同的頁面鍵(即相同的 originalUrl ),我們将不會通過 SSR 提供第二個請求,而是觸發 CSR 回退,并在下面的第 99 行列印日志。

為什麼我們會看到 SAP Spartacus 伺服器端渲染 `rendering in process` 的日志