【问题标题】:angular universal app performance, APP_BOOTSTRAP_LISTENER, flicker角度通用应用程序性能,APP_BOOTSTRAP_LISTENER,闪烁
【发布时间】: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


【解决方案1】:

编辑:此解决方案适用于 angular 5

当我遇到闪烁问题时,我只是将 BrowserTransferStateModule 添加到客户端应用程序

//app.module.ts
import {BrowserModule, BrowserTransferStateModule} from '@angular/platform-browser';
imports: [
//...
BrowserModule.withServerTransition({appId: 'my-app'}),
BrowserTransferStateModule,

然后 ServerTransferStateModule 到服务器应用程序

//app.server.module.ts
import {ServerModule, ServerTransferStateModule} from '@angular/platform-server';

//...
 imports: [
AppModule,
ServerModule,
ServerTransferStateModule

我修改了 main.ts 以在加载 dom 后启动应用程序

//main.ts
document.addEventListener('DOMContentLoaded', () => {
  platformBrowserDynamic().bootstrapModule(AppModule)
.catch(err => console.log(err));
});

我没有像你那样使用 APP_BOOTSTRAP_LISTENER(不确定它是否有影响)

【讨论】:

  • 谢谢大卫,你的闪烁就这样消失了吗?您使用的是什么 Angular 和 cli 版本?
  • 使用 Angular 5 和 cli 1.6.3
  • 如果您的网站存在并且可能,我可以获取到您网站的链接吗?
  • 抱歉,再过一个月左右就不会上线了
  • 实际上我所做的配置(不管有什么问题)是正确的,我们采取了一些其他措施来获得更好的性能,比如延迟加载、压缩、以某种方式在引导程序上减少 http 调用等,并且还增加了泊坞窗实例。
猜你喜欢
  • 2018-10-04
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
  • 2021-04-15
  • 2014-11-10
  • 1970-01-01
  • 2016-12-20
  • 2013-04-26
相关资源
最近更新 更多