为什么我们会看到 SAP Spartacus 服务器端渲染 `rendering in process` 的日志
問題:為什么我們會(huì)看到形如下列格式的日志?
CSR fallback: rendering in progress
每次新的請(qǐng)求到達(dá) SSR 時(shí),都會(huì)調(diào)用文件 spartacus-setup-ssr.js 中的 renderResponse 函數(shù)。
在其中, this.shouldRender 被調(diào)用,以評(píng)估應(yīng)如何處理此請(qǐng)求。
在 shouldRender 中:
step1:評(píng)估當(dāng)前并發(fā)數(shù)是否達(dá)到上限。 評(píng)估邏輯是通過將當(dāng)前并發(fā)值(在 this.concurrency 中維護(hù))與客戶傳遞的選項(xiàng)( this.ssrOptions.concurrency )進(jìn)行比較來完成的:
源代碼:
const concurrencyLimitExceed = ((_a = this.ssrOptions) === null || _a === void 0 ? void 0 : _a.concurrency) ? this.currentConcurrency >= this.ssrOptions.concurrency: false;step2:評(píng)估同一頁(yè)面是否已經(jīng)有渲染過程。
const isRendering = this.renderingCache.isRendering(this.getRenderingKey(request));如何判斷兩個(gè)渲染請(qǐng)求是否代表同一個(gè)頁(yè)面?
這是由第 97 行中的函數(shù) this.getRenderingKey(request) 完成的。
默認(rèn)的區(qū)分邏輯是使用請(qǐng)求的 originalUrl 字段,即如果兩個(gè)請(qǐng)求的 originalUrl 相同,則 SSR 將它們視為同一個(gè)頁(yè)面。
如何判斷給定頁(yè)面是否已經(jīng)有正在進(jìn)行的渲染過程?
在 spartacus-setup-ssr.js 的 RenderingCache 類中,我們使用 Map 通過鍵值結(jié)構(gòu)來維護(hù)每個(gè)頁(yè)面的渲染過程,參見下面的第 9 行。
默認(rèn)情況下,key 是請(qǐng)求的 originalUrl,value 是一個(gè)包含布爾標(biāo)志的對(duì)象:true 或 false。
如果可以從 RenderingCache 的 Map 中找到等于 true 的給定值,我們認(rèn)為給定頁(yè)面正在渲染。 同時(shí),如果另一個(gè)請(qǐng)求帶有完全相同的頁(yè)面鍵(即相同的 originalUrl ),我們將不會(huì)通過 SSR 提供第二個(gè)請(qǐng)求,而是觸發(fā) CSR 回退,并在下面的第 99 行打印日志。
注意:使用 RenderingCache 記錄頁(yè)面是否正在渲染的邏輯始終處于開啟狀態(tài),無論選項(xiàng)“cache”的值如何。
更多Jerry的原創(chuàng)文章,盡在:“汪子熙”:
總結(jié)
以上是生活随笔為你收集整理的为什么我们会看到 SAP Spartacus 服务器端渲染 `rendering in process` 的日志的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 我国有“立夏看夏”的说法,指的是立夏时节
- 下一篇: 中科院软件所成功开发首个面向开源鸿蒙 O