【京東開源項目】微前端框架MicroApp 1.0正式發佈

来源:https://www.cnblogs.com/jingdongkeji/archive/2023/10/16/17767212.html
-Advertisement-
Play Games

MicroApp是由京東前端團隊推出的一款微前端框架,它從組件化的思維,基於類WebComponent進行微前端的渲染,旨在降低上手難度、提升工作效率。MicroApp無關技術棧,也不和業務綁定,可以用於任何前端框架。 ...


介紹

MicroApp是由京東前端團隊推出的一款微前端框架,它從組件化的思維,基於類WebComponent進行微前端的渲染,旨在降低上手難度、提升工作效率。MicroApp無關技術棧,也不和業務綁定,可以用於任何前端框架。

微前端是一種頁面整合方案,它的核心在於將一個龐大的前端應用拆分成多個獨立靈活的小型應用,每個應用都可以獨立開發、獨立運行、獨立部署,再將這些小型應用融合為一個完整的應用,或者將原本運行已久、沒有關聯的幾個應用融合為一個應用。微前端既可以將多個項目融合為一,又可以減少項目之間的耦合,提升項目擴展性,相比一整塊的前端倉庫,微前端架構下的前端倉庫傾向於更小更靈活。

升級亮點

距離MicroApp開源已經有一年多時間,在這段時間里我們收到了很多問題反饋,包括沙箱的性能、vite的相容、路由衝突等等,為瞭解決這些問題我們將很多核心功能進行升級和重構,經過不斷的打磨和驗證,最終推出MicroApp1.0正式版。

正式版的升級主要在以下幾個方面:

  1. 更簡潔的接入方式

  2. 沙箱的性能

  3. 虛擬路由系統

  4. 樣式隔離

  5. 相容vite

  6. 開發工具

一行代碼嵌入

MicroApp借鑒了WebComponent的思想,通過CustomElement結合自定義的ShadowDom,將微前端封裝成一個類WebComponent組件,實現微前端的組件化渲染。在此基礎上,通過實現JS隔離、樣式隔離、路由隔離,降低子應用的接入成本,子應用只需設置允許跨域請求,不需要改動任何代碼即可接入微前端,使用方式和iframe幾乎一致,但卻沒有iframe存在的問題。

接入方式如下:

JS沙箱的困境

在MicroApp開源後我們收到社區的一些反饋,其中一條關於性能的問題引起我們的重視。這不是MicroApp才存在的問題,而是微前端長久以來的難題,在社區有大量關於沙箱性能問題的討論,卻始終沒有完美的解決方案。

MicroApp採用的是和qiankun一樣的proxy+with的沙箱方案,這也是目前js沙箱的主流方案 。with沙箱的功能非常完善,但是性能損耗卻非常明顯,在社區中也不乏對with沙箱性能問題的討論,但一直沒有特別完美的解決方案,這是由於with改變了js的作用域鏈,從而產生大量的重覆請求。問題的根源是with,但又不全是with的問題,準確的說是with和proxy兩者疊加造成的,with和proxy本質上的性能都不高,需要一種方案避免對這兩個方法的頻繁讀取操作,MicroApp採用的解決方案是變數前置和非同步防抖。

• 變數前置:是指使用Object.defineProperty定義全局變數,通過get和set設置響應數據,一是為了避免在proxy的get中進行多餘的操作,二是defineProperty的性能比proxy更優秀 。

• 非同步防抖:是指在子應用運行時對promise進行標記,確保在上一個promise執行完成之後才會進入下一個,避免並行觸發,防止promise被頻繁觸發會造成性能損失。

在此基礎上,MicroApp沙箱還提供了快照、緩存、預載入等功能,在保證功能不變的前提下,徹底解決沙箱的性能問題,升級後的沙箱運行效率媲美原生JS。

虛擬路由系統

微前端是將多個不同的web應用融合在一起渲染,但瀏覽器只有一個路由系統,這很容易造成應用之間的路由衝突,最常見的就是vue3的路由衝突問題。

上面是vue-router作者對於在微前端環境下的衝突問題的回答,他認為vue-router已經覆蓋足夠多場景,微前端的問題應該由微前端解決。

在我們剛開源時,並沒有對路由進行隔離,用戶對於MicroApp的問題幾乎一半都和路由相關,因為一個路由系統同時滿足多個應用的渲染容易導致衝突,也非常反直覺和難以理解,於是我們推出了虛擬路由系統。

概念圖:

虛擬路由系統與瀏覽器的路由行為一致,它通過自定義location和history等核心路由API,重寫了popState和hashChange事件,攔截路由導航和事件,並提供了一系列自定義API,模擬了在瀏覽器環境下的Web應用程式的渲染、跳轉和返回等路由行為。子應用程式在這個虛擬路由系統中運行,與基座應用程式的路由相互隔離,從而避免相互影響,並增強了子應用程式與基座應用程式之間的交互能力。通過虛擬路由系統,基座應用程式可以方便地獲取子應用程式的路由信息並控制子應用程式的跳轉,子應用程式的路由信息會作為參數同步到瀏覽器地址上。此外,虛擬路由系統還提供了許多功能,幫助開發人員提高工作效率。

樣式隔離方案升級

MicroApp最初是基於style元素的CSSStyleSheet實現的樣式隔離:即將CSS字元串插入style元素生成CSSStyleSheet,遍歷每個CSS規則,添加首碼實現樣式隔離。

這種一種取巧的方式,利用瀏覽器自身的能力格式化CSS,併在此基礎上進行修改,省去很多工作量。但問題也出現在這裡,不同瀏覽器對於相同的CSS生成的CSSStyleSheet可能會不同,這就導致我們在處理CSSStyleSheet會遇到不可以預知的問題,導致CSS表現不一致。

於是MicroApp換了一種方式來實現樣式隔離,我們使用正則將CSS字元串切割成最小單元,每個單元包含一段CSS信息,將所有的信息整理生成CSSTree,遍歷CSSTree的每個規則,添加首碼實現樣式隔離。

新的方案不但抹平了不同平臺間的差異,在性能上相較於舊版普遍提升30%以上,並且擁有更加靈活的配置:

/* 對指定的選擇器禁用樣式隔離 *
/*! scopecss-disable .test1, .test2 */
.test1 {
  color: red;
}
.test2 {
  color: yellow;
}
.test3 {
  /* 在某一行中禁用樣式隔離 */
  /*! scopecss-disable-next-line */
  background: url(/test.png);
}

vite的相容

在之前的版本中,MicroApp也支持vite的接入,但必須關閉沙箱,因為vite打包出來的是esm類型的js文件,而esm無法運行在with環境中,但這樣容易導致基座和子應用之間的衝突,顯然是需要進一步優化的。

為此我們為vite(更準確的說是為esm類型的項目)開發了一套iframe沙箱方案,將esm類型的js文件放入iframe中運行,並通過重寫子應用底層原型鏈的方式,實現對js和元素的攔截和處理。

iframe沙箱和with沙箱的實現方式不同,功能也略有不同,with沙箱擁有更加靈活的操作,而iframe沙箱擁有更加嚴格的隔離環境,兩者各有優劣。用戶可以在兩種沙箱之間靈活切換,以滿足更多特殊場景的覆蓋和相容。

Micro-App-DevTools

Micro-App-DevTools 是基於 MicroApp 推出的一款Chrome瀏覽器插件,目的是為了在開發和使用 MicroApp 過程中提高效率。通過此插件可以有效的解決調試困難、模擬數據通信、查看視窗範圍、設置路由、獲取環境變數等訴求,進而更好地幫助用戶去瞭解和使用 MicroApp。

方案詳解

Micro-App-DevTools通過模擬子應用開發環境,獲取父應用數據,來可視化查看通訊數據,提高開發調試效率。對於路由,將會顯示所有應用的路由,包含層層嵌套應用以及一個父應用多個子應用的路由,使不同團隊應用也能快速定位自己問題,方便協作。還提供了全局變數和高亮視窗功能,實現快速定位範圍,提高排查效率的功能,並集結了圖標、右鍵、控制台的快捷進入方式,使用戶快速上手,零成本使用。

總結

MicroApp 1.0已經發佈,我們將積極回應開發者的問題和反饋,並持續改進,以幫助更多開發者提高效率和改善開發體驗。歡迎大家使用MicroApp並參與共建,也希望在GitHub上給我們點個Star來支持我們~

MicroApp Github地址:

https://github.com/micro-zoe/micro-app

Micro-App-DevTools Github地址:

https://github.com/micro-zoe/micro-app-chrome-plugin

MicroApp官網地址:

https://micro-zoe.github.io/micro-app

作者:京東零售 馬國華

來源:京東雲開發者社區 轉載請註明來源


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本文介紹了MongoDB複製集的架構和特點,強調了使用複製集提供數據的高可用性和冗餘性的重要性。複製集由Primary節點和Secondary節點組成,確保數據一致性。複製集還具有數據分發、讀寫分離和異地容災等附加功能。使用MongoDB複製集可以提供穩定可靠的數據存儲和高可用性。 ...
  • 康師傅yyds MySQL的索引包括普通索引、唯一性索引、全文索引、單列索引、多列索引和空間索引等。 從 功能邏輯 上說,索引主要有 4 種,分別是普通索引、唯一索引、主鍵索引、全文索引。 按照 物理實現方式 ,索引可以分為 2 種:聚簇索引和非聚簇索引。 按照 作用欄位個數 進行劃分,分成單列索引 ...
  • tv屏中,最難處理的就是焦點問題,而複雜的焦點處理要屬應用列表模塊了 根據展示的列表,可以翻頁,預設焦點處於左上角第一個,此時通過遙控器上下左右可以控制焦點移動位置 焦點所在應用需要有個黃色邊框標識,往右移動到邊界,自動到下一行,繼續往右移動到邊界底部自動翻頁,往下移動到底部自動翻頁 長按應用彈出編 ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 很多時候在工作中會碰到完全由前端導出word文件的需求,因此特地記錄一下比較常用的幾種方式。 一、提供一個word模板 該方法提供一個word模板文件,數據通過參數替換的方式傳入word文件中,靈活性較差,適用於簡單的文件導出。需要依賴: ...
  • 前言 有關設計模式的學習資料中,大部分都是以 java 語言實現的,畢竟 java 作為老牌面向對象的語言最能說明設計模式的核心概念,所以 js 的相關設計模式的學習資料也大多使用 class 類實現,本文記錄下 js 使用函數實現策略模式和狀態模式設計模式的方式,更有助於理解策略模式和狀態模式如何 ...
  • 三元運算符 基礎: let hungry = true; let eat; if (hungry true) { eat = 'yes'; } else { eat = 'no'; } 高階: let hungry = true; let eat = hungry true ? 'yes' : 'n ...
  • 1. 前言 大家好,我是沙漠盡頭的狼。 Dotnet工具箱是一個純前端的、開源和免費的工具網站,周末我參考了開源項目it-tools,對網站界面文字進行了漢化,並重新部署了網站。該網站共有10大工具分類,提供了73個實時線上小工具。使用Vue3開發的Dotnet工具箱具有獨特的特色,本文詳細介紹了其 ...
  • 此篇以百度地圖為例 1、去高德地圖註冊自己的key(註冊流程可借鑒百度地圖註冊流程) 2、什麼是坐標 地球坐標系——WGS84:常見於 GPS 設備,Google 地圖等國際標準的坐標體系。 火星坐標系——GCJ-02:中國國內使用的被強制加密後的坐標體系,高德坐標就屬於該種坐標體系。 百度坐標系— ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...