微前端架构-无界实战

86 阅读2分钟

微前端是什么

微前端是一种多个团队通过独立发布功能的方式来共同构建现代化 web 应用的技术手段及方法策略。

  • 技术栈无关

    主框架不限制接入应用的技术栈,微应用具备完全自主权

  • 独立开发、独立部署

    微应用仓库独立,前后端可独立开发,部署完成后主框架自动完成同步更新

  • 增量升级

    在面对各种复杂场景时,我们通常很难对一个已经存在的系统做全量的技术栈升级或重构,而微前端是一种非常好的实施渐进式重构的手段和策略

  • 独立运行时

    每个微应用之间状态隔离,运行时状态不共享

正好公司一个老古董项目拿来进行改造 慢慢的进行减重

首先

主应用改造 ( 先来个简单的 毕竟是个老项目 能不动就先不动 能跑就行 )

//安装依赖
npm install wujie-vue2 -S

main.js

import WujieVue from "wujie-vue2";
const { bus, setupApp, preloadApp, destroyApp } = WujieVue;
Vue.use(WujieVue);

业务页面中引用

<template>
    <WujieVue width="100%" height="100%" name="vehicleInspectionData" :url="url" :props="props" :plugins="plugins"
        :sandbox="sandboxConfig">
    </WujieVue>
</template>

<script>
import {
    getToken
} from "@/utils/auth";
export default {
    data() {
        return {
            url: 'http://localhost:7400/',
            sandboxConfig: {
                // 开启样式隔离
                strictStyleIsolation: true,
                // 开启 scopedCSS 模式,会将子应用的样式转换为类似 Vue scoped 样式的形式
                scopedCSS: true,
            },
        }
    },
    computed: {
        props() {
            return {
                token: getToken(),
            }
        },
        plugins() {
        }
    },
    mounted() {
    },
}
</script>

<style lang="scss" scoped></style>

好了 主应用暂时简单改造完成 接下来子应用

先创建个vue2子应用

vue create children-vue2

App.vue 接受传递过来的参数 例如:token等

<template>
  <div id="app">
    <router-view />
  </div>
</template>

<script>
export default {
  name: 'App',
  data() {
    return {

    }
  },
  mounted() {
    const props = window.$wujie?.props;
    this.$store.dispatch('setToken', props.token)
    if (window.__POWERED_BY_WUJIE__) { document.documentElement.classList.add("isDialog") }
  }
}
</script>

<style lang="scss">
</style>

vue.config.js 进行跨域配置 不然主应用访问不到

module.exports = {
  devServer: {
    //解决主应用访问跨域问题
    headers: {
      "Access-Control-Allow-Origin": "*",
      "Access-Control-Allow-Headers": "*",
      "Access-Control-Allow-Methods": "*",
    },
    port:7400,
    //代理ip  ajax使用的
    proxy: {
      '/api': {
        target: 'xxxxxx',
        changeOrigin: true,
        pathRewrite: {
          '^/api': ''
        }
      }
    }
  }
}

ok 目前分别启动项目 可以跑起来 但是

问题1:样式冲突 尤其是弹框以及下拉框,时间弹出框等等那些会产生位置偏移问题

body中添加样式position: relative !important;

body中添加样式 .isDialog .el-popper { position: absolute !important; }

App中添加全局类名 isDialog

  1. index.html中
    body {
       position: relative !important;
     }
    
     .isDialog .el-popper {
       position: absolute !important;
     }
    
  2. App.vue中mounted中添加如果在无界环境下添加类名
    if (window.__POWERED_BY_WUJIE__) { document.documentElement.classList.add("isDialog") }
    

问题2:路由同步问题接下来再做