Микро-интерфейсное приложение

У меня есть 1 проект, который разделен на несколько SPA, у меня 5 SPA, написанных на 2 на Angular, 2 на реакции и 1 на vue js. Теперь у меня есть интегрированный сервер, который будет обслуживать разные файлы в соответствии с маршрутизацией. Мне нужно передавать данные из одного приложения в другое с минимальным взаимодействием с базой данных. Это сценарий микро-интерфейсов. Надеюсь, это решит мою проблему.

Любая помощь будет оценена по достоинству.

Вы можете разделить общий магазин между ними. например: mobx совместим со всеми из них

sumit 12.07.2018 06:22

Где этот mobx хранит данные, в локальном хранилище, файлах cookie или где-то еще? Как он обменивается данными между разными приложениями? это самый важный вопрос перед внедрением в проект.

ngWolf 13.07.2018 12:31
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
2
1 650
3

Ответы 3

Есть три способа обмена данными:

  1. URL: параметры запроса / параметры пути (только для небольших данных, таких как идентификатор, фильтры и т. д.)
  2. Хранилище сеансов: используйте это, только если вы не переходите к другой вкладке / окну.
  3. Локальное хранилище: самый удобный и предпочтительный способ

Конечно, если вы сохраняете состояние в локальном хранилище, вам придется самостоятельно обрабатывать сброс состояния, когда пользователь выходит из системы.

Это немного болезненный процесс. Вам нужно будет написать код для управления сериализацией и десериализацией JSON в локальное хранилище. Чтобы упростить это, лучше, если у вас будет одно и то же решение для управления состоянием для всех микроприложений. Я рекомендую для этого использовать Redux / MobX. Но если вы используете Redux для React, Ng-Rx для Angular и Vuex для Vue, то готового решения у вас не будет.

Кроме того, когда вы сохраняете состояние в локальное хранилище, либо откажитесь от него, либо сделайте это лениво с небольшой задержкой по соображениям производительности.

Мы используем микро-интерфейсы в течение последних двух лет, и мы используем сочетание локального и сеансового хранилища для работы. К счастью, для всех приложений мы используем Redux, даже с Vue, и это позволяет нам использовать redux-localstorage.

Вы также можете использовать файлы cookie, но, как правило, их лучше избегать.

Данные, которые будут сохранены в localstorage, могут быть токеном jwt. Я думаю, что хранить токен и другие важные вещи на локальном хранилище - не лучшая идея. я могу сделать некоторые манипуляции, но есть ли способ, который не выставляет токен на стороне клиента?

ngWolf 12.07.2018 07:49

@Amit, это JWT значит зашифровано. Никто не может прочитать его без ключа дешифрования. Так что вам не о чем беспокоиться. Кроме того, в тот момент, когда токен отправляется клиенту, храните вы его или нет, токен в любом случае будет открыт.

Harshal Patil 12.07.2018 11:25

Я понимаю, что JWT зашифрован и может быть расшифрован с помощью ключа дешифрования, но он уязвим для XSS-атаки, потому что конфиденциальные данные открыты, что означает, что их можно копировать и делать запросы к нашим веб-сайтам, о которых мы, возможно, не знаем. Сторонняя библиотека JS может быть способом. Я не поддерживаю хранение JWT, или любые подобные данные не должны храниться в локальном хранилище. Любая другая вещь, которая может заменить локальное хранилище, решит мою проблему. Если я ошибаюсь, скажите, пожалуйста. И предложите, пожалуйста, любой другой вариант.

ngWolf 12.07.2018 12:32

Да @ Амит, согласен. Если вы пользуетесь сторонним сервисом, то вы открыты для XSS. В этом случае вы просто не можете использовать что-либо, кроме файлов cookie. И ваши файлы cookie должны быть httpOnly cookie. Вам придется жить без JWT на стороне клиента. Нет другого пути без участия сервера в картине.

Harshal Patil 13.07.2018 05:36

Да, я все еще ищу лучший подход. В любом случае спасибо.

ngWolf 13.07.2018 08:18

@IoneWolf Храните свои токены в файлах cookie с помощью httpOnly. Таким образом, они не подвержены XSS-атакам и прозрачно устанавливаются браузером, то есть в течение одного сеанса они будут доступны для всех ваших различных SPA.

Christian Ulbrich 29.08.2018 00:15

Не понимал, как привязка токена с файлами cookie не будет подвержена XSS. Если как злоумышленник, я могу внедрить свой JS. Я могу разговаривать с любыми ресурсами с сервером, и браузер с радостью прикрепит Cookie (токен). В любом случае у меня есть доступ к Токену прямо или косвенно.

prabhatojha 26.11.2020 09:17

@prabhatojha Используйте безопасный файл cookie вместе с флагом httpOnly. Это предотвращает чтение со стороны клиента. Кроме того, механизм CORS + CSRF предотвратит проблемы с перекрестными доменами.

Harshal Patil 26.11.2020 11:00

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

Вы также можете использовать RxJS Subject в качестве шины сообщений в вашей оболочке приложения и подписаться на нее в приложениях Micro Frontend. Вот пример

Надеюсь, это даст вам пару дополнительных идей.

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

var event = new CustomEvent('userData', { "detail": { "id": id, ...rec } });
window.dispatchEvent(event);

а для получения данных в другом приложении:

window.addEventListener("userData", function (e: CustomEvent) {
      this.id = e.detail.id;
      this.country = e.detail.country;
      this.contact = e.detail.contact;
      this.company = e.detail.company;
      this.changeDetectorRef.detectChanges();
}.bind(this));

Этот подход не требует связи с БД.

Надеюсь, это решит ваш вопрос !!!

Удачного кодирования !!!

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