1. 程式人生 > >「譯」用 Blazor WebAssembly 實現微前端

「譯」用 Blazor WebAssembly 實現微前端

> 原文作者: Wael Kdouh > 原文連結:[https://medium.com/@waelkdouh/microfrontends-with-blazor-webassembly-b25e4ba3f325](https://medium.com/@waelkdouh/microfrontends-with-blazor-webassembly-b25e4ba3f325 "https://medium.com/@waelkdouh/microfrontends-with-blazor-webassembly-b25e4ba3f325") ![](https://blog-1259586045.cos.ap-shanghai.myqcloud.com/clipboard_20210105_071529.png) 我聊下最近我在做的事情,然後分享下在Blazor WebAssembly 微前端的實現細節,這篇文章是我的一些心得,以及一個示例的 Demo 專案,展示瞭如何使用Blazor 實現多模組分散式的應用程式的微前端,如下圖所示。 ![](https://blog-1259586045.cos.ap-shanghai.myqcloud.com/clipboard_20210105_051744.png) 為了實現上面的架構,這是我使用到了.NET 5 對與 Blazor WebAssembly 的一項新功能,延遲載入,直到需要這些程式集的時候,才開始載入,從而提高Blazor WebAssembly應用程式的啟動效能,比如如,只有使用者導航到該元件時,才開始載入單個元件的程式集,載入後,程式集將快取在客戶端,可用於以後的所有導航。 ![](https://blog-1259586045.cos.ap-shanghai.myqcloud.com/clipboard_20210105_052441.png) 我的示例專案的結構是下邊這樣 ![](https://blog-1259586045.cos.ap-shanghai.myqcloud.com/clipboard_20210105_052533.png) Blazor 的延遲載入功能允許標記應用程式集,當用戶導航到特定路由時,才開始載入程式集,這個功能包括修改程式路由時修改專案檔案。 開啟我們的 Blazor 專案,然後修改專案 .csproj 檔案,在這裡標記需要延遲載入的 dll 型別的程式集,然後 Blazor 啟動後就不會載入這個程式集,我下邊的程式碼中標記了 WaelsMagicFeature.dll 用於延遲載入,如果設定的程式集有其他的依賴,也需要把依賴程式集設定延遲載入。 ![](https://blog-1259586045.cos.ap-shanghai.myqcloud.com/clipboard_20210105_054014.png) Blazor 的路由元件指定搜尋可以訪問的路由元件的程式集,當用戶訪問到路由選單,路由元件也負責渲染,在應用的路由元件(App.razor) 新增一個 `OnNavigateAsync` 的回撥,當用戶第一次直接從瀏覽器導航到路由時,OnNavigateAsync 被呼叫執行,如果延遲載入的程式集包含了可路由的元件,新增一個 `List`,如果程式集包含可路由的元件,則將程式集傳遞迴 AdditionalAssemblies 集合,框架在程式集中搜索路線,並在找到任何新路線時更新路線集合。 OnNavigateAsync有一個NavigationContext引數,該引數提供有關當前非同步導航事件的資訊,包括目標路徑(Path)和取消令牌(CancellationToken), Path屬性是相對於應用程式基本路徑的使用者目標路徑,例如 /WaelsMagicComponent, CancellationToken可用於觀察非同步任務的取消, 使用者導航到其他頁面時,OnNavigateAsync自動取消當前正在執行的導航任務, 在OnNavigateAsync內部,實現了要指定載入哪些程式集,Options 包含了一個在OnNavigateAsync方法內部的條件檢查,將路由對映到程式集名稱的查詢表中,這些名稱可以注入到元件中,也可以在程式碼內實現。 最後,LazyAssemblyLoader 是框架提供的單例服務來載入程式集,在路由元件注入 LazyAssemblyLoader,它提供了 `提供了LoadAssembliesAsync` 方法, 該方法使用JS發起了網路呼叫,獲取程式集然後載入到在瀏覽器中的WebAssembly上執行的執行時中。 ![](https://blog-1259586045.cos.ap-shanghai.myqcloud.com/clipboard_20210105_070327.png) 如上所示,這樣可以獨立地構建/維護不同的模組,按需載入它們。下圖顯示了導航到 Waels Magic 選項卡後如何按需載入 WaelsMagicComponent,由於應用程式避免在啟動時下載所有dll,所以可以加快 Blzaor 程式的啟動時間。 ![](https://blog-1259586045.cos.ap-shanghai.myqcloud.com/clipboard_20210105_071037.png) ### 總結 在這篇文章中,我們演示瞭如何將不同的元件作為獨立的庫進行維護,另外,我們利用延遲載入來按需載入不同的模組,而不是在啟動時就開始載入所有的模板,這樣也可以提升程式的啟動速度,讓使用者體驗更好。 示例程式碼:[https://github.com/waelkdouh/BlazorMicroFrontend](https://github.com/waelkdouh/BlazorMicroFrontend "https://github.com/waelkdouh/BlazorMicroFrontend") ### 最後 歡迎掃碼關注我們的公眾號,專注國外優秀部落格的翻譯和開源專案分享,也可以新增QQ群 897216102

相關推薦

Blazor WebAssembly 實現前端

> 原文作者: Wael Kdouh > 原文連結:[https://medium.com/@waelkdouh/microfrontends-with-blazor-webassembly-b25e4ba3f325](https://medium.com/@waelkdouh/microfrontend

Blazor VS React React / Angular / Vue.js

> 原文作者: Christian Findlay > 原文連結: [https://christianfindlay.com/2020/06/04/blazor-vs-react-angular-vue-js/](https://christianfindlay.com/2020/06/04/blazo

一起探討 JavaScript 的對象

apply() ati 讀取 number 隱藏屬性 公有 cover users global 「譯」一起探討 JavaScript 的對象 原文地址:Let’s explore objects in JavaScript 原文作者:Cristi Salcescu

寫好JavaScript條件語句的5條守則

原文地址:5 Tips to Write Better Conditionals in JavaScript 原文作者:ecelyn Yeen(@jecelynyeen) 譯文出自:阿里雲翻譯小組 譯文連結:github.com/dawn-teams/… 譯者:眠雲(楊濤

程式碼優化策略 — Idle Until Urgent

Idle Until Urgent(閒置直到緊急) 譯者注:大家耳熟能詳的優化策略已經談論了好多年了,用 Chrome 效能分析工具發現瓶頸並針對性優化的文章網路上也有不少,但是從執行時排程策略來思考優化方式的卻鳳毛麟角,正如我們之前只知道使用 setTimeou

jvm系列(十):如何優化Java GC

Sangmin Lee發表在Cubrid上的"Become a Java GC Expert"系列文章的第三篇《How to Tune Java Garbage Collection》,本文的作者是韓國人,寫在JDK 1.8釋出之前,雖然有些地方有些許過時,但整體內容還是

【轉】 ES5, ES6, ES2016, ES.Next: JavaScript 的版本是怎麼回事?

JavaScript 有著很奇怪的命名史。 1995 年,它作為網景瀏覽器(Netscape Navigator)的一部分首次釋出,網景給這個新語言命名為 LiveScript。一年後,為了搭上當時媒體熱炒 Java 的順風車,臨時改名為了 JavaScript (

MotionLayout導論 (part II)

「譯」MotionLayout導論 (part II) 原文連結: Introduction to MotionLayout (part II) 前言 這是系列文章「MotionLayout導論」的 part II。閱讀之前請先檢視 part I! (中文點這) 在文字中,我們將繼續通過各種示例揭露基

有限狀態機在 CSS 動畫中的應用

原文地址:css-animations-with-finite-state-machines 原文作者:David Khourshid 譯文出自:阿里雲翻譯小組 譯文連結:github.com/dawn-teams/… 譯者:也樹 校對者:靈沼,照天 隨

MotionLayout 介紹 (Part IV) 深入理解關鍵幀

原文連結 在 MotionLayout 中定義運動路徑 介紹 MotionLayout 是一個來自 ConstraintLayout 2.0 的專注於動畫的新佈局。本系列的前幾篇文章對該系統進行了很好的概述。我強烈建議你在閱讀本文前先去檢視它們。 Introduction to MotionLa

MotionLayout介紹 (part III)

原文連結 前言 在本系列的第一部分和第二部分中,我們介紹了 MotionLayout,並給出了各種示例: basic motion swipe handling custom attribute interpolation keyframes 第一部分和第二部分概述了 Motio

setState如何知道它該做什麼?

本文翻譯自: How Does setState Know What to Do? 原作者:Dan Abramov 如果有任何版權問題,請聯絡[email protected] 當你在元件中呼叫setState時,你覺得會發生什麼? import

深入typescript系列1

為什麼要用typescript 這裡列舉了兩個主要的目的 typescript為js提供了可選的型別系統(type system) typescript為當前的js引擎提供了未來JS版本才能使用的特性 typescript的型別系統 你獲取想知道為什麼要給javascript新增型別系統

nodejs快速實現信小程式的websocket服務端

摘要: 微信小程式服務端使用websocket方式。socket.io已作為nodejs體系中被廣泛應用的websocket解決方案,卻因socket.io對websocket做了高階封裝,不能相容微信小程式所採用的websocket標準協議無法直接使用,此外微

Graal JIT編譯器是如何工作的

原文[Understanding How Graal Works - a Java JIT Compiler Written in Java](https://chrisseaton.com/truffleruby/jokerconf17/),講了jvmci和ideal graph的基本概念以及一些優化技術,

ASP.NET Core Blazor WebAssembly實現一個簡單的TODO List

## 基於blazor實現的一個簡單的TODO List 最近看到一些大佬都開始關注blazor,我也想學習一下。做了一個小的demo,todolist,僅是一個小示例,參考此vue專案的實現[http://www.jq22.com/code1339](http://www.jq22.com/code133

靜態單賦值小冊 - 1. 介紹

有一本小冊子Static Single Assignment Book寫的很好,內容又較少,試著翻譯一下,意譯較多(說人話),不是嚴肅的翻譯,感興趣的可以看看。頻率可能是周更。。anyway,stay tuned~ 在日常程式設計中,名字是一個很有用的東西。這本書想傳遞的關鍵內容是對於每個不同的東西給它一個

使用 System.Net.Http.Json 高效處理Json

在這篇文章,我將介紹一個名為 System.Net.Http.Json 的擴充套件庫,它最近新增到了 .NET 中,我們看一下這個庫能夠給我們解決什麼問題,今天會介紹下如何在程式碼中使用。 ### 在此之前我們是如何處理 JSON是一種普遍和流行的序列化格式資料來發送現代web api,我經常在我的專案

.NET 5 新增的Http, Sockets, DNS 和 TLS 遙測

.NET 一直在穩定的增加和改善對應用程式進行跨平臺的診斷分析,在.NET Core 3.0, 我們看到了 [EventCounters](https://devblogs.microsoft.com/dotnet/introducing-diagnostics-improvements-in-net-co

精品轉行的如何自學web前端並且找到工作,分享自己的心得

比較 ado 操作 發的 一位 多人 shadow 整理 建設 做web前端開發6年,給大家詳細分析一下這個問題 首先告訴你的是,應屆生零基礎學習開始學習web前端肯定難,web前端的專業程度本身就不簡單,學習這事本來就是一件非常煎熬的事情,人都不願意學習,可是沒辦法,為了