SAP 电商云 Spartacus UI Angular Component 动态创建的单步调试

举报
汪子熙 发表于 2022/09/02 12:53:36 2022/09/02
【摘要】 Jerry 之前的文章SAP 产品 UI 里的容器组件的概念和开发概述介绍过,SAP Spartacus Angular Component,通过我们开发团队自定义的指令 cxComponentWrapper 进行渲染。在运行时,根据 Angular Component 的名称,即第90行 flexType 字段包含的 QuickOrderComponent,我们能够使用 Angular C...

Jerry 之前的文章SAP 产品 UI 里的容器组件的概念和开发概述介绍过,SAP Spartacus Angular Component,通过我们开发团队自定义的指令 cxComponentWrapper 进行渲染。

在运行时,根据 Angular Component 的名称,即第90行 flexType 字段包含的 QuickOrderComponent,我们能够使用 Angular Component 动态创建 API 来触发这个 Component 的渲染。

default-component.handler.ts 里,调用 viewContainerRef 的 createComponent 方法,创建 Component 实例。

待创建的 Component 如果 constructor 里定义了外部依赖,需要完成这些依赖的创建和注入:

这里待注入的 token 就是 QuickOrderFacade:

这里解析出的 provider 是 QuickOrderService:

CoreModule 一旦被加载,下图第6行 facadeProviders 里的 provider 定义立即生效:

也就是说,运行时,QuickOrderService 会成为 QuickOrderFacade 的具体实现:

如何理解 SAP 电商云 Spartacus UI 中的 proxy facade?

Jerry 这篇文章什么是 SAP 电商云 Spartacus UI 的 proxy façade提供了理论上的解释。

本文介绍一个实际例子。

当我们打开如下 url 时,默认是不会触发 Quick Order Core module 的加载的,因为我们根本没有使用到 Quick Order 任何功能:

http://localhost:4299/electronics-spa/en/USD/

当然,我们仍然有办法,在 homepage 的 app.module.ts 里手动编写一些代码,这些代码需要 Quick Order core module 被加载之后才能正常执行:

上面代码注入的依赖 QuickOrderFacade,虽然是 Quick Order root module 的一部分,被正常加载,但是 QuickOrderFacade 只是一个 Abstract Class,需要 core module 里提供的具体实现才能继续执行。因此,加上了上述代码之后,我们访问 Spartacus UI 的 homepage,也会触发 Quick Order Core module 的加载。

上述结论可以在 Chrome 开发者工具 network 标签页里观察到 Quick Order Core Module 的加载:

以及对应调试代码的打印:

在运行时,当 AppModule 作为入口 module 被加载时,Angular 框架会调用 _resolveInjectorDefTypes 解析器构造函数里声明的依赖:

此时因为 QuickOrder core module 尚未加载,因此通过 QuickOrderFacade 提供的工厂方法 FacadeFactory 去提供依赖:

这里调用标准的来自 Angular/core 的 inject,结合传入的 descriptor,进行注入:

调用 inject 注入 FacadeFactoryService 的结果是什么?

结果就是得到了 FacadeFactoryService 的一个实例,且该实例的每个属性字段也均被注入了对应的实例了:

这里我们准备创建 cartQuickOrderCore 的具体实现,首先需要检查这个 feature 是否已经启用:

this.cmsConfig.featureModules 里确实存在 cartQuickOrder 的记录:

这里试图获取 QuickOrderFacade 的实现:

最终是通过 QuickOrderService 注入的。

此时 Quick Order core module 应该已经加载了。

我们来具体看一下到底是哪行代码触发的 core module 加载?

入口:

这一行的下一个函数调用触发延迟加载:

最终位置:

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。