Я новичок в Flux / React, и мне сложно понять некоторые фундаментальные архитектурные решения:
- Я знаю, что все магазины должны быть одиночными, но все ли они создаются при запуске приложения или время жизни магазина может быть меньше в зависимости от действий пользователя?
- Могу ли я иметь несколько экземпляров одного и того же типа магазина, каждый из которых инициализирован с разным контекстом?
К сожалению, все примеры, которые я видел, кажутся слишком упрощенными, чтобы ответить на эти вопросы. Начнем с примера чат-приложения Facebook. Есть несколько цепочек, каждая с сообщениями. MessageStore содержит все сообщения для всего приложения, а метод getAllForThread (id) возвращает отфильтрованное подмножество сообщений. Когда сообщение поступает в ЛЮБОЙ поток, оно излучает уведомление об изменении, которое заставляет компонент реакции MessageSection повторно извлекать данные (независимо от того, какой поток просматривает пользователь). Это явно не масштабируется. Что, если бы у нас было 10 000 цепочек с большим количеством сообщений в каждой? Вот как я решил решить проблему:
- Каждое хранилище сообщений инициализируется идентификатором потока.
- Создайте одноэлементный MessageStoreFactory, который создает хранилища сообщений и управляет ими.
- Когда пользователь нажимает на поток, вместо того, чтобы компонент React подписался на глобальное хранилище сообщений, он запрашивает у MessageStoreFactory хранилище сообщений для этого конкретного потока.
- Если фабрика уже имеет хранилище сообщений для этого потока, она его возвращает. В противном случае он создает его, запускает асинхронную задачу, чтобы получить для него исходные данные, и возвращает их.
- Когда компонент React отключается (допустим, пользователь уходит от него), он уведомляет Factory о том, что с Store все сделано. Использование подсчета ссылок или какой-либо другой логики кеширования позволит Factory удалить неиспользуемые хранилища.
Насколько я далек от базы с таким подходом? Есть ли более простой подход, который все еще масштабируется?