test.js:
const FILE = ['./cms/facade/page-meta.service.spec.ts'];
context.keys().filter( name => !!FILE.includes(name)).map(context);
PageMetaService的作用是,解析到底有哪些 PageResolver 需要執行,並調度這些 PageResolver,執行對應方法。
這些 Page Resolver 的單元測試,位於文件 page-meta.service.spec.ts 內:
Page resolver 的實現,位於 page 文件夾內:
const PageMetaResolvers: PageMetaConfig = {
pageMeta: {
resolvers: [
{
property: 'title',
method: 'resolveTitle',
},
{
property: 'heading',
method: 'resolveHeading',
},
{
property: 'description',
method: 'resolveDescription',
disabledInCsr: true,
},
{
property: 'image',
method: 'resolveImage',
disabledInCsr: true,
},
{
property: 'breadcrumbs',
method: 'resolveBreadcrumbs',
},
{
property: 'robots',
method: 'resolveRobots',
disabledInCsr: true,
},
],
enableInDevMode: true,
},
};
PageMetaResolver 是一個 abstract class:
PageWithAllResolvers:實現了很多接口的類
可以使用 disabledInCsr 禁掉某個 resolver:
如果在開發模式下,不應該執行被禁用的 resolver:
service 就是 PageMetaService,執行 getMeta 並且 subscribe 之後,會觸發 page resolver 的執行。
先要執行該 Service 類的 CMS service,調用 getCurrentPage 拿到當前 CMS 頁面類型,再根據頁面類型拿到負責的 Meta Resolver,最後調用 Resolver 進行解析。
這就是 determine 出來的解析器:
看註釋:在 SSR 模式下,總是執行:
要執行這三個方法:
更多Jerry的原創文章,盡在:"汪子熙":