В чем разница между «хранилищем и сетью» и «только для сети»?

#reactjs #relayjs #relay

#reactjs #relayjs #реле

Вопрос:

Я прочитал документацию, и меня все еще смущает разница между политикой выборки «хранилище и сеть» и «только для сети».

«хранилище и сеть»: будет повторно использовать локально кэшированные данные и всегда будет отправлять сетевой запрос, независимо от того, отсутствовали ли какие-либо данные в локальном кэше или нет.

«только для сети»: не будет повторно использовать локально кэшированные данные и всегда будет отправлять сетевой запрос для извлечения запроса, игнорируя любые данные, которые могут быть локально кэшированы в Relay.

Я просто не могу понять, в чем смысл «хранилища и сети». В нем утверждается, что он «будет повторно использовать локально кэшированные данные»… но он ВСЕГДА извлекается из сети, так ЧТО ИМЕННО ТО, ЧТО он может использовать повторно?

В моем приложении я экспериментировал с обоими, и я нахожу нулевую разницу в поведении. Может ли кто-нибудь расширить это и, возможно, продемонстрировать сценарий, в котором «хранилище и сеть» и «только для сети» фактически возвращали бы разные результаты запроса?

Ответ №1:

Политики ретрансляционной выборки существуют для того, чтобы вы могли контролировать, что происходит, когда у вас устаревшие или отсутствующие данные.

Документы раскрывают эту концепцию здесь: https://relay.dev/docs/en/a-guided-tour-of-relay#presence-of-data

Однако, чтобы подвести итог:

  1. Недостающие данные: мусор ретрансляции собирает данные в хранилище, когда обнаруживает, что определенная часть данных больше нигде не отображается. Это обрабатывается различными способами, но обычно связано с монтированием / размонтированием компонентов, которые поддерживают (редактируют) ссылку на конкретный фрагмент или запрос. Как только Relay обнаруживает, что в хранилище нет активной ссылки на некоторые данные, он планирует эти данные для сбора мусора.
  2. Устаревшие данные: данные все еще могут быть устаревшими, но не запланированы для сборки мусора. Это тот случай, когда данные не «отсутствуют» (как в # 1), а просто нуждаются в обновлении — вероятно, после мутации. Все еще есть ссылка на данные в хранилище через подключенный компонент.

С этим различием политика выборки «только для сети» будет буквально игнорировать кеш. Он не будет проверять, будут ли доступны данные, необходимые компоненту для визуализации; скорее, он всегда будет инициировать сетевой запрос и не зависит от наличия (или его отсутствия) или устаревания (или их отсутствия) данных в вашем хранилище, как если бы хранилище не существовало.

С другой стороны, политика выборки «хранилища и сети» чувствительна к наличию (или его отсутствию) или устареванию (или отсутствию) данных в вашем хранилище.

Он проверит, существуют ли данные, необходимые для отображения определенного компонента, в хранилище:

(a) если это произойдет, он выполнит рендеринг и попытается начать рендеринг дочернего дерева компонентов, которое пройдет аналогичный процесс проверки отсутствия данных;

(b) если в какой-либо момент рендеринга древовидный ретранслятор встречает компонент с требованиями к данным, которых нет в хранилище, компонент не может выполнить рендеринг, поэтому сетевой запрос всегда будет выполняться.

Итак, «хранилище и сеть» позволяет вам жестко контролировать, как будет отображаться дерево компонентов с различными требованиями к данным. Сетевой запрос будет выполняться всегда — политика выборки просто диктует, как реле должно обрабатывать рендеринг / приостановку рендеринга частей вашего поддерева компонентов, учитывая текущее состояние вашего хранилища.

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

Другими словами, политика выборки на самом деле зависит от того, как ваше приложение отображает, а не от того, как оно выполняет выборку.

Ответ №2:

После множества экспериментов я нашел ответ:

«только для сети» извлекает данные и не обновляет никаких значений в хранилище ретрансляции. Это не приведет к обновлению других фрагментов.

«хранилище и сеть» извлекает данные, а затем обновляет хранилище этими значениями. Это приведет к обновлению любых зависимых фрагментов, что затем приведет к отображению их компонентов.