qiankun配置

406 阅读1分钟

主应用:

安装qiankun: npm i qiankun -S

App.vue中新建id为vue的div
<template>
  <div id="app">
    <el-menu :router="true" mode="horizontal">
      <!-- 基座中可以放自己的路由应用 -->
      <el-menu-item index="/">Home</el-menu-item>
      <!-- 引用其他子应用 
      <el-menu-item index="/vue">vue应用</el-menu-item>
    </el-menu>
    <!-- vue应用挂载处 -->
    <div id="vue"></div>
    <router-view/>
  </div>
</template>
main.js
import Vue from 'vue'
import App from './App.vue'
import router from './router'
import store from './store'
import elementUi from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css'
import { registerMicroApps, start } from 'qiankun'

// 注册方法
registerMicroApps([
  {
    name: 'vueApp', // 应用的名字
    entry: '//localhost:10000', // 默认会加载这个html,解析里面的js,动态的执行 (子应用必须支持跨域) (可以省略http:)
    container: '#vue', // 挂载html到哪个元素上
    activeRule: '/vue' // 激活规则/路径,当访问/vue时,就会挂载子应用
  }
])

// 启动 qiankun
start({
  prefetch: false // 取消预加载
})

Vue.config.productionTip = false

Vue.use(elementUi)

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

子应用:

(不需要安装任何插件了)

main.js
/* eslint-disable camelcase */
import Vue from 'vue'
import App from './App.vue'
import router from './router'
import store from './store'

let instance = null // 卸载应用需要

function render (props = {}) {
  const { container } = props
  instance = new Vue({
    store,
    router,
    render: (h) => h(App)
  }).$mount(container ? container.querySelector('#app') : '#app')
  // 这里是挂载到自己的html中,基座会拿到这个挂载后的html的,将其插入进去
}

// 独立运行时
if (!window.__POWERED_BY_QIANKUN__) {
  render()
}

// 作为微应用时加载正确的publicPath
if (window.__POWERED_BY_QIANKUN__) {
  // eslint-disable-next-line no-undef
  __webpack_public_path__ = window.__INJECTED_PUBLIC_PATH_BY_QIANKUN__
}

// props可以接受父应用传过来的各种属性,值,用来通信。也可以传递vuex数据
// 启动方法
export async function bootstrap (props) {
  console.log('[vue] vue app bootstraped')
}

// 应用挂载方法
export async function mount (props) {
  console.log('[vue] props from main framework', props)
  render(props)
}

// 应用卸载时
export async function unmount () {
  instance.$destroy()
  instance.$el.innerHTML = ''
  instance = null
}
router.js
const router = new VueRouter({
  mode: 'history',
  // base: process.env.BASE_URL,
  // 更改base,当你访问/vue时加载项目
  base: '/vue',
  routes
})
vue.config.js
module.exports = {
  devServer: {
    port: 10000, // 跟主应用协议好的端口号
    headers: {
      'Access-Control-Allow-Origin': '*' // 子应用必须允许跨域,方便主应用加载子应用的资源
    }
  },
  configureWebpack: {
    output: {
      library: 'vueApp',
      libraryTarget: 'umd' // 把微应用打包成 umd 库格式
      // jsonpFunction: `webpackJsonp_${name}`
    }
  }
}