首先,什么是微前端
微前端(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的微前端就實現了。
參考的相關文檔: