likes
comments
collection
share

关于 SAP Spartacus CmsService.getComponentData 可能的优化

作者站长头像
站长
· 阅读数 24

问题和观察

关于由 Spartacus 驱动的页面或组件请求的一个疑问。

请求负载中的 componentIds 是由 CmsService.getComponentData 调用定义的,堆叠起来,然后通过一些优化立即发送到后端。

如果二次开发人员连续多次调用 CmsService.getComponentData(在同一个 JS 宏任务中),那么 Spartacus 会将这些调用分组,并且仅向 OCC 发出一个带有所有组件 ID 的 HTTP 请求。

浏览器 JavaScript 执行流程以及在 Node.js 中都是基于事件循环的。

了解事件循环的工作原理对于优化非常重要,有时对于正确的架构也是如此。

事件循环的概念非常简单。 有一个无限循环,JavaScript 引擎等待任务,执行它们然后休眠,等待更多任务。

引擎的一般算法:

  1. 等待有任务到达,然后执行它们,从队列里最旧的任务开始。
  2. 睡眠直到任务再次到达。

这是我们在浏览网页时看到的形式。 JavaScript 引擎大部分时间什么都不做,它只在脚本/处理程序/事件激活时运行。

任务示例:

  1. 当外部脚本 <script src="..."> 加载时,任务引擎开始加载这些脚本文件。
  2. 当用户移动鼠标时,任务调度 mousemove 事件并执行对应的处理程序。
  3. 当预定的 setTimeout 时间到期时,任务将运行其回调,等等。

具体实现细节如下

请注意,OCC 对组件的调用是上下文相关的,它在有效负载中传递 productCode.

这是因为对于不同的 PDP,相同的 cms 组件可能会从后端携带不同的有效负载。

如果客户期望更改这种行为情况,客户可以添加自定义项来优化它 - 这样就不会在不同的产品代码中重复调用这些组件 ID.

关于 SAP Spartacus CmsService.getComponentData 可能的优化

对于 SAP 发布的开箱即用的示例数据用例,Spartacus 理论上不需要在不同的 PDP 上重新加载这些组件,因为有效负载在 PDP 之间不会发生变化。 但这只是因为我们的样本数据在页面之间没有区别:

  • 其中 3 个只是 CmsFlexComponent
  • 第四个是一个段落组件,其内容属性具有 Lorem ipsum…

路由内部有一个配置 loadStrategy 。 默认值为 ALWAYS 。 它将强制每次重新加载 CMS 页面。 如果是 ONCE,则不会重新加载 CMS 页面。