乐趣区

关于saprfc:SAP-电商云-Spartacus-UI-SSR-里-engine-和-engine-instance-的区别

传入 originalEngine 到装璜器 decorateExpressEngine 里:

传出的是一个 engine 函数,engine 函数包含了 original Engine 这个函数,而后调用 engine 函数,同时将 Engine 参数传入,失去第二个 engine instance 函数。

最初的服务器端渲染,就是该 engine instance 函数负责解决。

咱们再来看看生产版本的 engine 实现原理:传入 decorator 的第一个 engine 实例,来自 Angular @nguniversal/express-engine:

这个装璜器返回一个新的函数。

(1) NgExpressEngine 的输出参数
(2) Spartacus 开发团队引入的优化参数,通过闭包传入
(3) Angular 规范的 NgExpressEngine 实例

在理论的生产代码里,通过装璜器的 get 办法,传入 nguniversal/express-engine 规范的 engine,返回 ngExpressEngine:

而后这个 ngExpressEngine 被作为参数,传入 server.engine 解决参数:

再看单元测试里的代码:传入装璜器的第二个参数为 null,意思是不应用 optimization engine:

第 135 行代码返回的是下图第 47 行的函数体自身:

如果咱们察看返回的 engine 实例,就能发现它外部蕴含两个闭包,存储了装璜器调用时,传入的 originalEngine 和 optimization option 的值:

接下来执行第 136 行代码,即 135 行装璜器返回的新函数的函数体:

当然,因为 ngExpressEngine 曾经被 mock 过了,所以返回 callFake 指定的 mock 版本的实现:

因为传入的 optimization option 为空,所以不应用 optimization engine,因而返回 original engine instance:

更多 Jerry 的原创文章,尽在:” 汪子熙 ”:

退出移动版