基于阿里的qiankun 框架搭建的微前端

1.先搭建主项目

先安装qiankun框架 官网https://qiankun.umijs.org/zh/guide

cnpm i qiankun -S

1.在入口文件main.js添加配置

import { registerMicroApps, start } from 'qiankun'

const apps = [
  {
    name: 'vueApp', // 子应用的名称
    entry: '//localhost:9000', // 子应用的入口
    container: '#vue', // 子应用展示的容器
    activeRule: '/vue', // 子应用的router
    props: { a: 1 } // 父应用向子应用传递参数
  }
]

registerMicroApps(apps)
start({ prefetch: false, strictStyleIsolation: true })
// strictStyleIsolation css沙箱配置, prefetch 预加载配置

2.在布局layout文件下添加子应用容器

<el-menu :default-active="activeIndex" mode="horizontal" router>
  <el-menu-item index="/">基础的</el-menu-item>
  <el-menu-item index="/vue">vue</el-menu-item>
</el-menu>
<router-view/>
<div id="vue"></div>

2.子应用配置

1.使用qiankun,主应用必须接受三个函数,在main.js里面添加,并且判断是独立运行还是在主项目中引用

let instance = null
const render = (props) => {
  instance = new Vue({
    router,
    render: h => h(App)
  }).$mount('#vue-app');
}

if (window.__POWERED_BY_QIANKUN__) {
  __webpack_public_path__ = window.__INJECTED_PUBLIC_PATH_BY_QIANKUN__
}
if (!window.__POWERED_BY_QIANKUN__) { // 默认独立运行
  render();
}

// 子组件的协议就ok了
export async function bootstrap(props) {

};
export async function mount(props) {
  console.log(props)
    render(props)
}
export async function unmount(props) {
    instance.$destroy();
}

2.路由里面添加前缀

const router = new VueRouter({
  mode: 'history',
  base: window.__POWERED_BY_QIANKUN__ ? "/vue" : "/",
  routes
})

3.配置文件vue.config.js添加容许跨域配置headers

module.exports = {
  devServer: {
    port: 9000,
    headers: {
      'Access-Control-Allow-Origin': '*'
    }
  },
  configureWebpack: {
    output: {
      library: 'vueApp',
      libraryTarget: 'umd',
      jsonpFunction: `webpackJsonp_vueApp`,
    }
  }
}

到此基本的项目已经搭建完成了,但是我在项目中遇到一个重要的坑就是,点击vue在这里插入图片描述
包承载子项么的容器丢失
重点(坑)
原因是因为主项目和子项目都是用id为app,造成子项目直接挂在在app上,导致主项目里面承载子项目的容器丢失,此时应当改子项目的id

// app.vue
<div id="vue-app">
  <div id="nav">
    <router-link to="/">Home</router-link> |
    <router-link to="/about">About</router-link>
  </div>
  <div>header</div>
  <div>第一次提交</div>
  <router-view/>
</div>
// index.html
<noscript>
  <strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
</noscript>
<div id="vue-app"></div>

到此就没有了,后面有遇到再补充

Logo

前往低代码交流专区

更多推荐