【发布时间】:2018-01-21 10:35:12
【问题描述】:
Angular 4.4.6
Angular CLI 1.3.2
Node 6.x.x
NPM 3.10.10
Webpack 3.4.1
在 Angular Universal 应用程序中,当服务器视图筛选到客户端视图时,屏幕会闪烁,因为所有在服务器端渲染中调用的 API,在客户端渲染中也被调用,因为存在闪烁。
为了消除这种闪烁,我实现了 Angular 通用传输模块,它在服务器端渲染时将数据存储在地图缓存 (private _map = new Map<string, any>();) 中,并将其传输到客户端,因此客户端不需要再次调用 api 并立即拥有缓存中的数据。
并且转移是通过这个提供者。
{
provide: APP_BOOTSTRAP_LISTENER,
useFactory: onBootstrap,
multi: true,
deps: [
ApplicationRef,
TransferState
]
}
export function onBootstrap(appRef: ApplicationRef, transferState: TransferState) {
return () => {
appRef.isStable
.filter(stable => stable)
.first()
.subscribe(() => {
transferState.inject();
});
};
}
这样闪烁消失了,但是应用性能下降了,在对应用进行负载测试时,闪烁的结果比不闪烁的应用更快,这是为什么呢?
可能是因为在负载测试或机器人访问网站的情况下,没有浏览器,因此缓存永远不会被清除,它只是用缓存填充服务器并且服务器变慢,可能是什么解决方案,要么通过在 nginx 级别识别请求,为机器人和真实用户创建不同的实例,要么在 Angular Universal 中我还缺少其他一些东西。
【问题讨论】:
-
投反对票的原因?
标签: javascript angular nginx angular-universal server-side-rendering