Как кэшировать представления, чтобы файлы не нужно было перечитывать и перерисовывать - PullRequest
0 голосов
/ 02 апреля 2020

У меня есть эти вызовы представления рендеринга:

router.get('/mcn', (req, res) => {
  res.render('product/mcn', { layout: 'product/layout', contactKey: 'mcn' });
});

router.get('/agency', (req, res) => {
  res.render('product/agency', { layout: 'product/layout', contactKey: 'agency' });
});

router.get('/esports', (req, res) => {
  res.render('product/esports', { layout: 'product/layout', contactKey: 'esports' });
});

router.get('/brand', (req, res) => {
  res.render('product/brand', { layout: 'product/layout', contactKey: 'brand' });
});

router.get('/analytics', (req, res) => {
  res.render('product/analytics', { layout: 'product/layout', contactKey: 'analytics' });
});

router.get('/rightsmanagement', (req, res) => {
  res.render('product/content-id', { layout: 'product/layout', contactKey: 'content-id' });
});

, как вы можете заметить - динамические c данные не передаются. Поэтому мне интересно, как я могу кэшировать эти представления? Примерно так:

const pug = require('pug');

 {
    const templateStr = fs.readFileSync(path.resolve(__dirname +'/../views/product/content-id'));

    const fn = pug.compile(templateStr, {});

    const html = fn({ layout: 'product/layout', contactKey: 'content-id' });

    router.get('/rightsmanagement', (req, res) => {
      res.send(html);
    });

  }

это правда? Я думаю, что мне не хватает некоторых заголовков? разве никто не знает, что такое правильные заголовки?

1 Ответ

1 голос
/ 02 апреля 2020

Я не уверен, что вы делаете с pug.compile() и всем, но вы можете использовать заголовок Cache-Control со значением max-age, чтобы указать браузеру кэшировать все, что вы отправляете:

router.get('/rightsmanagement', (req, res) => {
  // set max-age to whatever you think is best
  res.set('Cache-Control', 'max-age=31536000');
  res.send(html);
});

Возможно, вы можете использовать это в качестве промежуточного программного обеспечения для настройки рендеров, поскольку req.path включает в себя только динамическое c содержимое в ваших обработчиках, за исключением специального случая rightsmanagment маршрута:

const renderCacheView = (req, res, next) => {
  let path = req.path;
  if (path === 'rightsmanagement') path = 'content-id';
  // set max-age to whatever you think is best
  res.set('Cache-Control', 'max-age=31536000');
  res.render(`product/${path}`, { layout: 'product/layout', contactKey: path});
};

Я думаю, что вы могли бы даже сойти с рук вместо того, чтобы писать так много маршрутов, используя тот факт, что вы можете передавать регулярное выражение в качестве пути:

router.get(/mcn|agency|esports|brand|analytics|rightsmanagement/, renderCacheView);
...