基於qiankunjs的微前端搭建

2021-10-12 04:21:08 字數 4790 閱讀 3146

qiankun: 乙個基於 single-spa 的微前端實現庫,旨在幫助大家能更簡單、**的構建乙個生產可用微前端架構系統。孵化自螞蟻金融科技基於微前端架構的雲產品統一接入平台

這裡使用react建立

# 2,.執行專案

# 4.安裝外掛程式

# 5.新建配置檔案, 在根目錄建立 config-overrides.js檔案

# 6.配置專案

module.exports =

, // extend/override the dev server configuration used by cra

devserver: function(configfunction)

return config;};

},};# 7.修改package.json

"scripts"

:

首先,需要按照qiankun.js 約定 匯出四個方法: bootstrap, mount, unmount, update

設定資源載入路徑:webpack_public_path= window.injected_public_path_by_qiankun, 需要判斷是否在qiankun內執行

環境判斷: window.powered_by_qiankun

import react from 'react';

import reactdom from 'react-dom';

import './index.css';

import reportwebvitals from './reportwebvitals';

function render(dom, props = {})

// 如果是單獨執行專案,則直接渲染

if (!window.__powered_by_qiankun__)

// to log results (for example: reportwebvitals(console.log))

// or send to an analytics endpoint. learn more:

reportwebvitals();

if (window.__powered_by_qiankun__)

/** * bootstrap 只會在微應用初始化的時候呼叫一次,下次微應用重新進入時會直接呼叫 mount 鉤子,不會再重複觸發 bootstrap。

* 通常我們可以在這裡做一些全域性變數的初始化,比如不會在 unmount 階段被銷毀的應用級別的快取等。

*/export async function bootstrap()

/** * 應用每次進入都會呼叫 mount 方法,通常我們在這裡觸發應用的渲染方法

*/export async function mount(props)

/** * 應用每次 切出/解除安裝 會呼叫的方法,通常在這裡我們會解除安裝微應用的應用例項

*/export async function unmount(props)

/** */

export async function update(props)

到此為止,子系統建立完畢

base系統,既系統基座,通過這個系統,將其他系統整合起來

# 2.執行專案

# 3.安裝qiankun外掛程式

yarn add qiankun # 或者 npm i qiankun -s

# 4.在入口檔案註冊微應用

// 主應用入口檔案

import react from 'react';

import reactdom from 'react-dom';

import './index.css';

reactdom.render(

document.getelementbyid('root')

);let child1 = // 自定義屬性

}let child2 =

}// 註冊微引用

// 啟動

start()

新增子應用容器元素,id使用註冊是定義的子應用id

新增路由,這裡使用react-router

// 主應用入口檔案

import from '@reach/router'

import home from './home'

return (

// 新增路由 切換微應用以及 主應內容

home |

// 顯示子應用

);}

執行主應用

到這裡, 我們就在完成了基本得微前端架構, 乙個主應用。兩個微應用

這裡使用qiankun提供的initglobalstate

在主應用初始化status

// 主應用入口檔案

import react from 'react';

import reactdom from 'react-dom';

import './index.css';

// 引入 initglobalstate, 建立乙個共享資料

const actions = initglobalstate()

actions.onglobalstatechange((state, prev) => );

reactdom.render(

document.getelementbyid('root')

);let child1 = // 自定義屬性

}let child2 =

}// 註冊微引用

// 啟動

start()

在子應用入口檔案匯出的mount方法中新增如下內容

// 從生命週期 mount 中獲取通訊方法,使用方式和 master 一致

export

function

mount

(props));

// 更新資料

props.

setglobalstate

(state)

;}

這邊我是使用了發布訂閱,實現 應用之間通訊

在主應用下新增發布訂閱檔案

// 臨時手寫 減少**量,專案中請參照node event模組自行分裝

const event =

,listen

(key, fn)

this

.clientlist[key]

.push

(fn)

// 訂閱的訊息新增進快取列表},

trigger

(type, money)

fns.

foreach

(fn =>)}

}export

default event

匯入發布訂閱檔案,並通過自定props傳遞給子應用

// 主應用入口檔案

import react from 'react';

import reactdom from 'react-dom';

import './index.css';

// 元件之間通訊

import event from './utils/event'

// 引入 initglobalstate, 建立乙個共享資料

const actions = initglobalstate()

actions.onglobalstatechange((state, prev) => );

reactdom.render(

document.getelementbyid('root')

);let child1 = // 自定義屬性

}let child2 =

}// 註冊微引用

// 啟動

start()

子應用訂閱/觸發事件

子應用需要從props中拿到event物件,然後訂閱/ 觸發事件

/**

* @desc 發布事件

*/const setchange = () =>

// 接收事件

const onchange = (...args) =>

/***/

const triggerevent = () =>

/*** @param args

*/const listener = (...args) =>

// 微應用時才執行

if (window.__powered_by_qiankun__)

到這裡, 微前端架構的資料共享,應用通訊已經完成,關於動態註冊應用,樣式隔離, 抽離公共依賴庫等優化可以自行檢視文件,個人公司沒有使用該架構,這裡只用來學習,相對demo會比較粗糙

最後附上完成**

手寫乙個微前端,qiankunjs

window.powered by qiankun true let module null const pushstate history.pushstate history.pushstate args export const start 處理函式 如果沒有匹配的子應用,則不處理 若上一次掛載...

微前端 跨域 做個微前端demo

之前已經分享過微前端,至於落地還是不落地就看公司和專案了,今天基於微前端做了個小demo,分享一下。可以去qiankun官網看看,包括微前端核心設計理念 為什麼不是ifram和快速上手及一些問題都很清楚。因為自己一直用的都是vue,所以基座和子應用都是用vue腳手架快速搭建,至於接入react和jq...

微前端 前端專案拆解簡述

1 系統龐大,涉及多個角色,角色互串,導致功能與功能之間的關係不清晰 2 角色對應的頁面劃分不清晰,系統和系統之間混雜在一起 3 前端專案過大,前端效能低下 4 組員多,專案管理難 1 角色清晰 角色所屬功能清晰 2 專案解耦,便於維護管理 3 專案上線,完全不會影響現有功能 4 效能進一步提公升 ...