qiankun微前端使用记录

1、新建两个项目,一个名为parent(主应用),注意主应用的CSS样式尽可能的自己手写,避免使用一些UI框架后,样式与微应用的产生冲突,一个child1(微应用)

2、主应用安装qiankun

npm i qiankun -S

3、主应用中新建一个子路由界面(child1),注意路径,用于接下来的微应用的渲染

import Vue from 'vue'
import VueRouter from 'vue-router'
import Home from '../views/Home.vue'

Vue.use(VueRouter)

const routes = [
  {
    path: '/',
    name: 'Home',
    component: Home
  },
  {
    path: '/child1/*',//注意路径
    name: 'child1',
    component: () => import('../views/child1.vue')
  }
]

const router = new VueRouter({
  mode: 'history',
  base: process.env.BASE_URL,
  routes
})

export default router

4、child1界面DOM结构如下

<template>
  <div>
    <div id="child1" class="child1"></div>
  </div>
</template>
<script>
export default {
  
}
</script>
<style scoped>
.child1{
  width: 100%;
  height: 500px;
}
</style>

5、设置App.vue界面,增加路由跳转链接,注意路径填写

<template>
  <div id="app">
    <div id="nav">
      <router-link to="/">Home</router-link> |
      <router-link to="/child1/">微应用1</router-link>
    </div>
    <router-view/>
  </div>
</template>

6、在main.js中,增加启动微前端配置信息,如下

import Vue from 'vue'
import App from './App.vue'
import router from './router'

Vue.config.productionTip = false
import { registerMicroApps,start } from 'qiankun';
registerMicroApps([{
    name: 'child1',//应用名称,唯一
    entry: process.env.NODE_ENV === 'development' ? '//localhost:1011' : '/child/child1/',//开发环境与生产环境下的启动路径
    container: '#child1',//与child1界面中的DOM结构的ID对应
    activeRule: '/child1/',//路径,与路由对应
    props:{//额外参数
      getToken:() => '获取到Token信息'
    }
  }]);
new Vue({
  router,
  render: function (h) { return h(App) }
}).$mount('#app')
//启动qiankun
start({
  sandbox: {
    // strictStyleIsolation = false,才可以获取到子应用的dom节点,主应用可修改子应用样式,但是子应用不可修改主应用的样式。
    strictStyleIsolation: true,
    experimentalStyleIsolation: true
  }
})

7、接下来配置微应用child1,新建vue.config.js文件,并且新增以下代码,建议将静态资源,如CSS、图片、JS代码放置在src文件夹里面,这样才会受publicPath的打包路径自动配置

const { name } = require('./package')
module.exports = {
  publicPath: process.env.NODE_ENV === 'production' ? '/child/child1/' : '/',//生产环境下的路径与开发环境的路径
  devServer: {
    headers: {
      'Access-Control-Allow-Origin': '*',
    },
    port:1011//对应第六步中配置的开发环境下的启动端口号
  },
  configureWebpack:{
    output: {
      library: 'child1',//必须与第六步中配置的微应用名称一致
      libraryTarget: 'umd'
    }
  }
};

8、在微应用的src文件夹下,新建public-path.js并新增以下代码

if (window.__POWERED_BY_QIANKUN__) {
    __webpack_public_path__ = window.__INJECTED_PUBLIC_PATH_BY_QIANKUN__;
}

9、修改微应用的路由配置文件

import Vue from 'vue'
import VueRouter from 'vue-router'
import Home from '../views/Home.vue'

Vue.use(VueRouter)

const routes = [
  {
    path: '/',
    name: 'Home',
    component: Home
  },
  {
    path: '/about',
    name: 'About',
    // route level code-splitting
    // this generates a separate chunk (about.[hash].js) for this route
    // which is lazy-loaded when the route is visited.
    component: function () {
      return import(/* webpackChunkName: "about" */ '../views/About.vue')
    }
  }
]

/* const router = new VueRouter({
  mode: 'history',
  base: process.env.BASE_URL,
  routes
}) */

export default routes//导出界面路径信息即可

10、在微应用中的main.js增加配置

import './public-path';//注意在头部引用第八步创建的文件
import Vue from 'vue';
import VueRouter from 'vue-router';
import App from './App.vue';
import routes from './router';

Vue.config.productionTip = false;

let router = null;
let instance = null;
function render(props = {}) {
  const { container } = props;
  router = new VueRouter({
    base: window.__POWERED_BY_QIANKUN__ ? '/child1/' : '/child/child1/',//激活路径与主应用配置的路由对应
    mode: 'history',
    routes,
  });
  instance = new Vue({
    router,
    render: h => h(App),
  }).$mount(container ? container.querySelector('#app') : '#app');
}

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

/**
 * bootstrap 只会在微应用初始化的时候调用一次,下次微应用重新进入时会直接调用 mount 钩子,不会再重复触发 bootstrap。
 * 通常我们可以在这里做一些全局变量的初始化,比如不会在 unmount 阶段被销毁的应用级别的缓存等。
 */
export async function bootstrap({getToken}) {
  //获取第六步传递过来的参数,绑定全局,即可在界面任意出获取主应用的token信息
  Vue.prototype.$getToken = getToken;
  //注意,主微应用通信不会太频繁,还可以使用浏览器缓存的形式代替数据传递,自行选择
}

/**
 * 应用每次进入都会调用 mount 方法,通常我们在这里触发应用的渲染方法
 */
export async function mount(props) {
  render(props);
}

/**
 * 应用每次 切出/卸载 会调用的方法,通常在这里我们会卸载微应用的应用实例
 */
export async function unmount() {
  instance.$destroy();
  instance.$el.innerHTML = '';
  instance = null;
  router = null;
}

11、分别启动两个应用,届时就能看到微前端已成功启动

12、预览完效果,接下来我们看打包后的效果,首先我们的打包必须是在同一IP与同一端口下,(其它情况请自行浏览官网查看配置项),https://qiankun.umijs.org/zh/cookbook#%E5%A6%82%E4%BD%95%E9%83%A8%E7%BD%B2

13、分别打包两个应用,然后将主应用与微应用按照以上文件路径形式存放

14、启动服务,即可在生产环境下预览效果,后续想要增加微应用,继续参照以上步骤一一添加再进行打包即可

参考文档:https://qiankun.umijs.org/zh

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Agwenbi

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

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

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

打赏作者

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

抵扣说明:

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

余额充值