基于single-spa的微前端框架qiankun项目的搭建教程

不管现实多么惨不忍睹,都要持之以恒地相信,这只是黎明前短暂的黑暗而已。不要惶恐眼前的难关迈不过去,不要担心此刻的付出没有回报,别再花时间等待天降好运。真诚做人,努力做事!你想要的,岁月都会给你。基于single-spa的微前端框架qiankun项目的搭建教程,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

介绍

qiankun 是一个基于 single-spa 的微前端实现库,旨在帮助大家能更简单、无痛的构建一个生产可用微前端架构系统。

什么是微前端

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

微前端架构具备以下几个核心价值:
  1. 技术栈无关
    主框架不限制接入应用的技术栈,微应用具备完全自主权

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

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

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

快速上手

主应用

1. 安装 qiankun
npm i qiankun -S
2. 在主应用中注册微应用
//main.js
import { registerMicroApps, start } from 'qiankun';

registerMicroApps([{
    name: 'sub1',
    entry: 'http://localhost:9003',//子应用等启用地址
    container: '#container',//子应用所展示的地址,在app.vue中设置的ID
    activeRule: '/sub1',//路由地址
    props: {
        navName: '123',
        id: 11
    }
}, {
    name: 'sub2',
    entry: 'http://localhost:9002',
    container: '#container',
    activeRule: '/sub2',
    props: {
        navName: '345',
        id: 22
    }
}, ]);

start();
//app.vue
<template>
  <div id="app">
    <div id="nav">
      <router-link to="/">Home</router-link> |
      <router-link to="/sub1">about</router-link> |
      <router-link to="/sub2">sub2</router-link>
    </div>
    <router-view/>
    <div id="container"></div>
  </div>
</template>

微应用

1.在 src 目录新增 public-path.js
if (window.__POWERED_BY_QIANKUN__) {
  __webpack_public_path__ = window.__INJECTED_PUBLIC_PATH_BY_QIANKUN__;
}
2.main.js 修改
vue2
import './public-path';
import VueRouter from 'vue-router'
import routes from './router';
Vue.use(VueRouter)

let router = null;
let instance = null;
function render(props = {}) {
  const { container } = props;
  router = new VueRouter({
    base: window.__POWERED_BY_QIANKUN__ ? '/app-vue/' : '/',
    mode: 'history',
    routes,
  });

  instance = new Vue({
    router,
    store,
    render: (h) => h(App),
  }).$mount(container ? container.querySelector('#app') : '#app');//主应用中设置的id
}

// 独立运行时
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);
  render(props);
}
export async function unmount() {
  instance.$destroy();
  instance.$el.innerHTML = '';
  instance = null;
  router = null;
}
vue3
import { createApp } from 'vue'
import {createRouter,createWebHistory} from 'vue-router'
import App from './App.vue'
import routes from './router'

let app
let router
let history
function render(props = {}){
  history = createWebHistory('/vue')
  router = createRouter({
    history,
    routes
  })
  app = createApp(App)
  const {container} = props
  app.use(router).mount(container?container.querySelector('#app'):'#app')
}

if(!window.__POWERED_BY_QIANKUN__){
  render()
}

// 子组件暴露三个函数
export async function bootstrap(props){
  console.log('我是bootstrap项目函数',props);
}
export async function mount(props){
  console.log('我是mount项目函数',props);
  render(props)
}
export async function unmount(props){
  console.log('我是vue项目unmount函数',props);
  history = null
  app = null 
  router = null
}

vue3不再new Vue了,而是使用createApp,注意和vue2有所区别

3.router路由配置
//router/index.js
const routes = [{
    path: '/',
    name: 'About',
    component: () =>
        import ('../views/About.vue')
}]

export default routes
4.打包配置修改vue.config.js
风格一
const { name } = require('./package');
module.exports = {
  devServer: {
    headers: {
      'Access-Control-Allow-Origin': '*',
    },
  },
  configureWebpack: {
    output: {
      library: `${name}-[name]`,
      libraryTarget: 'umd', // 把微应用打包成 umd 库格式
      jsonpFunction: `webpackJsonp_${name}`, //webPack5中删除了此属性
    },
  },
};
风格二
const { defineConfig } = require('@vue/cli-service')
module.exports = defineConfig({
  transpileDependencies: true,
  publicPath:'http://localhost:8083',
  configureWebpack:{
    output:{
      library:'vueApp',
      libraryTarget:'umd'
    }
  },
  devServer:{
    port:8083,
    headers:{
      'Access-Control-Allow-Origin':'*'
    }
  },
})

旧版本的webpack可能会报错defineConfig,可以去掉difineConfig(),只保留{}中的内容,或者升级新版webpack。
publicPath中的port和devServer中port中保持一致,可以根据你的项目修改。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/188439.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!