4

我遇到了一个问题,下面是场景:

我开发了一个vue 应用程序(my-admin 微应用程序) ,它有 4-5 个屏幕/组件(管理用户、管理通知、管理角色等),并且我创建了一个router.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')

最后我将我的这个微应用程序作为 web 组件(MainLayout 组件)包装在 main.js中,如下所示:

const myAdmin = wrap(Vue,MainLayout)

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

我使用以下命令构建了这个微应用:

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

这就是这个微型应用程序的全部内容。如果我单独运行这个微应用程序,它运行得很好。

但在我的场景中,我有一个仅在 Vue 中开发的 shell 应用程序(my-shell)。并且这个 shell 应用程序也有自己的 vue 路由器,并在其 main.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

将此路由器对象导入到 my-shell 的 main.js中,如下所示:

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

在 my-shell 的 index.html 中,我添加了标签(在里面)来加载我的微应用程序 buid(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. 

我能做些什么来摆脱这个错误?

4

1 回答 1

3

我没有尝试重新创建这种情况,但是我可以发现它不起作用的明显原因。

让我们简要看看启动 SPA 时会发生什么。 在此处输入图像描述

路由器在开始时初始化,即new Vue()您的子应用程序在中途附加,即在 Dom Rerender 上,按照这个顺序,您不能从应用程序中间跳回到顶部而不破坏初始路由器被丢弃或新的被拒绝。

我的建议:

不要在子应用(Web 组件)中使用 vue-router,使用轻量级代码来处理路由。

根据我做微前端架构的经验,整个目标是尽可能地坚持 SOLID 模式。如果您的子应用程序复杂到需要 vue-router 进行路由,那么您做的不对*。

通常,子应用程序应该只做一件事。

例如,在商业 SaaS 软件中,客户微应用只负责

  1. 创建新客户(弹出模式)
  2. 列出客户
  3. 查看单个客户的交易报告
  4. 编辑客户信息(弹出模式)

处理客户付款、债务和复杂的图表报告均由另一个子应用程序处理。

只有 2 和 3 需要路由,我们使用v-if语句来处理。

于 2020-02-02T10:52:57.473 回答