Что может привести к двойной загрузке шрифтов и изображений при использовании React с SSR?

#reactjs #server-side-rendering

#reactjs #рендеринг на стороне сервера

Вопрос:

Я использую create-react-app и настроил SSR с помощью экспресс-сервера.

Когда я отключаю JavaScript, все работает отлично (ресурсы загружаются и отображаются).

Когда я включаю JavaScript, веб-сайт загружается с сервера, как и ожидалось, но затем hydrate запускает повторную загрузку ресурсов (каким-то образом эти ресурсы не кэшируются Firefox).).

Ошибка двойного запроса React

Вот заголовки для /static/media/fonts/open-sans-latin-400.woff2 (оба запроса кажутся идентичными, за исключением Accept-Encoding: gzip, deflate vs Accept-Encoding: identity ).

Первый запрос

Второй запрос

Что может вызвать такое поведение?

Комментарии:

1. С каких именно URL-адресов загружаются ресурсы? Возьмите один шрифт, который загружается дважды, и сравните их. Возможно, они объединены в два разных пакета? По вашему скриншоту трудно сказать

2. Привет, @Dominik, спасибо за помощь… URL-адреса идентичны. Я так озадачен.

3. Можете ли вы предоставить подробный скриншот для одного шрифта для обеих загрузок?

4. @Dominik, да, над этим!

5. @Dominik, готово!

Ответ №1:

Обнаружена проблема…

Я использую Express для обслуживания статических ресурсов.

По умолчанию для express.static установлено значение not cache assets ( Cache-Control: public, max-age=0 ) .

Следующее решило проблему кэширования, из-за которой шрифты и изображения загружались дважды.

 $ cat .env
EXPRESS_MAX_AGE=60000
 
 const expressStaticOptions = {
  maxAge: process.env.EXPRESS_MAX_AGE ?? 0,
}
app.use(express.static(join(__dirname, "build"), expressStaticOptions))
 

Причина, по которой я не устанавливаю 60000 по умолчанию, заключается в обработке конфигурации кэширования с использованием Nginx в рабочей среде.