问题:为什么我们看到的日志格式如下?CSR回退:正在渲染每次新请求到达SSR时,都会调用文件spartacus-setup-ssr.js中的renderResponse函数。其中,调用this.shouldRender来评估应如何处理请求。在shouldRender:step1:判断当前并发数是否达到上限。评估逻辑是通过将当前并发值(在this.concurrency中维护)与客户端传递的选项(this.ssrOptions.concurrency)进行比较来完成的:源代码:constconcurrencyLimitExceed=((_a=this.ssrOptions)===空||_a===void0?void0:_a.concurrency)?this.currentConcurrency>=this.ssrOptions.concurrency:false;step2:判断同一个页面是否已经有渲染进程。constisRendering=this.renderingCache.isRendering(this.getRenderingKey(request));如何判断两个渲染请求是否代表同一个页面?这是通过第97行的函数this.getRenderingKey(request)完成的。默认的区分逻辑是使用请求的originalUrl字段,即如果两个请求的originalUrl相同,SSR会将它们视为同一个页面。如何判断给定页面是否已经在进行渲染过程?在spartacus-setup-ssr.js的RenderingCache类中,我们使用一个Map通过key-value结构来维护每个页面的渲染过程,见下文第9行。默认情况下,key是请求的originalUrl,value是一个包含布尔标志的对象:true或false。如果可以从RenderingCache的Map中找到等于true的给定值,我们认为给定页面正在呈现。同时,如果另一个请求带有完全相同的页面键(即相同的originalUrl),我们不会通过SSR为第二个请求提供服务,而是触发CSR回退并在下面的第99行打印日志。注意:无论选项“缓存”的值如何,使用RenderingCache记录页面是否正在呈现的逻辑始终处于打开状态。更多Jerry原创文章在这里:《王子熙》:
