主頁 > .NET開發 > Blazor是春天還是寒風里的掙扎

Blazor是春天還是寒風里的掙扎

2022-01-22 06:02:19 .NET開發


title: Blazor是春天還是寒風里的掙扎
date: '2021-10-25 14:00:00'
toc: true
categories:

  • Blazor
    tags:
  • Blazor
  • MASA Blazor#

官方解釋Blazor

Blazor允許您使用c#而不是JavaScript構建互動式web UI, Blazor應用由可重用的web UI組件組成,這些組件使用c#、HTML和CSS實作,客戶端和服務器代碼都是用c#撰寫的,允許您共享代碼和庫,

Blazor 是一個使用 .NET 生成互動式客戶端 Web UI 的框架:

  • 使用 C# 代替 JavaScript 來創建資訊豐富的互動式 UI,
  • 共享使用 .NET 撰寫的服務器端和客戶端應用邏輯,
  • 將 UI 呈現為 HTML 和 CSS,以支持眾多瀏覽器,其中包括移動瀏覽器,
  • 與新式托管平臺(如 Docker)集成,

使用 .NET 進行客戶端 Web 開發可提供以下優勢:

  • 使用 C# 代替 JavaScript 來撰寫代碼,
  • 利用現有的 .NET 庫生態系統,
  • 在服務器和客戶端之間共享應用邏輯,
  • 受益于 .NET 的性能、可靠性和安全性,
  • 在 Windows、Linux 和 macOS 上使用 Visual Studio 保持高效作業,
  • 以一組穩定、功能豐富且易用的通用語言、框架和工具為基礎來進行生成,

看到這里有些小伙伴手中的瓜已經要丟出來了,的確有部分是夸大了的,起碼VS在三個平臺高效作業這事兒,嗯,,,其他的繼續吃瓜吧

Blazor Vs MVC

什么是MVC

官方解釋:ASP.NET Core MVC 是使用“模型-視圖-控制器”設計模式構建 Web 應用和 API 的豐富框架,

圈重點,Blazor是互動式Web UI,而MVC是Web應用和API

什么是互動式Web UI

谷歌、百度轉了一圈,沒有這個解釋,連Wiki也是一臉懵逼,

嘗試理解一下吧,互動式Web UI重點在于互動,而Blazor的官方解釋是用C#代替JavaScript,那我們看看JavaScript有什么功能,我百度找一段過來:

  1. 嵌入動態文本于HTML頁面

  2. 對瀏覽器事件做出回應

  3. 讀寫HTML元素

  4. 在資料被提交到服務器之前驗證資料

  5. 檢測訪客的瀏覽器資訊,控制cookies,包括創建和修改等

有這些基礎功能,用戶不需要在靜態頁面里跳來跳去了,的確體驗會好很多

Blazor有什么優勢

提供了一些互動能力,不再是純粹的靜態頁,雖然mvc可以使用JavaScript達到同樣的效果,但你需要掌握JavaScript,甚至還要再學習jQuery、Angular、Vue等,而Blazor提供的互動能力則是使用C#,

吹是吹完了,但你真的可以100% C#嗎?這很難,你會遇到各種問題,比如兼容性、性能等,好了,那我可以不用了嗎?等等,下面還有瓜

Blazor Vs 現代前端(Angular、Vue等)

我們從幾個方面來對比一下吧

除錯

  • Blazor:Vistual Stuidio + F5,VS Code/命令列工具 + dotnet watch

    比WebPack要快很多,跟Vite差不多

    在非復雜場景下Hot Reload是可以的,但奇奇怪怪的問題太多了,前景很好,目前來看還是用Ctrl + F5啟動或者用命令列吧

    VS 2022的Ctrl + F5已經支持Hot Reload了

  • 現代前端:Webpack/Vite

全家桶

以Vue為例,Vue全家桶包括Vue Cli、Vue Router、Vuex

Blazor:

  • Cli:dotnet cli
  • Router:Microsoft.AspNetCore.Components.Routing.Router
  • Vuex:Blazor狀態管理,區別在于WASM狀態保存在瀏覽器記憶體中,而Server保存在服務器記憶體中,而且Blazor狀態管理更強大的是借助.Net的能力,原生支持持久化存盤、跨線路保存(Server下共享服務器記憶體)、ASP.NET Core 受保護的瀏覽器存盤(Server獨享功能)

組件庫

主流的Bootstrap, Ant Design, Material Design等雙方都有,但由于現代前端多年的積累,質量上的確有一定差距,

除了豐富程度上,Blazor允許被JavaScript呼叫加載,并生成Angualr、React等組件,

雖然這看起來跟用C#解決代替JavaScript有點沖突,但融入大環境也是不錯的

下圖演示的是Blazor提供的inventory-grid Component被React參考的例子(當然也可以給Angular):

更神奇的是,在React復用的Blazor Component居然也支持Hot Reload,先不說Hot Reload到底如何,單是這個方向其實還是值得期待一下Hot Reload的未來吧,

16372888703025.png

不止可以給React提供復用的組件,還可以給WPF

16372890939413.png

第三方庫

舉幾個前端常用庫來比較,

網路:現代前端有axios,Blazor有HttpClient

資料操作:現代前端有Lodash,Blazor有Linq

時間:現代前端有moment.js、Day.js,Blazor有DateTime全家桶

回應式編程:現代前端有rx.js,Blazor有Rx.Net(沒有用過,理論上.Net基本都能用,歡迎糾錯)

Mock:現代前端有Mock.Js,Blazor有Moq,當然除了mock以外還有端到端的,雙方也都有,


對比下來其實.Net反而還有點優勢,那就完美嗎?當然不是,再說點劣勢的部分吧,

Charts:現代前端有ECharts等,Blazor不想說話

雖然目前Blazor的確沒有成熟、免費的Charts組件庫,但因為Blazor可以與JS互動的能力,呼叫ECharts也很簡單,稍微考驗一點點小伙伴的動手能力

富文本編輯器、拖拽,,,

Blazor罵罵咧咧的退出了群聊,,,

包管理

Blazor:NuGet

現代前端:NPM、Yarn

性能

資料不直觀,先從.Net Conf 2021上的演示截圖看一下:

16372881585085.png

有量化資料嗎?有:

16372881402171.png

視頻地址:https://sec.ch9.ms/ch9/daba/468d5211-982b-4c86-8b51-e1c8824edaba/dotNETConfNewBlazorWebAssembly_high.mp4

那AOT可以解千愁嗎?也不是,起碼應用大小上來說的確也大了不少,但這并不妨礙AOT可以解決特定場景的問題,技術總要選擇在適合的場景使用它,而不是盲目的,

16372881676924.png

完了嗎

當然沒有,其實這樣比較對于Blazor是不公平的,因為Blazor站在.Net的肩膀上有更多的亮點,比如原生支持的泛型、DI、面向物件設計(雖然TS也是)、數不過來的.Net類別庫、跨平臺應用(MAUI)等,

其實沒有必要只看到Blazor的劣勢,也可以看看站在.Net上的前端能走多遠,這不也是我們期待的嗎?

看到這里,有些.Net古董級大佬要出來發話了,Silverlight!是的,但這次WASM沒有再要求下載插件了,

Web Assembly Vs Server(服務器端渲染)

Web Assembly:WebAssembly是一種新的編碼方式,可以在現代的網路瀏覽器中運行 - 它是一種低級的類匯編語言,具有緊湊的二進制格式,可以接近原生的性能運行,并為諸如C / C ++等語言提供一個編譯目標,以便它們可以在Web上運行,它也被設計為可以與JavaScript共存,允許兩者一起作業,

Server(Server Side Render - SSR):將組件渲染為服務器端的 HTML 字串,將它們直接發送到瀏覽器,最后將這些靜態標記"激活"為客戶端上完全可互動的應用程式,

為什么用SSR

服務器端渲染 (SSR) 的優勢主要在于:

  • 更好的 SEO,由于搜索引擎爬蟲抓取工具可以直接查看完全渲染的頁面,
  • 更快的內容到達時間 (time-to-content)

什么時候用SSR

使用服務器端渲染 (SSR) 時還需要有一些權衡之處:

  • 開發條件所限,瀏覽器特定的代碼,只能在某些生命周期鉤子函式 (lifecycle hook) 中使用;一些外部擴展庫 (external library) 可能需要特殊處理,才能在服務器渲染應用程式中運行,
  • 涉及構建設定和部署的更多要求,與可以部署在任何靜態檔案服務器上的完全靜態單頁面應用程式 (SPA) 不同,服務器渲染應用程式,需要處于服務端運行環境,
  • 更多的服務器端負載,

服務器端渲染 vs 預渲染 (SSR vs Prerendering)

如果你調研服務器端渲染 (SSR) 只是用來改善少數營銷頁面(例如 /, /about, /contact 等)的 SEO,那么你可能需要預渲染,無需使用 web 服務器實時動態編譯 HTML,而是使用預渲染方式,在構建時 (build time) 簡單地生成針對特定路由的靜態 HTML 檔案,優點是設定預渲染更簡單,并可以將你的前端作為一個完全靜態的站點,

Blazor Server支持Prerendering

Blazor該選Web Assembly還是Server

看一下.Net Conf 2021大會上的一張圖:

16367144583538.png

總結一下:

  • Server要持久化長連接,有更高的UI延遲
  • Web Assembly則是更大的下載大小,和更慢的運行時性能

我們在做什么

又是一個老生常談的問題,.Net的覆寫面太廣了也導致很難解決所有問題,我們在權衡利弊之后是不是可以為.Net生態共建出自己小小的一份力呢?

開源的組件庫

再回到組件庫上,目前市面上的組件庫其實不少了,何必要繼續在這個泥潭里插一腳呢?

開發過組件庫的同學,或者貢獻過原始碼的同學應該都體會到了,寫一個組件是多么的復雜,而大家對于一個設計的審美角度也是不同的,當你喜歡的設計沒有提供實作怎么辦?從頭寫嗎,那太累了,所以我們嘗試了一件事情,

先看一下大概思路:

架構圖.jpg

簡單的剖析一下:

  • 在Blazor的基礎上,構建一個新的組件庫叫 Blazor Component

    那他有哪些特性呢?

    • 只提供互動,不提供樣式
    • 標準化Dom結構
    • 開放幾乎所有可以自定義的Slots(插槽,概念引自Vue),允許你替換Slots的Dom
  • 插槽與互動的統一單元測驗(目前正在38%,短期目標是80%,長期目標是90%+)

  • 基于Material Design(樣式引自Vuetify)的示例專案,可以達到生產可用(我們自己的公司在用,也是世界五百強企業在用)

  • 快速實作新的組件庫,只需要基于某個Design + 樣式控制屬性 + 特殊互動即可

未來是值得憧憬的,我們希望未來是這樣的:

慚愧,蹭了一波位元組的熱度

20211119111047.jpg

MASA Blazor

基于Blazor Component和Material Design的Blazor組件庫

  • 截止目前共68個基礎組件,后續會繼續增加
  • 預置組件,提供與.Net功能深度集成且常用組合類組件,如Url、面包屑、選單三聯動,高級搜索,i18n等
  • MASA Blazor Pro提供多種常見場景的預設布局
  • 全職團隊維護,Issue快速回應
  • 知名企業在用,未來MASA Stack產品線也將一直使用,持續增加新功能
  • 免費、開源

我們還計劃未來支持一鍵切換主題(代碼切換已經提供)、預置布局、資料展示類組件、WorkFlow類組件等,

MASA Blazor Pro

基于MASA Blazor提供的Admin模板,先放幾張設計稿吧,原始碼會跟MASA Blazor一起放出,

16396146507266.png

20211216083304.png

20211216083414.png

20211216083839.png

20211216083915.png

20211216083942.png

MASA EShop

基于MASA Framework搭建的 EShopOnDapr,將會使用MASA Blazor Pro提供完整的前后端示例

eshop.png

開源地址:https://github.com/masalabs/MASA.EShop

總結

說到底沒有完美的技術,在你權衡利弊之后在正確的場景使用它就是最合適的,

是春天還是寒冬也不重要,重要的是當下這一刻,它是否解決了你的痛點,

最后,一個小小的廣告

MASA Blazor 即將發布,敬請期待,如果你對我們的組件庫感興趣,無論是代碼貢獻、使用、提Issue,歡迎聯系我們

16373211753064.png

參考

  • https://dotnet.microsoft.com/apps/aspnet/web-apps/blazor
  • https://docs.microsoft.com/zh-cn/aspnet/core/blazor/state-management?view=aspnetcore-6.0&pivots=server#persist-state-across-circuits
  • https://sec.ch9.ms/ch9/daba/468d5211-982b-4c86-8b51-e1c8824edaba/dotNETConfNewBlazorWebAssembly_high.mp4
  • https://developer.mozilla.org/zh-CN/docs/WebAssembly
  • https://ssr.vuejs.org/zh/

轉載請註明出處,本文鏈接:https://www.uj5u.com/net/418023.html

標籤:C#

上一篇:話說C#程式員人手一個ORM

下一篇:利用SelectPdf插件將網頁生成PDF

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • WebAPI簡介

    Web體系結構: 有三個核心:資源(resource),URL(統一資源識別符號)和表示 他們的關系是這樣的:一個資源由一個URL進行標識,HTTP客戶端使用URL定位資源,表示是從資源回傳資料,媒體型別是資源回傳的資料格式。 接下來我們說下HTTP. HTTP協議的系統是一種無狀態的方式,使用請求/ ......

    uj5u.com 2020-09-09 22:07:47 more
  • asp.net core 3.1 入口:Program.cs中的Main函式

    本文分析Program.cs 中Main()函式中代碼的運行順序分析asp.net core程式的啟動,重點不是剖析原始碼,而是理清程式開始時執行的順序。到呼叫了哪些實體,哪些法方。asp.net core 3.1 的程式入口在專案Program.cs檔案里,如下。ususing System; us ......

    uj5u.com 2020-09-09 22:07:49 more
  • asp.net網站作為websocket服務端的應用該如何寫

    最近被websocket的一個問題困擾了很久,有一個需求是在web網站中搭建websocket服務。客戶端通過網頁與服務器建立連接,然后服務器根據ip給客戶端網頁發送資訊。 其實,這個需求并不難,只是剛開始對websocket的內容不太了解。上網搜索了一下,有通過asp.net core 實作的、有 ......

    uj5u.com 2020-09-09 22:08:02 more
  • ASP.NET 開源匯入匯出庫Magicodes.IE Docker中使用

    Magicodes.IE在Docker中使用 更新歷史 2019.02.13 【Nuget】版本更新到2.0.2 【匯入】修復單列匯入的Bug,單元測驗“OneColumnImporter_Test”。問題見(https://github.com/dotnetcore/Magicodes.IE/is ......

    uj5u.com 2020-09-09 22:08:05 more
  • 在webform中使用ajax

    如果你用過Asp.net webform, 說明你也算是.NET 開發的老兵了。WEBform應該是2011 2013左右,當時還用visual studio 2005、 visual studio 2008。后來基本都用的是MVC。 如果是新開發的專案,估計沒人會用webform技術。但是有些舊版 ......

    uj5u.com 2020-09-09 22:08:50 more
  • iis添加asp.net網站,訪問提示:由于擴展配置問題而無法提供您請求的

    今天在iis服務器配置asp.net網站,遇到一個問題,記錄一下: 問題:由于擴展配置問題而無法提供您請求的頁面。如果該頁面是腳本,請添加處理程式。如果應下載檔案,請添加 MIME 映射。 WindowServer2012服務器,添加角色安裝完.netframework和iis之后,運行aspx頁面 ......

    uj5u.com 2020-09-09 22:10:00 more
  • WebAPI-處理架構

    帶著問題去思考,大家好! 問題1:HTTP請求和回傳相應的HTTP回應資訊之間發生了什么? 1:首先是最底層,托管層,位于WebAPI和底層HTTP堆疊之間 2:其次是 訊息處理程式管道層,這里比如日志和快取。OWIN的參考是將訊息處理程式管道的一些功能下移到堆疊下端的OWIN中間件了。 3:控制器處理 ......

    uj5u.com 2020-09-09 22:11:13 more
  • 微信門戶開發框架-使用指導說明書

    微信門戶應用管理系統,采用基于 MVC + Bootstrap + Ajax + Enterprise Library的技術路線,界面層采用Boostrap + Metronic組合的前端框架,資料訪問層支持Oracle、SQLServer、MySQL、PostgreSQL等資料庫。框架以MVC5,... ......

    uj5u.com 2020-09-09 22:15:18 more
  • WebAPI-HTTP編程模型

    帶著問題去思考,大家好!它是什么?它包含什么?它能干什么? 訊息 HTTP編程模型的核心就是訊息抽象,表示為:HttPRequestMessage,HttpResponseMessage.用于客戶端和服務端之間交換請求和回應訊息。 HttpMethod類包含了一組靜態屬性: private stat ......

    uj5u.com 2020-09-09 22:15:23 more
  • 部署WebApi隨筆

    一、跨域 NuGet參考Microsoft.AspNet.WebApi.Cors WebApiConfig.cs中配置: // Web API 配置和服務 config.EnableCors(new EnableCorsAttribute("*", "*", "*")); 二、清除默認回傳XML格式 ......

    uj5u.com 2020-09-09 22:15:48 more
最新发布
  • C#多執行緒學習(二) 如何操縱一個執行緒

    <a href="https://www.cnblogs.com/x-zhi/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2943582/20220801082530.png" alt="" /></...

    uj5u.com 2023-04-19 09:17:20 more
  • C#多執行緒學習(二) 如何操縱一個執行緒

    C#多執行緒學習(二) 如何操縱一個執行緒 執行緒學習第一篇:C#多執行緒學習(一) 多執行緒的相關概念 下面我們就動手來創建一個執行緒,使用Thread類創建執行緒時,只需提供執行緒入口即可。(執行緒入口使程式知道該讓這個執行緒干什么事) 在C#中,執行緒入口是通過ThreadStart代理(delegate)來提供的 ......

    uj5u.com 2023-04-19 09:16:49 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    <a href="https://www.cnblogs.com/huangxincheng/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/214741/20200614104537.png" alt="" /&g...

    uj5u.com 2023-04-18 08:39:04 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    一:背景 1. 講故事 前段時間協助訓練營里的一位朋友分析了一個程式卡死的問題,回過頭來看這個案例比較經典,這篇稍微整理一下供后來者少踩坑吧。 二:WinDbg 分析 1. 為什么會卡死 因為是表單程式,理所當然就是看主執行緒此時正在做什么? 可以用 ~0s ; k 看一下便知。 0:000> k # ......

    uj5u.com 2023-04-18 08:33:10 more
  • SignalR, No Connection with that ID,IIS

    <a href="https://www.cnblogs.com/smartstar/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/u36196.jpg" alt="" /></a>...

    uj5u.com 2023-03-30 17:21:52 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:15:33 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:13:31 more
  • C#遍歷指定檔案夾中所有檔案的3種方法

    <a href="https://www.cnblogs.com/xbhp/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/957602/20230310105611.png" alt="" /></a&...

    uj5u.com 2023-03-27 14:46:55 more
  • C#/VB.NET:如何將PDF轉為PDF/A

    <a href="https://www.cnblogs.com/Carina-baby/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2859233/20220427162558.png" alt="" />...

    uj5u.com 2023-03-27 14:46:35 more
  • 武裝你的WEBAPI-OData聚合查詢

    <a href="https://www.cnblogs.com/podolski/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/616093/20140323000327.png" alt="" /><...

    uj5u.com 2023-03-27 14:46:16 more