Используя сервер Nodejs / Express, мне удается кэшировать весь ответ, а не только apollo getMarkupFromTree.GetMarkupFromTree занимает много времени, чтобы закончить.Мне нужно просто кешировать эту часть, потому что я не хочу кешировать корзину покупок.
Часть содержимого (см. Ниже в коде) отображает только / потоков нижний колонтитул и nav когда Redis кэширует getMarkupFromTree.StartHtml, middleHtml, endHtml отображаются полностью.
Кэширование всего сайта работает хорошо.Попробовал добавил, жду разные части и все без изменений.redisCache.get (...) возвращает ожидаемый результат.ApolloClientExtract возвращает ожидаемый результат.
const renderer = async (req, res) => {
const redisCache = new RedisCache();
const helmetContext = {};
// APOLLO
const client = apolloClient(req);
// REDUX
const store = await reduxPersist(req);
const context = {};
// STYLED COMPONENTS
const sheet = new ServerStyleSheet();
// APPLICATION
const Root = () => (
<AppTree
client={client}
store={store}
helmetContext={helmetContext}
req={req}
context={context}
extractor={extractor}
/>
);
// REDUX
const finalState = store.getState();
// @loadable/server
extractor.collectChunks(<Root />);
extractor.getLinkTags();
// WRITE START HTML
res.write(startHtml({ extractor }));
// res.flushHeaders();
let apolloClientExtract = {};
let redisApolloExtract = '';
try {
redisApolloExtract = await redisCache.get('teuberkohlhoff apolloExtract');
} catch (err) {
console.log('Error', err);
}
// let markupFromTree = '';
if (redisApolloExtract) {
// ADDING getMarkupFromTree here leads to the expected result
renderToString(<Root />); // needed for @loadable/server
apolloClientExtract = redisApolloExtract;
} else {
// Apollo
await getMarkupFromTree({
renderFunction: renderToString,
tree: <Root />
});
apolloClientExtract = serialize(client.extract());
redisCache.set('teuberkohlhoff apolloExtract', apolloClientExtract);
}
// WRITE MIDDLE HTML
res.write(middleHtml({ helmetContext, scripts }));
// res.flushHeaders();
const content = sheet.collectStyles(<Root />); // HERE I think something is wrong
// PIPE CONTENT
const stream = sheet.interleaveWithNodeStream(renderToNodeStream(content));
stream.pipe(
res,
{ end: false }
);
const reduxFinalState = serialize(finalState);
// WRITE END HTML
stream.on('end', () => res.end(endHtml({ extractor, apolloClientExtract, reduxFinalState })));
};
Как работает getMarkupFromTree и что такое возврат?
Как правильно кешировать getMarkupFromTree?