当前位置: 首页 > 后端技术 > Java

SAPSpartacus组件和模块懒加载的一些问答

时间:2023-04-01 14:10:30 Java

只做Component懒加载不行吗?是否需要进行任何设置才能使其正常工作?考虑到我们在整个站点上使用的共享组件,我们想采用这种方法(即组件延迟加载)。这样,我们可以只测试每个组件。答:组件延迟加载是可行的,但在更复杂的组件(使用不同的指令和组件)的情况下会更加困难,因为动态导入仅针对组件类,而不是Angular模块。如果没有加载这些组件类中使用的指令和其他组件,运行时会报各种错误。这些复杂情况的一种解决方案是将模块定义定义嵌入到与组件本身相同的文件中,即在组件实现文件中重新定义模块。因此模块将与组件一起加载。如果我们继续选择模块延迟加载,我们如何从未映射到CMS组件的插槽中延迟加载Angular组件?答:目前在Angular框架中还没有开箱即用的功能。默认情况下,Angular支持延迟加载路由。对于像Spartacus这样的CMS驱动的站点,我们不能使用基于路由的方法来延迟加载Angular组件,因为我们不知道在构建时给定路由需要哪些组件。这就是Spartacus利用CMS地图作为支持延迟加载的机制的原因。简而言之,我们可以得到一个提示(在导航到它时)指定页面需要哪些组件,然后使用CMS映射配置来延迟加载所需的组件或功能。模块内的静态导入会影响组件/模块延迟加载吗?例如:我们在HomePage模块中引入了iconModule,当前主页模块在app.module中被延迟加载。组件延迟加载在这种情况下不起作用。模块延迟加载仅适用于home模块回答:如果您动态(延迟)和静态导入入口点,那么构建器(webpack)将静态捆绑它。这是延迟加载可能不起作用的常见情况,在某种程度上,应用程序应该仍然可以工作,如果配置正确,代码拆分机制将不会在此代码上工作,也不会生成单独的JS块。但是,静态导入可以在单独的延迟加载模块之间共享。如果这些导入仅在延迟加载的模块之间共享,则会创建一个特殊的共享块来加载这两个函数。如果导入也与直接在主块(app.module)中导入的某些组件或模块共享,则代码将静态捆绑到主块中。出于测试目的,我们尝试了组件和模块延迟加载。它们都不能完全工作。即使在添加provideDefaultConfig(b2cLayoutConfig)之后,尽管添加了它,UI仍然在奇怪的地方中断。答:很难从这个描述中猜出潜在的问题。一般来说,如果延迟加载不起作用,最好的办法是逐步进行,从很少的组件开始并找出潜在的问题。即便如此,仍然会有部分代码需要立即加载,例如应用程序初始化程序、http拦截器等。从Spartacus3.0开始,我们开始使用默认的延迟加载来运送整个库。所有新功能都是以这种方式创建的+我们将继续移动现有功能,同时改进机制和技术(但仍然是相同的机制)。