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 Universal Transfer Module, он хранит данные в кэше карты (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();
});
};
}
Таким образом, мерцание исчезло, но производительность приложения снизилась, при нагрузочном тестировании приложение мерцание происходит быстрее, чем в приложении без мерцания, почему это так?
Может быть потому, что в случае нагрузочного тестирования или в случае, если боты попадают на веб-сайт, нет браузера, поэтому кеш никогда не очищается, и он просто заполняет сервер кеш-памятью, и сервер становится медленным, что может быть решением для этого, либо создайте различный instace для ботов и реального пользователя, идентифицируя запрос на уровне nginx, т.е. есть еще кое-что, чего мне не хватает в angular universal.