Подумайте, какие проблемы необходимо решить для создания многофункционального динамического веб-интерфейса, и какие библиотеки / слои обычно решают эти проблемы за вас.
1.События DOM (щелчки и т. Д.) Должны вызывать изменения в состоянии
Это относительно просто.Узлы DOM предоставляют API слушателя на основе обратного вызова, который легко адаптировать к любой архитектуре.
2.Изменения в State должны инициировать обновления для узлов DOM
Это сложнее, потому что это нужно сделать эффективно и поддерживаемым способом .Вы не хотите перерисовывать весь ваш компонент с нуля всякий раз, когда изменяется его состояние, и вы не хотите писать тонны спагетти-кода в стиле jquery, чтобы вручную обновлять DOM, поскольку это было бы слишком подвержено ошибкам, даже если оно эффективно привремя выполнения.
Эта проблема в основном из-за того, что существуют такие библиотеки, как React, которые абстрагируются от виртуального DOM.Но вы также можете абстрагироваться без виртуального DOM, как это делает моя собственная библиотека Laminar .
Отказ от решения этой проблемы с помощью библиотеки работает только для более простых приложений.
3.Компоненты должны иметь возможность чтения / записи Global State
Это та часть, которую решает Flux / Redux.В частности, это проблемы №1 и №2, за исключением случаев, когда они применяются к глобальному состоянию, а не к состоянию компонента.
4.Кэширование
Кэширование затруднено, поскольку в какой-то момент кэш должен быть признан недействительным , помимо всего прочего выше.
Flux / redux не помогают с этимсовсем.Одна из библиотек, которая действительно помогает, - это Relay , которая работает так же, как ваше предлагаемое решение, за исключением более сложной и в дополнение к React и GraphQL.Чтение его документации поможет вам в вашей проблеме.Вы определенно можете реализовать небольшое подмножество функций реле в простом Scala.js, если вам не нужен весь багаж React / GraphQL, но вам необходимо знать предшествующий уровень техники.
5.Сериализация и безопасность типов
Это проблема only в этом списке, которая относится к Scala.js, в отличие от Javascript и SPA в целом.
Объекты Scalaнужно сериализовать, чтобы путешествовать по сети.В JSON, protobufs или что-то еще, но вам нужна система для этого, которая не будет включать подверженную ошибкам ручную работу.Существует множество библиотек Scala.js, которые решают эту проблему, таких как upickle, Autowire, конечные точки, ленивцы и т. Д. Ключевые слова: «Библиотека Scala JSON» или « Scala-безопасный RPC », в зависимости от того, чтоКакое решение вы хотите.
Я надеюсь, что эти принципы достаточны как ответ.Когда вы понимаете эти проблемы, должно быть очевидно, будет ли ваше решение работать для данного варианта использования или нет.На самом деле вы не описали, как ваше решение решает проблемы 2, 4 и 5. Вы можете использовать некоторые из упомянутых мной библиотек или реализовать собственные решения с похожими идеями / алгоритмами.
На небольшом техническом примечании рассмотрите возможность реализации асинхронного API на основе будущего для своего уровня кэша, чтобы он возвращал Future[Entity]
вместо Loading | Entity
.