写点什么

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

作者:Jerry Wang
  • 2022 年 6 月 13 日
  • 本文字数:807 字

    阅读完需:约 3 分钟

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

问题和观察

关于由 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 理论上不需要在不同的 PDP 上重新加载这些组件,因为有效负载在 PDP 之间不会发生变化。 但这只是因为我们的样本数据在页面之间没有区别:


  • 其中 3 个只是 CmsFlexComponent

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


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

发布于: 刚刚阅读数: 3
用户头像

Jerry Wang

关注

🏆InfoQ写作平台-签约作者🏆 2017.12.03 加入

SAP成都研究院开发专家,SAP社区导师,SAP中国技术大使。2007 年从电子科技大学计算机专业硕士毕业后加入 SAP 成都研究院工作至今。工作中使用 ABAP, Java, JavaScript 和 TypeScript 进行开发。

评论

发布
暂无评论
关于 SAP Spartacus CmsService.getComponentData 可能的优化思路_前端开发_Jerry Wang_InfoQ写作社区