淺入深出的微前端MicroApp
來源:京東技術
導讀
本文將深入淺出地探討微前端架構模式——MicroApp,從微前端的基本概念、核心優勢以及如何在現代web開發中實現它,詳解微前端如何使得大型應用能夠分解為小型、簡單、可獨立開發和部署的子應用,同時還能保持各個子應用間的完整性和協調性。此外,本文還將探討實施微前端時可能遇到的挑戰和最佳實踐,為開發者提供一條清晰的實施路徑,幫助其構建更加靈活和可維護的前端生態系統。
本文將深入淺出地探討微前端架構模式——MicroApp,從微前端的基本概念、核心優勢以及如何在現代web開發中實現它,詳解微前端如何使得大型應用能夠分解為小型、簡單、可獨立開發和部署的子應用,同時還能保持各個子應用間的完整性和協調性。此外,本文還將探討實施微前端時可能遇到的挑戰和最佳實踐,為開發者提供一條清晰的實施路徑,幫助其構建更加靈活和可維護的前端生態系統。
微前端的概念
(6)基於多頁的子應用缺乏管理,規範/標準不統一,無法統一控制視覺呈現、共享功能和依賴,造成重複工作。
4.1 微前端框架選型
1. single-spa是一個將多個單頁面應用聚合為一個整體應用的 JavaScript 微前端框架。
2. qiankun 基於 single-spa 封裝的微前端框架。
本次專案使用的是umi+react+ts的技術棧,其實比較適合用qiankun,qiankun繼承了umi框架,但是這個框架配置起來比較麻煩。
4.1.2 MicroApp優勢
圖 2.
4.2 場景演示
最外層是基座,基座是微前端應用整合的一個重要平臺,同時也肩負著管理公共資源、依賴、規範的責任,主要有以下職責:
(7)多語言管理(最重要的一點)
圖 3.
4.3 搭建微前端基座
以react基座為例
1、建立專案
npm i @micro-zoe/micro-app --save
package.json檔案裡面dependencies裡面會多一行程式碼,看到下面程式碼則表示專案已經具備micro-app接入能力了。
"@micro-zoe/micro-app": "^1.0.0-alpha.7"
(4)在入口引入micro-app
import microApp from '@micro-zoe/micro-app'
microApp.start()
{
path: '/yp',
name: 'yp',
linkHidden: true,
linkDisable: true,
breadcrumbClose: true,
component: '@/pages/yp-app',
}
b. 子應用的檔案
在pages檔案下建立一個yp-app(子應用的檔案)
import React from 'react';
import config from '@/config';
// /** @jsxRuntime classic */
// /** @jsx jsxCustomEvent */
// import jsxCustomEvent from '@micro-zoe/micro-app/polyfill/jsx-custom-event';
export default (): React.ReactElement => {
// 子應用點選了麵包屑的回到首頁
const onDispathChild = (e: any) => {
const { isBackHome } = e.detail.data;
if (isBackHome) window.location.href = '/';
};
return (
<>
<micro-app name="yp" url={config?.yp} onDataChange={onDispathChild} />
</>
);
};
說明:onDataChange方法是子應用和主應用的資訊通訊方法,micro-app 在 window 下面掛載了一個全域性的物件,只需要去觸發它提供的方法,完成主子之間的通訊即可,不管是互動邏輯還是資料傳遞邏輯,就都通了。
c.主應用成功引入子應用(子應用是VUE專案)
圖 4.
//config.ts
let config = {
yp: '本地環境子應用的路由字首
};
const isEnvPro = process.env.NODE_ENV === 'production';
if (isEnvPro) {
config = {
yp: '預發環境環境子應用的路由字首
};
}
export default config;
//以上是config.ts檔案的全部-----end
//選單點選事件裡面的內容
history.push('/yp'); //切換到子應用
setTimeout(() => {
microApp.router.push({
name: 'yp',//和子應用的name要保持一致,為了匹配到對應子應用的路由
path: `${config.yp}${item.url}`,
}); //跳轉子應用的路由,其中config是上面的配置檔案,根據不同的環境取對應環境的子應用,item是當前點選的選單路徑資訊
}, 500);
這裡解釋下為什麼要用setTimeout,首先透過history.push('/yp')切換到子應用,防止切換過去之後短時間內找不到子應用的路由,所以加個延遲能夠準確的跳轉到子應用對應的路由。
devServer: { headers: { 'Access-Control-Allow-Origin': '*', }},
這個有相對應的文件,根據子應用的語言設定不同的跨域資訊。
(2)如果是介面跨域。
那麼就需要找後端設定允許前端跨域的程式碼了,以Java為例:
@Override public void init(FilterConfig filterConfig) { this.origins = Lists.newArrayList("); }
proxy: (() => { return { // 本地訪問預發 '/avoid': { target: '(req) => { if(req.headers.accept.indexOf('html') !== -1 ) { return '/index' } }, } }})()
最初本地代理是路由裡面包含'/'就代理到預發上,正常單獨訪問子應用的連結,可以正常訪問本地代理預發的介面,但是放到主應用裡面就不可以了,最後給代理改成了整個專案公共部分/avoid,解決了此問題,不一定專案是因為這個,但是可以從代理入手查詢問題。
子應用獲取來自基座應用的資料,以及基座應用向子應用傳送資料,基座應用獲取來自子應用的資料,全域性資料通訊詳細參考
雖說微前端已經是一個非常成熟的領域了,使用微前端目的就是為了降本提效,但是在現在的這個開源大環境,使用哪種框架,或者自己實現微前端都可以,個人覺得應該考慮如果當前的專案接入微服務之後,變得維護成本更高,那就要考慮是否適合微前端了,並不能為了用而用,微前端並不是適合所有的場景,遇到問題嘗試著去考慮多種方案方案解決。
來自 “ ITPUB部落格 ” ,連結:https://blog.itpub.net/70024420/viewspace-3006007/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 微前端microApp前端APP
- 淺入深出Vue:路由Vue路由
- 淺入深出Vue:元件Vue元件
- 【京東開源專案】微前端框架MicroApp 1.0正式釋出前端框架APP
- 淺入深出Vue:註冊Vue
- 淺入深出Vue:釋出專案Vue
- 淺入深出Vue:事件處理Vue事件
- 淺入深出Vue:資料渲染Vue
- Java 註解 (Annotation)淺入深出Java
- 前端如何理解正則-由淺入深的學習前端
- 淺入深出Vue:自動化路由Vue路由
- 淺入深出Vue:資料繫結Vue
- MySQL 頁完全指南——淺入深出頁的原理MySql
- 極致簡潔的微前端框架-京東MicroApp開源了前端框架APP
- 自學Web前端的五個不同階段,從淺入深Web前端
- promise由淺入深Promise
- 深入淺出的“深拷貝與淺拷貝”
- 淺入深出Vue:程式碼整潔之去重Vue
- 淺入深出Vue:程式碼整潔之封裝Vue封裝
- 淺入深出Vue:子元件與資料傳遞Vue元件
- MySQL索引由淺入深MySql索引
- JavaScript Promise由淺入深JavaScriptPromise
- 淺談qiankun微前端前端
- 淺析微前端沙箱前端
- 深入淺出深拷貝與淺拷貝
- 淺入深出了解XXE漏洞
- 物件導向-由淺入深物件
- 由淺入深理解Dubbo的SPI機制
- 淺入淺出webpackWeb
- 純手寫Promise,由淺入深Promise
- 由淺入深理解 IOC 和 DI
- Vue.js 2.0 由淺入深Vue.js
- iOS架構由淺入深 | MVVMiOS架構MVVM
- 淺入淺出 MySQL 索引MySql索引
- 第十八節:Skywalking由淺入深
- js 淺拷貝(淺複製、淺克隆)、深拷貝(深複製、深克隆)JS
- 淺入淺出圖解domDIff圖解
- 『淺入淺出』MySQL 和 InnoDBMySql