无界(wujie)微前端集成react和vue3实战

管理后台项目,前端使用react+antd开发,新框架选型smartadmin vue3,技术方案为使用前端微服务集成两个项目,主应用为vue3,子应用为react;

前端微服务框架目前主流的有qiankun,wujie,MicroApp,推荐排名(引用大佬的图片)如下:

选用无界的原因:

        1.对子应用侵入少;

        2.接入成本较低;

        3.官方文档和示例很棒;

子应用篇:

        1.判断是否是子应用运行环境并隐藏菜单栏和导航栏,具体效果通过isSubapp控制;

export default function App() {
  const [isSubapp, setIsSubapp] = useState(window.top !== window);
  const [local] = useRecoilState(globalAtom.locale);
  return (
    <ConfigProvider locale={local.antd} componentSize="middle">
      <div className={`App ${isSubapp? "isSubapp" : ""}`}>
        <AutoRoutes></AutoRoutes>
      </div>
    </ConfigProvider>
  );
}

        2.菜单权限添加version标记用来区分子应用还是主应用,在子应用里面隐藏主应用的菜单,仅构建子应用的路由,子应用依然可以单独使用;

      //获取登录用户信息
      const res = await loginApi.getLoginInfo();
      //仅保留v1版本的菜单
      res.data.menuList = res.data.menuList.filter((item:any) => {
        return item.version == 'v1';
      });

主应用篇:

     

1.安装和引入wujie

npm install wujie-vue3 -s
import WujieVue from 'wujie-vue3';
...
app.use(WujieVue).mount('#app');

2.根据菜单version标记处理子应用路由,统一指向sub路由和sub组件;

    //获取登录用户信息
    const res = await loginApi.getLoginInfo();
    //子应用路由处理标记v1
    res.data.menuList = res.data.menuList.map((item) => {
      let obj = {...item};
      if(obj.menuType==2 && obj.version == 'v1'){
        obj.path = `/reactsub${obj.path}`;
        obj.component = `/system/reactsub/index.vue`;
      }
      return obj;
    });

3.创建子应用路由和组件;

import { homeRouters } from './system/home';
import { loginRouters } from './system/login';
import { helpDocRouters } from './support/help-doc';
import NotFound from '/@/views/system/40X/404.vue';
import NoPrivilege from '/@/views/system/40X/403.vue';
import Reactsub from '/@/views/system/reactsub/index.vue';

export const routerArray = [
    ...loginRouters,
     ...homeRouters, 
    ...helpDocRouters, 
    { path: '/reactsub/:path', name: 'react-sub', component: Reactsub },
    { path: '/:pathMatch(.*)*', name: '404', component: NotFound },
    { path: '/403', name: '403', component: NoPrivilege }
];
<template>
  <div class="user-subapp">

    <WujieVue
      width="100%"
      height="100%"
      name="server"
      :url="serverUrl"
      :alive="false"
      :sync="true"
      :after-mount="afterMount"
    />
  </div>
  
</template>
<script setup>
  import { computed, ref } from 'vue';
  import { useUserStore } from '/@/store/modules/system/user';
  import _ from 'lodash';
  import WujieVue from 'wujie-vue3';  
  import { useRouter } from 'vue-router';
  const router = useRouter();
  const serverUrl = computed(() => {
    return `${import.meta.env.VITE_SUBAPP_URL}#/${router.currentRoute.value.path.replace('/reactsub/', '')}`;
  });
</script>
备注:

1.wujie支持hash路由和history路由,示例为hash路由模式,切换histrory模式只需要去除serverUrl里面的#/即可;

2.子应用的antd select组件会有下拉框位置异常的问题,wujie官方文档常见问题有说明,可参照处理;无界 | 无界

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue 3 和 wujie 前端中,`destroySubApp` 方法的使用方法如下: 1. 首先,在主应用中,通过 `app.config.globalProperties` 添加一个全局方法 `destroySubApp`,用于销毁子应用。比如: ```javascript app.config.globalProperties.destroySubApp = function(appName) { // 销毁子应用的逻辑代码 // appName 是子应用的名称,用于标识需要销毁的子应用 } ``` 2. 在主应用的路由守卫或其他需要销毁子应用的地方,调用 `destroySubApp` 方法。传入子应用的名称作为参数,以标识需要销毁的子应用。比如: ```javascript router.beforeEach((to, from, next) => { // 判断当前页面是否需要销毁子应用 if (to.meta.destroySubApp) { app.config.globalProperties.destroySubApp(to.meta.appName); } next(); }); ``` 3. 在子应用中,通过 `import { createApp } from 'vue'` 导入 Vue 3 的 `createApp` 方法。 4. 在子应用中,创建一个全局的 Vue 实例,并将其赋值给一个变量,比如 `const app = createApp(App)`,其中 `App` 是子应用的根组件。 5. 在子应用中,通过 `app.mount` 方法将根组件挂载到 DOM 中。子应用的启动和销毁逻辑可以在这里实现。 通过以上步骤,当需要销毁指定子应用时,在主应用中调用 `destroySubApp` 方法,并传入子应用的名称作为参数。在子应用中,可以在挂载和销毁阶段实现相应的逻辑。请根据你的具体需求,替换代码中的注释部分以实现对子应用的销毁操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值