最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 微前端之乾坤实战

    正文概述 掘金(南方小菜)   2021-03-11   907

    前言

    接入上文,其实乾坤就是singleSpa的一个上层封装(前文链接:singleSpa实战),除了singleSpa的动态引入、应用隔离能力,还原生实现了样式隔离、静态资源接入等效果,话不多说,show me code

    正文

    既然是微前端,自然有多个前端应用,从而也必然存在一个底盘去承载这些前端应用,那我们先搭建好环境

    搭建模拟环境
    前置环境
    • vue的基层承载项目
    • react的微应用
    开始搭建
    1. 选择一个空文件夹作为根路径
    mkdir qiankun-study && cd qiankun-study
    
    1. 创建qiankun-base(此处用了vue,方便接入UI框架;其实是都可以的)
    vue create qiankun-base
    

    如果没有安装vue脚手架,可以执行如下命令进行安装

    npm i vue/@cli
    
    1. 创建vue项目
    vue create qiankun-vue
    
    1. 创建react项目
    npx create-react-app qiankun-react
    
    1. qiankun-base项目中建立路由,此处引入elementUi能稍微好看点儿

    注意在main.js中进行引入elementUI

    npm i element-ui
    

    main.js

    import Vue from 'vue'
    import App from './App.vue'
    import router from './router'
    import ElementUI from 'element-ui';
    import 'element-ui/lib/theme-chalk/index.css';
    
    Vue.config.productionTip = false
    
    Vue.use(ElementUI);
    new Vue({
      router,
      render: h => h(App)
    }).$mount('#app')
    
    

    然后改写主页面

    # App.vue
    <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-item index="/react">React应用</el-menu-item>
        </el-menu>
        // qiankun-base 项目本身的挂载点
        <router-view/>
        // vue应用项目挂载点
        <div id="vue"></div>
       	// react项目挂载点
        <div id="react"></div>
      </div>
    </template>
    
    

    效果如下

    微前端之乾坤实战

    此时我们点击另外两个路由是没反应的,很正常,因为还没接入乾坤,回想下singleSpa,我们有挂载点了,自然要进行启动子应用、支持打包成lib并在主应用中进行注册,这些,就是qiankun帮我们做的事情了

    进入第二个环节:接入qiankun

    接入qiankun

    首先,在qiankun-base中接入

    引入qiankun
    import {
      registerMicroApps,
      start
    } from 'qiankun';
    
    定义要注册的子应用
    const apps = [
      {
        name: 'vueApp',
        entry: '//localhost:10000',// 默认会加载这个html 解析里面的js 动态的进行执行fetch加载 (所以子应用必须支持跨域)
        container: '#vue',// 容器名
        activeRule: '/vue', // 激活的路径
        props: {
          a: 1
        }
    
      },
      {
        name: 'reactApp',
        entry: '//localhost:20000',// 默认会加载这个html 解析里面的js 动态的进行执行fetch加载 (所以子应用必须支持跨域)
        container: '#react',// 容器名
        activeRule: '/react' // 激活的路径
      }
    ]
    
    注册应用并启动
    // 注册应用
    registerMicroApps(apps);
    
    start({
      prefetch:false // 关闭预加载
    }) // 开启qiankun
    

    然后,在子应用中提供支持,主要是根据协议暴露函数、打包格式以及支持跨域

    Vue应用

    暴露函数
    let instance = null;
    
    // 渲染函数
    function render() {
      instance = new Vue({
        router,
        render: h => h(App)
      }).$mount('#app');  // 这里是挂载到自己的html中 基座会拿到这个挂载后的html 将其插入进去
    }
    
    
    if (window.__POWERED_BY_QIANKUN__) {
      __webpack_public_path__ = window.__INJECTED_PUBLIC_PATH_BY_QIANKUN__;
    }else {
      render()
    }
    
    
    export async function bootstrap() {
      
    }
    
    export async function mount(props) {
      render(props)
    }
    
    export async function unmount() {
      instance.$destroy();
    }
    
    设置打包格式及跨域

    根路径下创建vue.config.js文件

    module.exports = {
      devServer: {
        port: 10000,
        headers: {
          'Access-Control-Allow-Origin': '*',
        },
      },
      configureWebpack: {
        output: {
          library: `vueApp`, 
          libraryTarget: 'umd',// 把微应用打包成 umd 库格式
        },
      },
    }
    

    React应用

    暴露函数

    import React from 'react';
    import ReactDOM, { render } from 'react-dom';
    import './index.css';
    import App from './App';
    
    function reactRender() {
      ReactDOM.render(
        <React.StrictMode>
          <App />
        </React.StrictMode>,
        document.getElementById('root')
      );
    }
    
    
    if (!window.__POWERED_BY_QIANKUN__) {
      reactRender();
    }else {
      
    }
    
    export async function bootstrap() {
      
    }
    export async function unmount() {
      ReactDOM.unmountComponentAtNode( document.getElementById('root') );
    }
    export async function mount() {
      reactRender();
    }
    
    
    
    设置打包格式及跨域

    首先得先安装一个变线包 : react-app-rewired

    npm i react-app-rewired
    

    然后,在项目根路径下(和package.json同级)新建文件config-overrides.js,进行配置覆盖

    module.exports = {
        webpack: (config) => {
            config.output.library = 'reactApp';
            config.output.libraryTarget = 'umd';
            config.output.publicPath = 'http://localhost:20000';
            return config;
        },
        devServer: (configFunction) => {
            return function (proxy,allowedHost) {
                const config = configFunction(proxy,allowedHost);
                config.headers = {
                    'Access-Control-Allow-Origin': '*'
                }
                return config
            }
    
        }
    }
    

    最后,将所有脚本的react-scripts改写为react-app-rewired

    "scripts": {
        "start": "react-app-rewired start",
        "build": "react-app-rewired build",
        "test": "react-app-rewired test",
        "eject": "react-app-rewired eject"
    },
    

    至此,我们就完成了qiankun的接入,效果如下

    微前端之乾坤实战

    相关链接

    singleSpa实战

    微前端之自实现singleSpa


    起源地下载网 » 微前端之乾坤实战

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元