所有常规路由采用 universal engine 实现:

将 req 的 app 属性保存到变量 app 里:

在浏览器里访问 localhost:4000,该请求转发给 app.render 函数。

这个 merge 操作,把对象 b 的属性,全部赋给对象 a:

首先试图从缓存中读取 view 实例:

读取 index 视图实例:

得到视图构造函数:


开始渲染:

调试模式:

调用 Universal Engine 进行渲染:


下列代码是我们团队同事编写的:

在哪里渲染好的呢?

入口函数:renderResponse



this.shouldRender 判断是否应该在服务器端渲染:

如果当前请求正在渲染,或者已经超过最大渲染并发数,那么就 fallback 到 CSR 渲染模式:

调用钩子函数,得出当前这个请求的渲染策略:

fallback 到 CSR 了:


在 CSR 模式下,把 index.html 的请求返回给客户端:

self 的指向:

我还没在 Visual Studio Code 里 attach nodejs 进程,/ 的 rendering 就结束了 ?!

如果给了一个很大的 timeout 值,就不用担心会 fallback 到 CSR 了:


此时这个 doc,里面包含的 selector 是空的:

Render an HTML document for a specific URL with specified render options:

上图就是 express-engine.js 的 render 实现函数。
下图:platform-server.js:

最终渲染的结果:

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











