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 内:
![](https://img.haomeiwen.com/i2085791/1f19b82fa6eaa4b0.png)
Page resolver 的实现,位于 page 文件夹内:
![](https://img.haomeiwen.com/i2085791/1f685622d81c19f0.png)
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:
![](https://img.haomeiwen.com/i2085791/203fd3c0209f2ca2.png)
PageWithAllResolvers:实现了很多接口的类
![](https://img.haomeiwen.com/i2085791/dcfbbe27dc983e24.png)
可以使用 disabledInCsr 禁掉某个 resolver:
![](https://img.haomeiwen.com/i2085791/0289a2ff27da52fd.png)
如果在开发模式下,不应该执行被禁用的 resolver:
![](https://img.haomeiwen.com/i2085791/8c183f6fe716c482.png)
service 就是 PageMetaService,执行 getMeta 并且 subscribe 之后,会触发 page resolver 的执行。
先要执行该 Service 类的 CMS service,调用 getCurrentPage 拿到当前 CMS 页面类型,再根据页面类型拿到负责的 Meta Resolver,最后调用 Resolver 进行解析。
![](https://img.haomeiwen.com/i2085791/99cd00bad1459837.png)
这就是 determine 出来的解析器:
![](https://img.haomeiwen.com/i2085791/3c7da55ea8b0d97b.png)
看注释:在 SSR 模式下,总是执行:
![](https://img.haomeiwen.com/i2085791/a3eda2069ec0fb9a.png)
要执行这三个方法:
![](https://img.haomeiwen.com/i2085791/3c673c3fbf6dd871.png)
![](https://img.haomeiwen.com/i2085791/ac59ba6b0b53f778.png)
更多Jerry的原创文章,尽在:"汪子熙":
![](https://img.haomeiwen.com/i2085791/97c4752c0e619c44.png)
网友评论