日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

基于模塊聯邦與大倉模式的商家巨石應用拆分實踐

來源: 責編: 時間:2023-08-20 23:16:44 570觀看
導讀一、背景商家后臺前端代碼目前代碼量達到十萬級,每個迭代團隊需要在同一倉庫中迭代幾十個需求,在日漸龐大的巨石應用下如此活躍的迭代,開發效率與構建效率上給我們帶來了一些挑戰,我們需要優化以下幾點:代碼構建體量大,隨著

7Uo28資訊網——每日最新資訊28at.com

一、背景

商家后臺前端代碼目前代碼量達到十萬級,每個迭代團隊需要在同一倉庫中迭代幾十個需求,在日漸龐大的巨石應用下如此活躍的迭代,開發效率與構建效率上給我們帶來了一些挑戰,我們需要優化以下幾點:7Uo28資訊網——每日最新資訊28at.com

  1. 代碼構建體量大,隨著時間推移,構建速度的優化空間較少。
  2. 巨石應用下各個業務模塊沒有做物理拆分,管理與維護難度提升。
  3. 應用粒度較粗,在發布節點上需要對應用做進一步拆分以優化發布粒度。
  4. 巨石應用下,組件與業務的關系需要梳理,避免出現重復開發的情況。

微前端是目前解決應用拆分的主要解決方案,但是由于其隔離性的機制使得各個子應用間完全隔離,使得用戶在開發子應用時無法訪問其他子應用頁面,這對于各子應用存在關聯關系需要同時訪問開發的場景開發效率較低,并且目前市面上已經完全封裝的主流微前端框架對我們來說是黑盒,無法做到高度自定義,無法滿足特定拆分需求,因此我們決定采用模塊聯邦與大倉模式結合的方式解決以上問題。7Uo28資訊網——每日最新資訊28at.com

二、目標

提升構建與維護效率

將巨石應用進行拆分,獨立開發與部署、提升構建部署效率與代碼維護效率。7Uo28資訊網——每日最新資訊28at.com

雖是單個子應用開發,但可全量訪問巨石應用模塊

由于商家內部各應用間在業務上存在上下游的關系,我們在開發D子應用時,需要在其上游的C、B子應用中進行相關配置,它們之間是強綁定的關系,結論就是:需要在本地開發時,能夠同時使用其他子應用的頁面模塊的功能。7Uo28資訊網——每日最新資訊28at.com

三、技術方案

以上提到的提升構建與維護效率,目前微前端與MF方案都是支持的,關鍵點在于如何在本地開發能夠訪問到平臺的全量功能。本地代碼已經有了,啟動本地進程即可,那么,其他子應用如何訪問?7Uo28資訊網——每日最新資訊28at.com

微應用代理

如果是從本地再啟動其他應用,這其實就背離了應用拆分的初衷,同時也降低了本地開發的效率,同時隨著子應用越來越多,本地進程也會越來越多,這可能會大大影響本地開發效率??磥肀镜貑有胁煌?,那么從哪里訪問呢?對了,線上不是可以訪問到其他模塊嗎?但是怎么將本地開發與線上的模塊結合呢?由于目前商家后臺使用了MF方式在路由層或vue文件內遠程引入MF模塊,那么是否可以通過MF模塊轉發的方式將遠程組件代理至本地組件呢?7Uo28資訊網——每日最新資訊28at.com

7Uo28資訊網——每日最新資訊28at.com

以上的組件代理插件實質上是用于做MF組件加載管理的chrome插件,可以控制基座應用加載的模塊是線上的還是本地。7Uo28資訊網——每日最新資訊28at.com

7Uo28資訊網——每日最新資訊28at.com

代理方案如下7Uo28資訊網——每日最新資訊28at.com

7Uo28資訊網——每日最新資訊28at.com

  • 用戶首次進入線上測試環境,會加載遠程應用入口文件,代理插件會將入口文件根據用戶配置轉發至對應的本地地址。
  • 進入路由訪問,由于上一步對遠程應用入口做了代理,加載的模塊被代理至本地,這樣用戶就可以在線上訪問到本地頁面,實現本地開發。
  • 在線上基座應用與本地應用間建立websocket鏈接,本地應用代碼更改后通知線上基座應用刷新頁面。

下面是具體實現:7Uo28資訊網——每日最新資訊28at.com

generateRedirectUrl = (details: UrlDetailsType) => {    if (details.url.includes(MICRO_ONLINE_LOAD_PATH)) {      const redirectUrl = this.generateDefaultProxyUrl({ originUrl: details.url })      if (redirectUrl) {        console.log('觸發代理', `${details.url}代理至${redirectUrl}`)        this.checkMicroAppStatus({ originUrl: details.url, redirectUrl })        return {          redirectUrl,        }      }    }    if (details.url.includes('t1-dev.dewu:98')) {      console.log("details.url.includes('t1-dev.dewu:98')", details.url);      const redirectUrl = this.generateOnlineUrlByLocal({ originUrl: details.url })      if (redirectUrl) {        console.log('觸發代理', `${details.url}代理至${redirectUrl}`)        this.checkMicroAppStatus({ originUrl: details.url, redirectUrl })        return {          redirectUrl,        }      }    }  }
  • 文件內容代理為本地文件后,此時對應的模塊加載path還是會加載線上路由,這里同樣需要做內容代理。
  • 由于是基于線上測試環境開發,本地開發的頁面不僅需要在線上展示,并且本地代碼更新后需要觸發線上頁面更新,這是必不可少的步驟,我們基于websocket將本地與線上進行連接。
  • 不同子應用動態設置socketUrl與PingUrl。
function getHost() {  if (process.env.SOCKET_SERVER) {    return new URL(process.env.SOCKET_SERVER);  }  return location;}function getSocketUrl() {  let h = getHost();  let host = h.host;  host = `localhost:${PORT}`;  const isHttps = h.protocol === 'https:';  return `ws://${host}`;}function getPingUrl() {  const h = getHost();  return `${h.protocol}//${h.host}/__umi_ping`;}
  • 建立websocket連接,并定時觸發連接檢測。
let pingTimer = null;let isFirstCompilation = true;let mostRecentCompilationHash = null;let hasCompileErrors = false;let hadRuntimeError = false;const pingUrl = getPingUrl();if (!window[`${APP_NAME}UmiEntry`]) {  const socket = new WebSocket(getSocketUrl(), 'webpack-hmr');  socket.addEventListener('message', ({ data }) =>    __awaiter(void 0, void 0, void 0, function* () {      data = JSON.parse(data);      if (data.type === 'connected') {        console.log(`[webpack] connected.`);        // proxy(nginx, docker) hmr ws maybe caused timeout,        // so send ping package let ws keep alive.        pingTimer = setInterval(() => socket.send('ping'), 30000);      } else {        handleMessage(data).catch(console.error);      }    }),  );}
  • 本地需求開發共享部署態代碼的store與路由跳轉。
  • 需求開發完成后進行單個應用部署,由于是本地代理,不影響測試訪問。

基于模塊聯邦

前面的代理機制依賴于MF的遠程加載,模塊聯邦加載機制可參考「掘金」平臺中題目為“最詳細的Module Federation的實現原理講解” 這篇文章?;谀K聯邦的微前端落地方案可以參考之前的一篇文章 基于Module Federation的模塊化跨棧方案探索。7Uo28資訊網——每日最新資訊28at.com

7Uo28資訊網——每日最新資訊28at.com

本地與部署態基座應用通過MF方案加載子應用,同時部署態新增動態加載保證遠程組件的實時性,在加載入口文件處進行監控告警。7Uo28資訊網——每日最新資訊28at.com

7Uo28資訊網——每日最新資訊28at.com

基座應用為部署態,在進行MF加載時,通過chrome插件動態控制加載子文件路徑,開發態子應用共享部署態代碼的store,路由注冊等基礎配置。7Uo28資訊網——每日最新資訊28at.com

7Uo28資訊網——每日最新資訊28at.com

7Uo28資訊網——每日最新資訊28at.com

加載態依賴chrome插件做動態代理,實現本地與其他測試環境構建代碼的動態切換,同時子應用與部署態代碼建立websocket代碼更新鏈接,在子應用更新代碼時,實時刷新線上頁面。同時支持端口的動態配置,一鍵關閉。7Uo28資訊網——每日最新資訊28at.com

效果

以上介紹加載鏈路保證了構建部署提速與功能的完整,較好的解決了應用拆分功能不完備問題。本次架構優化將構建由15s減少至2.0s。業務需求部署速度由8min減少至2min。7Uo28資訊網——每日最新資訊28at.com

四、應用拆分

大倉模式

應用拆分只是目的,要實現這個目標不僅僅要做拆分,對于商家后臺來說各個應用間的復用同等重要,由于是業務解耦,這意味著各應用間存在更多可復用的功能與模塊。7Uo28資訊網——每日最新資訊28at.com

7Uo28資訊網——每日最新資訊28at.com

同時不僅是商家后臺的部分模塊也會在交易后臺使用,既要保證應用業務的解耦,同時要保證組件充分復用,大倉模式是目前最合適的方案。7Uo28資訊網——每日最新資訊28at.com

大倉模塊化共享

由于商家后臺各個子應用由于同屬商家整條業務鏈路,存在眾多可共用的組件和模塊,而npm發布模式本身給業務組件與業務項目帶來了一定隔離性,同時因為各子應用業務上存在關聯,很多大型模塊需要被多個子應用引入,而這些大型模塊的迭代通常比較頻繁,同時需要對業務請求進行封裝。這里我們使用了基于大倉模式的源碼引入以達到代碼共用的目的。組件開發鏈路如下:7Uo28資訊網——每日最新資訊28at.com

7Uo28資訊網——每日最新資訊28at.com

這里體現的是源碼引入的方式,在構建態進行通用模塊的打包構建,這一點目前能跑通的背景是商家后臺本身是一個完整的應用,現有的模式同樣是一個組件被多個模塊所使用,同時測試階段也是全量回歸。以下是大倉組件基礎鏈路:7Uo28資訊網——每日最新資訊28at.com

  1. 組件構建發布使用標準的cli規范。
  2. 在提交MR節點與發布節點新增自動化卡口。
  3. 通過依賴分析自動化檢測單測運行范圍。
  4. 組件發布時發布通知,提醒組件使用者,并運行業務單測。

之后會對該部分做詳細介紹。7Uo28資訊網——每日最新資訊28at.com

五、總結與思考

單應用構建->單頁面構建?

以上主要講述了MF方案如何將本地結合線上開發,這里僅對微應用級別做了解耦,基于MF的模塊化實現,由于remoteMicro實質上是創建了一個引用路徑到require函數的映射然后代理至本地,那么對于不同模塊,在能力上是具備模塊化代理的能力的,基于目前MF按需構建(僅構建暴露出去的組件模塊)的規則,我們可以對某個模塊的映射對象里的xxx.async.js做代理。這樣就可以實現頁面粒度的按需構建,在部署構建提速上有很大潛力。7Uo28資訊網——每日最新資訊28at.com

7Uo28資訊網——每日最新資訊28at.com

本篇文章主要介紹了如何對商家巨石應用做拆分,包括拆分方案的介紹,如何同時保證單個構建與功能完整性,并且針對微應用代理加載進行了進一步探索,接著介紹了大倉模式下需要遵循的規范以及未來的規劃。大倉模式目前在前端平臺已經持續不斷地完善,將來應該會針對此模式做更詳細的介紹,在拆分這件事情上,對于構建本身或許能被更加細粒度化,構建文件的代理本質上減少了代碼的構建量,目前是通過人為控制的方式,此次驗證了模塊聯邦支持可代理與動態更改expose。基于這兩個特性,是否能將構建做到更加局部化,這可能會成為構建優化的方向。應用拆分一方面提升了開發人員的開發與部署效率,同時也對業務迭代流程做了業務解耦,明確了責任邊界,更有利于后臺應用的開發需求管理,降低需求代碼維護成本。7Uo28資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-6162-0.html基于模塊聯邦與大倉模式的商家巨石應用拆分實踐

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 轉轉游戲的賬號訂單流程重構之路

下一篇: 如何編寫技術文檔?

標簽:
  • 熱門焦點
  • K60 Pro官方停產 第三方瞬間漲價

    雖然沒有官方宣布,但Redmi的一些高管也已經透露了,Redmi K60 Pro已經停產且不會補貨,這一切都是為了即將到來的K60 Ultra鋪路,屬于廠家的正常操作。但有意思的是該機在停產之后
  • K60至尊版剛預熱 一加Ace2 Pro正面硬剛

    Redmi這邊剛如火如荼的宣傳了K60 Ultra的各種技術和硬件配置,作為競品的一加也坐不住了。一加中國區總裁李杰發布了兩條微博,表示在自家的一加Ace2上早就已經采用了和PixelWo
  • 中興AX5400Pro+上手體驗:再升級 雙2.5G網口+USB 3.0這次全都有

    2021年11月的時候,中興先后發布了兩款路由器產品,中興AX5400和中興AX5400 Pro,從產品命名上就不難看出這是隸屬于同一系列的,但在外觀設計上這兩款產品可以說是完全沒一點關系
  • 微信語音大揭秘:為什么禁止轉發?

    大家好,我是你們的小米。今天,我要和大家聊一個有趣的話題:為什么微信語音不可以轉發?這是一個我們經常在日常使用中遇到的問題,也是一個讓很多人好奇的問題。讓我們一起來揭開這
  • 19個 JavaScript 單行代碼技巧,讓你看起來像個專業人士

    今天這篇文章跟大家分享18個JS單行代碼,你只需花幾分鐘時間,即可幫助您了解一些您可能不知道的 JS 知識,如果您已經知道了,就當作復習一下,古人云,溫故而知新嘛?,F在,我們就開始今
  • 2天漲粉255萬,又一賽道在抖音爆火

    來源:運營研究社作者 | 張知白編輯 | 楊佩汶設計 | 晏談夢潔這個暑期,旅游賽道徹底火了:有的「地方」火了——貴州村超旅游收入 1 個月超過 12 億;有的「博主」火了&m
  • 年輕人的“職場羞恥感”,無處不在

    作者:馮曉亭 陶 淘 李 欣 張 琳 馬舒葉來源:燃次元“人在職場,應該選擇什么樣的著裝?”近日,在網絡上,一個與著裝相關的帖子引發關注,在該帖子里,一位在高級寫字樓亞洲金
  • 信通院:小米、華為等11家應用商店基本完成APP簽名及驗簽工作

    中國信通院表示,目前,小米、華為、OPPO、vivo、360手機助手、百度手機助手、應用寶、豌豆莢和努比亞等9家應用商店,以及抖音和快手2家新型應用分發平
  • 網傳小米汽車開始篩選交付中心 建筑面積不低于3000平方米

    7月7日消息,近日有微博網友@長三角行健者爆料稱,據經銷商集團反饋,小米汽車目前已經開始了交付中心的篩選工作,要求候選場地至少有120個車位,建筑不能低
Top 主站蜘蛛池模板: 乐昌市| 康保县| 福鼎市| 平罗县| 广元市| 金堂县| 耒阳市| 长岛县| 南昌县| 安国市| 贵阳市| 和顺县| 赤水市| 赫章县| 隆林| 建德市| 保山市| 金门县| 攀枝花市| 新安县| 罗江县| 无为县| 牟定县| 云龙县| 高州市| 清涧县| 关岭| 岫岩| 双流县| 旌德县| 木兰县| 乌海市| 尼勒克县| 怀仁县| 出国| 襄樊市| 泗阳县| 岐山县| 上犹县| 祁东县| 达尔|