天天看点

关于 SAP Spartacus CSR fallback 之后,是否仍然会继续进行 SSR 的处理

来自 nguniversal 的 express engine 渲染完了后,渲染完毕的 HTML 源代码保存在 150 行代码 html 里,callback 就是 Spartacus 团队开发的 ssr optimization engine 的实现:

关于 SAP Spartacus CSR fallback 之后,是否仍然会继续进行 SSR 的处理

回调执行时,maxRenderTimeout 不为空,说明 maxRenderTime 驱动的 setTimeout 尚未执行,这说明 maxRenderTime 超时没有发生,因此不会执行到第 170 行。

关于 SAP Spartacus CSR fallback 之后,是否仍然会继续进行 SSR 的处理
关于 SAP Spartacus CSR fallback 之后,是否仍然会继续进行 SSR 的处理

先调用 callback 把 html 返回给请求端:

关于 SAP Spartacus CSR fallback 之后,是否仍然会继续进行 SSR 的处理

再保存到 cache 里:

关于 SAP Spartacus CSR fallback 之后,是否仍然会继续进行 SSR 的处理

下面测试直到 timeout 时间到达,仍未开始 render,fallback 到 CSR 之后,是否还会在后台将 SSR 执行完毕。

让断点停在这里,等待 timeout 即 90秒,一分半钟。

关于 SAP Spartacus CSR fallback 之后,是否仍然会继续进行 SSR 的处理

去做了一会家务回来,F8,果然 CSR fallback 了:

关于 SAP Spartacus CSR fallback 之后,是否仍然会继续进行 SSR 的处理

也看到了对应的 log:SSR rendering exceeded timeout 90000, fallbacking to CSR for /

关于 SAP Spartacus CSR fallback 之后,是否仍然会继续进行 SSR 的处理

如果此时 maxRenderTimeout 时间也到达了,那么会执行上图绿色高亮代码,将 maxRenderTimeout 清空,然后我们指定的 callback 会被调用到。

关于 SAP Spartacus CSR fallback 之后,是否仍然会继续进行 SSR 的处理

注意,在上图的上下文里,SSR 已经成功完成了,只是因为 maxRenderTimeout 已经到达,因此渲染好的 HTML 被丢弃。如果 timeout 到达但是 maxRenderTimeout 没有到达,则渲染好的 HTML 会进一步得到处理。

继续阅读