基于qiankun实现微前端架构

14 篇文章 0 订阅

1、应用场景

主应用:vue3.x  +vite+Ts

子应用:模块使用 vue2.x开发

2、加载子应用的方式

qiankun加载子应用的方式分为:基于路由配置(registerMicroApps)和手动加载微应用(loadMicroApp)

根据业务需求现在加载 子应用的方式:

3、本案例采用手动加载微应用方式加载

import { loadMicroApp } from 'qiankun';
 

  const loadApp = (t) => {

        microApp = loadMicroApp({

        name: 'children1', // 应用的名字

        entry: 'http://localhost:8080/', // 默认加载这个html,解析里面的js动态的执行(子应用必须支持跨域,内部使用的是 fetch)

        container: '#children1', // 要渲染到的节点id

        props: { viewer: viewer }, //传参数

      })

    }

  };

4、子应用处理

4.1  子应用引入 public-path.js

(function () {
  if (window.__POWERED_BY_QIANKUN__) {
    // eslint-disable-next-line
    __webpack_public_path__ = window.__INJECTED_PUBLIC_PATH_BY_QIANKUN__
    // __webpack_public_path__ = `${process.env.BASE_URL}/`
  }
})()

4.2  修改 main.js



let instance = null

function render (props = {}) {
  const { container, routerBase } = props
  const router = new VueRouter({
    base: window.__POWERED_BY_QIANKUN__ ? routerBase : process.env.BASE_URL,
    mode: 'history',
    routes
  })
  // createEarthModule().then(function () {
  // PlotDraw.PIEInstance.setPIE(PIE);
  instance = new Vue({
    router,
    // store,
    render: (h) => h(App)
  }).$mount(container ? container.querySelector('#app') : '#app')
  // })

}
let _this = this;
if (!window.__POWERED_BY_QIANKUN__) {
  render()
}

export async function bootstrap () {
  console.log('[vue] vue app bootstraped')
}

export async function mount (props) {
  console.log('[vue] props from main framework', props)
  window.viewer = props.viewer;  //接受父应用传过来的参数
  render(props)
}

export async function unmount () {
  instance.$destroy()
  instance.$el.innerHTML = ''
  instance = null
}

5、卸载 

 /**
   * 卸载子应用app

      */


  const unloadApp = () => {

    if (microApp) {

      microApp.unmount(); // 卸载微应用

    }

  };

6、解决 字体图标显示问题

使用 url-loader进行转换

  chainWebpack: config => {
    config.module
      .rule("fonts")
      .test(/.(ttf|otf|eot|woff|woff2)$/)
      .use("url-loader")
      .loader("url-loader")
      .tap(options => {
        options = {
          // limit: 10000,
          name: '/static/fonts/[name].[ext]',
        }
        return options
      })
      .end()

  }

7、 样式隔离

7.1 原理

通过修改应用中 elementUi的 前缀来解决样式冲突问题

修改子应用或者主应用都可以

需要安装以下两个 依赖:

"change-prefix-loader"
"postcss-change-css-prefix":

7.2 配置 loader

在vue.config.js文件配置loader

  config.module
      .rule('change-prefix')
      .test(/\.js$/)
      .include.add(path.resolve(__dirname, './node_modules/element-ui/lib'))
      .end()
      .use('change-prefix')
      .loader('change-prefix-loader')
      .options({
        prefix: 'el-',
        replace: 'gp-'
      })
      .end()

7.3   配置 postcss.config.js,如果没有 创建一个新的

const addCssPrefix = require('postcss-change-css-prefix')

module.exports = {
  plugins: [
    addCssPrefix({
      prefix: 'el-',
      replace: 'gp-',
    }),
  ],
}

结果如下:


                
在使用 qiankun 构建前端应用时,我们需要分别构建主应用和子应用,并且需要注意它们之间的文件路径配置问题。 对于主应用,我们可以像普通的 Vue/React 应用一样进行构建,使用 webpack 或者其他构建工具进行打包。 对于子应用,我们需要在构建时指定输出路径,以便主应用可以正确地加载子应用的资源文件。具体来说,我们需要在子应用的构建配置文件中进行如下配置: 1. 设置 publicPath:在 webpack 配置文件中,设置 output.publicPath,将其设置为子应用部署的路径。比如,如果子应用部署在 http://localhost:8080/subapp1,那么 publicPath 应该设置为 /subapp1/。 2. 配置 output.path:将构建生成的文件输出到指定目录中,比如 dist/subapp1 目录。 3. 配置 filename:设置构建后生成的文件名,比如 [name].[hash:8].js。 完成上述配置后,我们需要在主应用中进行如下配置: 1. 在主应用中添加子应用的配置信息,包括子应用的名称、入口文件、路由信息等。具体可以参考 qiankun 官方文档进行配置。 2. 在主应用中加载子应用的资源文件,可以使用如下代码: ``` import { loadMicroApp } from 'qiankun'; loadMicroApp({ name: 'subapp1', entry: '//localhost:8080/subapp1', container: '#subapp-container', activeRule: '/subapp1', }); ``` 其中,entry 指定子应用的入口路径,container 指定子应用渲染的容器,activeRule 指定子应用的激活规则。 需要注意的是,主应用和子应用的文件路径配置需要保持一致,否则子应用的资源文件可能无法正确加载。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

易航动效

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值