Используйте serviceworker для переключения маршрутов без отправки запроса на сервер

У меня есть приложение React с react-router-dom. Статические файлы (index.html, blah blah.js, ...) обслуживаются с помощью Apache server, который перенаправляет все запросы к index.html с помощью .htaccess. Я использую Webpack для компиляции всего кода реакции и бабел-кода в один файл .js. Весь контент загружается при первом посещении (плюс задействованный cache first SW) .

Каждый раз, когда загружается маршрут (например, /profile), запрос передается на сервер (отправляется HTTP-запрос), вызывая ненужную задержку.

Как я могу переключать маршруты, не отправляя никаких запросов на сервер?

Можно ли использовать Service Worker (точно так же, как метод My cache first)?


Вот мой реагирующий компонент маршрутизатора

class App extends React.Component{
   render(){
       return(
            <BrowserRouter>
                <Switch>
                    <Route path = "/" exact component = {Home} />
                    <Route path = "/profile" exact component = {Profile} />
                    <Route path = "/about"  component = {About}/>

                </Switch>
            </BrowserRouter>
        );
   }     
}
ReactDOM.render(<App/>,document.getElementById('root'));

Когда вы говорите, что /profile загружен, что вы имеете в виду? Вы нажимаете URL-адрес в браузере? Или вы используете маршрутизацию на стороне клиента? Можете ли вы опубликовать код и добавить дополнительную информацию к своему вопросу?

yaswanth 22.08.2018 19:22

Я хочу маршрутизацию на стороне клиента без хешированного URL-адреса (нет /#!/profile, только /profile

Anandhu 22.08.2018 19:44

Полагаю, вопрос не об этом. В любом случае, BrowserRouter не даст вам хешированных URL-адресов, если я не ошибаюсь.

yaswanth 22.08.2018 23:10

правда, но мне нужен какой-то механизм для перемещения по моим маршрутам без фактического выполнения HTTP-запроса (поскольку весь требуемый код уже загружен браузером). Я проверяю, могу ли я разместить сервис-воркера между навигацией и предотвратить бесполезный HTTP-запрос.

Anandhu 22.08.2018 23:17

Я не вижу в вопросе HTTP-запроса? При переключении маршрута рендерится компонент Profile, вот и все. Не уверен, что я что-то упускаю.

yaswanth 22.08.2018 23:20

В этот момент браузер переходит на сервер Apache и перенаправляет запрос на index.html (используя .htaccess RewriteRule), а затем визуализируется компонент Profile.

Anandhu 22.08.2018 23:23

Позвольте нам продолжить обсуждение в чате.

yaswanth 22.08.2018 23:24
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
7
1 323
1

Ответы 1

То, что вы пытаетесь сделать, известно как Архитектурный шаблон "Application Shell".

Хитрость заключается в том, чтобы обработчик fetch вашего сервис-воркера проверял, является ли входящий запрос навигация (event.request.mode === 'navigate'), и если да, отвечать кэшированным HTML-кодом оболочки приложения (который в вашем случае звучит как /index.html).

Общий способ сделать это:

self.addEventListener('fetch', (event) => {
  if (event.request.mode === 'navigate') {
    event.respondWith(caches.match('/index.html'));
  } else {
    // Your other response logic goes here.
  }
});

Это заставит вашего сервис-воркера вести себя аналогично тому, как ваш веб-сервер уже настроен.

Спасибо, информация о "оболочке приложения" была очень полезной. Похоже, это моя точная проблема.

Anandhu 24.08.2018 05:07

Другие вопросы по теме