- SAP 电商云 Spartacus UI SSR 里 engin
- SAP 电商云 Spartacus UI 的 Product C
- SAP UI5 sap.ui.vk 命名空间内的控件介绍
- 网站上的 breadcrumb 使用场景浅析
- HTML 按钮(button)的 disable 属性和 dis
- SAP 电商云 Spartacus UI 产品搜索结果的设计明细
- SAP 电商云 Spartacus UI Proxy Facad
- Angular @Injectable 注解的工作原理浅析
- SAP 电商云 Spartacus UI 里如何捕捉语言设置的更
- 关于 Angular 部署以及 index.html 里 bas
传入 originalEngine 到装饰器 decorateExpressEngine 里:
![](https://img.haomeiwen.com/i2085791/3b923a2246bd3234.png)
传出的是一个 engine 函数,engine 函数包括了 original Engine 这个函数,然后调用 engine 函数,同时将 Engine 参数传入,得到第二个 engine instance 函数。
最后的服务器端渲染,就是该 engine instance 函数负责处理。
我们再来看看生产版本的 engine 实现原理:传入 decorator 的第一个 engine 实例,来自 Angular @nguniversal/express-engine:
![](https://img.haomeiwen.com/i2085791/692a13f898464e46.png)
这个装饰器返回一个新的函数。
(1) NgExpressEngine 的输入参数
(2) Spartacus 开发团队引入的优化参数,通过闭包传入
(3) Angular 标准的 NgExpressEngine 实例
![](https://img.haomeiwen.com/i2085791/5000a63632e33a7b.png)
在实际的生产代码里,通过装饰器的 get 方法,传入 nguniversal/express-engine 标准的 engine,返回 ngExpressEngine:
![](https://img.haomeiwen.com/i2085791/3f0dd65d7bfe5a91.png)
然后这个 ngExpressEngine 被作为参数,传入 server.engine 处理参数:
![](https://img.haomeiwen.com/i2085791/5710e9f5fe2cabae.png)
再看单元测试里的代码:传入装饰器的第二个参数为 null,意思是不使用 optimization engine:
![](https://img.haomeiwen.com/i2085791/5000c1399197da4e.png)
第135行代码返回的是下图第47行的函数体本身:
![](https://img.haomeiwen.com/i2085791/ce50023b8ca1b006.png)
如果我们观察返回的 engine 实例,就能发现它内部包含两个闭包,存储了装饰器调用时,传入的 originalEngine 和 optimization option 的值:
![](https://img.haomeiwen.com/i2085791/220ca249a2e55299.png)
接下来执行第136行代码,即 135行装饰器返回的新函数的函数体:
![](https://img.haomeiwen.com/i2085791/66901ccc3c358d80.png)
当然,因为 ngExpressEngine 已经被 mock 过了,所以返回 callFake 指定的 mock 版本的实现:
![](https://img.haomeiwen.com/i2085791/4d44ac0b7c487f6d.png)
因为传入的 optimization option 为空,所以不使用 optimization engine,因此返回 original engine instance:
![](https://img.haomeiwen.com/i2085791/15f72addfcbd9dcf.png)
更多Jerry的原创文章,尽在:"汪子熙":
![](https://img.haomeiwen.com/i2085791/97c4752c0e619c44.png)
网友评论