问题和观察
关于由 Spartacus 驱动的页面或组件请求的一个疑问。
请求负载中的 componentIds 是由 CmsService.getComponentData 调用定义的,堆叠起来,然后通过一些优化立即发送到后端。
如果二次开发人员连续多次调用 CmsService.getComponentData(在同一个 JS 宏任务中),那么 Spartacus 会将这些调用分组,并且仅向 OCC 发出一个带有所有组件 ID 的 HTTP 请求。
浏览器 JavaScript 执行流程以及在 Node.js 中都是基于事件循环的。
了解事件循环的工作原理对于优化非常重要,有时对于正确的架构也是如此。
事件循环的概念非常简单。 有一个无限循环,JavaScript 引擎等待任务,执行它们然后休眠,等待更多任务。
引擎的一般算法:
- 等待有任务到达,然后执行它们,从队列里最旧的任务开始。
- 睡眠直到任务再次到达。
这是我们在浏览网页时看到的形式。 JavaScript 引擎大部分时间什么都不做,它只在脚本/处理程序/事件激活时运行。
任务示例:
-
当外部脚本
<script src="...">
加载时,任务引擎开始加载这些脚本文件。 -
当用户移动鼠标时,任务调度 mousemove 事件并执行对应的处理程序。
-
当预定的 setTimeout 时间到期时,任务将运行其回调,等等。
具体实现细节如下。
请注意,OCC 对组件的调用是上下文相关的,它在有效负载中传递 productCode.
这是因为对于不同的 PDP,相同的 cms 组件可能会从后端携带不同的有效负载。
如果客户期望更改这种行为情况,客户可以添加自定义项来优化它 - 这样就不会在不同的产品代码中重复调用这些组件 ID.
对于 SAP 发布的开箱即用的示例数据用例,Spartacus 理论上不需要在不同的 PDP 上重新加载这些组件,因为有效负载在 PDP 之间不会发生变化。 但这只是因为我们的样本数据在页面之间没有区别:
- 其中 3 个只是 CmsFlexComponent
- 第四个是一个段落组件,其内容属性具有
Lorem ipsum…
路由内部有一个配置 loadStrategy 。 默认值为 ALWAYS 。 它将强制每次重新加载 CMS 页面。 如果是 ONCE,则不会重新加载 CMS 页面。
网友评论