Есть веб-сервер на express, на нём запилен angular universal. Работает он так что на каждый приходящий запрос серверного рендеринга он создаёт новый экземпляр ngModuleRef, бутстрапит его, ждёт когда приложение застабилизируется (isStable=true) и рендерит. Суть проблемы: сторы хранят наборы данных, запросы которые получаеют данные с АПИ по сетке ходят долго (объемы ~2-3 мб), но могли бы переиспользоваться как на клиенте, то есть 1 раз загрузить и потом брать из стора (выходит рендерится страница 5-6 сек). Начали копать
ngExpressEngine, переделали вот этот кусок кода:
const moduleRefPromise = setupOptions.aot ?
platformServer(extraProviders).bootstrapModuleFactory(moduleFactory as NgModuleFactory<{}>) :
platformDynamicServer(extraProviders).bootstrapModule(moduleFactory as Type<{}>);
moduleRefPromise.then((moduleRef: NgModuleRef<{}>) => {
handleModuleRef(moduleRef, callback);
});
на такой, чтобы переиспользовать модуль:
if (!moduleR) {
const moduleRefPromise = setupOptions.aot ?
platformServer(extraProviders).bootstrapModuleFactory(<NgModuleFactory<{}>>moduleFactory) :
platformDynamicServer(extraProviders).bootstrapModule(<Type<{}>>moduleFactory);
moduleRefPromise.then((moduleRef: NgModuleRef<{}>) => {
moduleR = moduleRef;
handleModuleRef(moduleR, callback, options.req, options.res);
});
} else {
handleModuleRef(moduleR, callback, options.req, options.res);
}
где moduleR прокидывается через замыкание из внешней функции. Убрали moduleRef.destroy() внутри handleModuleRef.
Но теперь при каждом последующем запросе отдаётся результат самого первого. Можно ли как-то "дестабилизировать" приложение или пнуть его с другим исходным url'ом? Или как нужно правильно реализовать кэширование уже существующего модуля? (на крайняк придется для тяжелых запросов поднимать локальный кэш-прокси к апи).