@[toc]SiteContext的实现位于core\src\文件夹下。实现分为以下八个部分:site-context.module.ts大部分导入由site-context文件夹本身的子文件夹提供:上图中第一行从@angular/core导入ModuleWithProviders,其中是一个包装器:NgModule的包装器,它将NgModule与提供者相关联。不推荐使用没有通用类型的用法。该Module只暴露了两个方法:initSiteContextConfig注入值:SiteContextConfigInitializerSiteContextConfig如果context的context值被填充,则返回SiteContextConfigInitializer实例,否则返回null。|第27行表示关节类型。forRoot提供了一个全局提供者:forRoot方法在base-core.module.ts的imports部分被调用。config首先检查index.ts并从三个TypeScript文件导入:export*from'./config-loader/site-context-config-initializer';从'./context-config-utils'导出*;export*from'./site-context-config';config-loader/site-context-config-initializer.js还是先看它的import部分,从site-context的上层目录即core/src导入:ConfigInitializerBaseSiteJavaRegExpConverterWindowRef实现了configInitializer接口。这个接口定义在config文件夹里面,里面有string数组类型的scopes属性,还有configFactory,是一个返回Promise的函数。Config的Config是一个纯虚类:exportabstractclassConfig{}所以为了实现该接口依次将作用域定义为上下文字符串常量,并调用自己的resolveConfig方法返回一个promise对象。构造函数中注入的三个属性都是从config中导入的。resolveConfig调用baseSiteService获取所有baseSites,然后在第40行调用find方法返回满足谓词功能的单个站点实例:从报错信息Error:Cannotgetbasesiteconfig!当前url(${this.currentUrl})不匹配任何基本站点的任何url模式。好像第40行的代码是根据当前url判断是否可以匹配到一个定义好的基址。最后在第50行的map中,执行projection,将baseSite映射到其配置信息中。getConfig是返回输入源变量对应的属性,类型为BaseSite。isCurrentBaseSite在第79行将通过依赖注入获取的当前url,currentUrl与站点的urlPatterns数组进行比较,通过正则表达式实现。如果匹配,则表示当前url代表一个基站点。getUrlParams将OCC中使用的Storefront字面量映射到Spartacus中使用的常量baseSite:site-context-config.ts(SiteContextConfig类)导入core/config文件夹中的Config类,该类为纯虚类,源码导出抽象类配置{}。向其添加了上下文字段。下图中第15行是TypeScript的ModuleArgumentation语法,参考作者这篇文章。context-config-utils.ts(两个工具函数)getContextParameterValues工具方法返回string[],避免nullgetContextParameterDefault从这里我们可以看出返回ContextParameter默认参数的逻辑是,索引为0的元素数组是默认参数。default-site-context-config(defaultSiteContextConfigFactory)只有一个函数,负责返回默认的站点上下文,都是硬编码的货币和语言:这是一个工厂函数,用在SiteContextModule的forRoot静态方法中,并返回全局提供者的定义:使用工厂函数返回默认的站点上下文配置:base-site-config-validator.ts这个文件比较简单,里面包含一个validator验证器,没有复杂的逻辑:exportfunctionbaseSiteConfigValidator(config:SiteContextConfig){if(getContextParameterDefault(config,BASE_SITE_CONTEXT_ID)===undefined){return'请在使用店面库之前配置context.parameters.baseSite!';}}检查是否配置了默认的baseSite。
