Micro Front End / веб-компоненты / Vue Ошибка маршрутизатора: Uncaught TypeError: Невозможно переопределить свойство: $ router - PullRequest
2 голосов
/ 02 февраля 2020

У меня возникла проблема. Ниже приведен сценарий:

Я разработал приложение vue (микро-приложение my-admin) , которое имеет 4 - 5 экранов / компонентов. (управлять пользователем, управлять уведомлениями, управлять ролями и т. д. c), и я создал маршрутизатор. js, где я написал следующее:

...imports... 
Vue.use(VueRouter);
// }
const routes = [
  {
    path: '/',
    name: 'main-layout',
    component: MainLayout,
    children:[
      {
        path : 'manage-user',
        name : 'manage-user',
        component : ManageUserComponent
      },
      {
        path : 'manage-role',
        name : 'manage-role',
        component : ManageRoleComponent
      }
    ]
  }
]

const router = new VueRouter({
  routes
})

export default router

и импортировал этот объект маршрутизатора в моем main. js как показано ниже:

...imports...
new Vue({
  router,
  render: h => h(App),
}).$mount('#app')

и наконец я обертываю это микро-приложение как веб-компонент (компонент MainLayout) в main. js как показано ниже:

const myAdmin = wrap(Vue,MainLayout)

window.customElements.define('my-admin', myAdmin)

i build это микро приложение со следующей командой:

"build": "vue-cli-service build --target wc --name my-admin ./src/main.js",

вот и все для этого микро приложения. и он работает отлично, если я запускаю это микро-приложение по отдельности.

Но в моем сценарии у меня есть приложение оболочки (my-shell), которое разработан только в Vue. и это приложение оболочки также имеет свой собственный маршрутизатор *1033* и импортируется в основной файл. js, как показано ниже:

. Маршрутизатор оболочки:

...imports... 

Vue.use(VueRouter);

const routes = [
  {
    path: '/',
    name: 'container',
    component: Container,
    children:[
      {
        path : 'admin',
        name : 'admin-microapp',
        component : AdminMicroAppContainerComponent
      },
      {
        path : 'other',
        name : 'other-microapp',
        component : OtherMicroAppContainerComponent
      }
    ]
 }
]

const router = new VueRouter({
  routes
})

export default router

и i импортировали этот объект маршрутизатора в основную часть my-shell. js как показано ниже:

new Vue({
  router,
  store,
  render: h => h(App)
}).$mount('#app')

и внутри индекса my-shell. html я добавил теги (внутри), чтобы загрузить мои микро приложения (файл my-admin. js), как показано ниже:

 <script src="../assets/my-admin/dist/my-admin.js"></script>
 <script src="../assets/other-microapps/dist/micro-app.js"></script>

Но когда я запускаю приложение my-shell. ниже выбрасывается ошибка :

Uncaught TypeError: Cannot redefine property: $router. 

Что я могу сделать, чтобы избавиться от этой ошибки?

1 Ответ

1 голос
/ 02 февраля 2020

Я не пробовал воссоздать этот сценарий, однако я могу определить очевидную причину, по которой он не работает.

Давайте кратко рассмотрим, что происходит при запуске SPA. enter image description here

Маршрутизаторы инициализируются в начале, т. Е. new Vue(), а ваши подпрограммы подключены на полпути, т. Е. В Dom Rerender, следуя этой последовательности, вы не можете перейти с В середине приложения вернитесь наверх, не ломая вещи, либо начальный маршрутизатор сброшен, либо новый отклонен.

Мой совет:

Не используйте vue -router в ваших подпапах (веб-компонентах) используйте облегченный код для обработки маршрутизации.

По моему опыту работы с архитектурой микро-интерфейса, вся цель состоит в том, чтобы максимально придерживаться шаблона SOLID , Если ваши подпрограммы сложны настолько, что для маршрутизации им требуется vue -router, значит, вы делаете это неправильно *.

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

Например, например, в программном обеспечении SaaS для бизнеса, клиентское микро-приложение отвечает только за

  1. Создание нового клиента (модальное всплывающее окно)
  2. Список клиентов
  3. Просмотр отчета о транзакции одного клиента
  4. Редактирование информации о клиенте (модальное всплывающее окно)

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

Только 2 и 3 требуют маршрутизации, и мы обрабатывали это с помощью операторов v-if.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...