将originalEngine传递给装饰器decorateExpressEngine:输出的是一个engine函数,包含了原Engine函数,然后调用engine函数,并在同时传入Engine参数,得到第二个引擎实例函数。最终的服务器端渲染由引擎实例函数处理。我们来看看生产版的引擎实现原理:第一个传入装饰器的引擎实例,来自Angular@nuniversal/express-engine:Thisdecoratorreturnsanewfunction。(1)NgExpressEngine的入参(2)Spartacus开发组引入的优化参数通过闭包传入(3)Angular标准NgExpressEngine实例在实际生产中通过装饰器的get方法传入nguniversal/expresscode-engine标准引擎,返回ngExpressEngine:然后将这个ngExpressEngine作为参数,传递给server.engine处理参数:再看单元测试中的代码:传递给装饰器的第二个参数为null,表示未使用optimizationengine:135行的代码返回了下图中47行的函数体本身:如果我们观察返回的engine实例,可以发现里面包含了两个闭包,分别存放了传入的originalEngine和optimization调用装饰器时option的值:接下来执行136行的代码,也就是135行装饰器返回的新函数的函数体:当然,因为ngExpressEngine已经mock了,所以返回mock的实现callFake指定的版本:因为传入的optimization为空,所以没有使用优化引擎,所以返回原引擎实例:Jerry更多原创文章在这里:《汪子熙》:
