vue3 + 微前端(qiankun)學習筆記


首先,什么是微前端

微前端(Micro-Frontends)是一種類似於微服務的架構,它將微服務的理念應用於瀏覽器端,即將 Web 應用由單一的單體應用轉變為多個小型前端應用聚合為一的應用。各個前端應用還可以獨立運行、獨立開發、獨立部署。

簡單來講就是當我們項目越來越大,越來越復雜,新的技術和老的技術相互糾纏,開發的人員越來越多,代碼量也隨之水漲船高的時候,我們就需要用微前端,將互不關聯的需求,新老不同的技術拆分開來,相互不干擾,彼此獨立。

微前端不是一個工具,也不是一個框架,是一個架構體系。

 

qiankun就是一款阿里系的幫我們實現微前端的一個工具,兼容vue,react,angular。

利用qiankun我們可以非常簡便的實現一個微前端的應用。

我們可以直接簡歷兩個vue的項目,此處以vue3為例,我們需要改動的只有main.js,vue.config.js和新增一個public-path.js文件。

假設你已經建立好了兩個vue3的項目,主頁面為A,子頁面為B(微前端頁面)。

主頁面A:

安裝qiankun:npm i qiankun

App.vue

<template>
  <div class="app">
    <div id="childDemo"></div> <!-- 微應用的容器 --> </div> </template>

main.js

import { createApp } from 'vue'
import App from './App.vue'
import vueRouter from 'vue-router'
import router from "./router"
import { registerMicroApps, start } from "qiankun"
let app = createApp(App);
app.use(vueRouter)
app.use(router)
app.mount('#app')
// 在主應用中注冊子應用
registerMicroApps([
  {
      name: "vue-app",  //微應用的名稱,有多個微應用的話,必須保證唯一
      entry: "//localhost:8081",  // 本地運行后子應用的訪問地址
      container: '#childDemo', // 微應用插入的位置
      activeRule: '/vue-child' // 微應用訪問入口
      props:{}//傳給微應用的數據
  }]
);
// 啟動 要等主頁面加載完畢才能啟動,即nextTick之后啟動
start(); 

vue.config.js

module.exports ={
  devServer: {
      port: 8080,
      headers: {	// 允許跨域訪問子應用頁面
          'Access-Control-Allow-Origin': '*',
      }
  }
}

至此主頁面的改動完成,接下來就是微應用的改動部分(微應用部分不需要安裝qiankun)

public-path.js

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

main.js

function render(props) {
  const { container } = props;
  app.use(router).mount('#vue')
}
if (!window.__POWERED_BY_QIANKUN__) {
  // 全局變量來判斷環境
  render()
}

/**
 * bootstrap 只會在微應用初始化的時候調用一次,下次微應用重新進入時會直接調用 mount 鈎子,不會再重復觸發 bootstrap。
 * 通常我們可以在這里做一些全局變量的初始化,比如不會在 unmount 階段被銷毀的應用級別的緩存等。
 */
export async function bootstrap () {
  console.log('現在進入子應用c-child的bootstraped階段')
}

/**
 * 應用每次進入都會調用 mount 方法,通常我們在這里觸發應用的渲染方法
 */
export async function mount (props) {
  console.log('現在進入子應用c-child的mount周期', props)

  render(props)
}

/**
 * 應用每次 切出/卸載 會調用的方法,通常在這里我們會卸載微應用的應用實例
 */
export async function unmount () {
  console.log('現在進入子應用c-child的unmount階段')
}

/**
 * 可選生命周期鈎子,僅使用 loadMicroApp 方式加載微應用時生效
 */
export async function update (props) {
  console.log('update props', props)
}

router.js

const router = createRouter({
  base: '/vue-child',//此處就是我們之前定義的微應用的入口路由
  history: createWebHistory('/vue-child'),
  routes
})

vue.config.js

const { name } = require('./package');
module.exports = {
    devServer: {
        port: 8081,		
        headers: {			// 允許子應用跨域
            'Access-Control-Allow-Origin': '*',
        },
    },
    // 自定義webpack配置
    configureWebpack: {
        output: {
            library: `${name}-[name]`,
            libraryTarget: 'umd',// 把子應用打包成 umd 庫格式
            jsonpFunction: `webpackJsonp_${name}`,
        },
        
    },
};

至此一個非常簡單的qiankun+vue的微前端就實現了。

參考的相關文檔:

qiankun API      

大佬 zhihua0123 的開源

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM