Blazor 感(gan)覺回到了ASP時代?
大家好,我是碼農剛子。前幾(ji)天分享(xiang)的文章:《ASP.NET Core Blazor簡介和快速入門三(布局和路由)》下面,有朋友評論說:這(zhe)blazor 感覺回到(dao)了asp 時代(dai)。

那么,為什(shen)么會(hui)有這種說法?回想一下ASP時(shi)(shi)代是(shi)什么時(shi)(shi)候,大家還有沒有印象(xiang)。我2019年出來工(gong)作(zuo),當時(shi)(shi)是(shi)做(zuo)C/S開(kai)發(fa)ERP系統,做(zuo)了一年多,后面又(you)轉了B/S開(kai)發(fa),一直(zhi)到現在。兩中不(bu)同的開(kai)發(fa)模(mo)式,針對(dui)兩個不(bu)同的實體行業:一個是(shi)混凝(ning)土攪(jiao)拌站,一個是(shi)pcb工(gong)廠。不(bu)過(guo)都(dou)是(shi)開(kai)發(fa)ERP系統。
為什么會感覺blazor回到了asp時代?我們來看看兩者的相似之處:
這種感覺主要應該源于 “服務端渲染” 模式的回歸。- 以頁面為中心的模型: 在經典 ASP (或 ASP.NET Web Forms) 中,你(ni)構建的是一(yi)個一(yi)個的頁(ye)面(mian)(mian)(.asp 或 .aspx)。每個請求(qiu)都對(dui)應一(yi)個具體的頁(ye)面(mian)(mian)文件(jian)。Blazor 也有 .razor 頁(ye)面(mian)(mian)和組件(jian),在服務(wu)端模式下(xia),導(dao)航到(dao)一(yi)個 URL 會(hui)請求(qiu)服務(wu)器(qi)(qi),服務(wu)器(qi)(qi)處理并(bing)渲染整個頁(ye)面(mian)(mian)后返回。這種“往(wang)返于服務(wu)器(qi)(qi)”的體驗很像老式的 Web 開發。
- 服務器持有狀態: 在(zai) Blazor Server 模式下,組件的(de)狀態(變量(liang)、數據)和 DOM 渲染邏輯(ji)都保存在(zai)服(fu)(fu)務器的(de)內(nei)存中(在(zai)一(yi)個稱為“電(dian)路”的(de)實(shi)時 SignalR 連(lian)接(jie)里)。這與 ASP.NET Web Forms 的(de) ViewState 機(ji)制在(zai)“狀態保存在(zai)服(fu)(fu)務器端(duan)”這一(yi)概念上(shang)有相似之處,雖(sui)然技術實(shi)現完全不(bu)同。
- C# 代碼主導: 你(ni)主(zhu)要(yao)使(shi)用(yong) C# 來(lai)編寫業(ye)務邏輯和 UI 邏輯,而不是(shi) JavaScript。這(zhe)讓習慣(guan)了 C# 后(hou)端開發(fa)的開發(fa)者感到非常親切(qie)和統一,就像當年(nian)用(yong) VBScript/C# 在服務器端寫邏輯一樣。
- 較少的客戶端/服務器分離感: 在(zai)傳統的(de)多頁面應用中(zhong),前端(duan)和后端(duan)的(de)界限比(bi)較模糊(hu)。Blazor Server 也給(gei)人這種(zhong)感覺(jue),因為你不需要專門去構建一個獨立的(de) Web API,服務器端(duan)方法可以直(zhi)接被前端(duan)調(diao)用(通過 SignalR)。
當然,它與“ASP時代”也是有根本不同(tong)的,Blazor是一種“螺旋式(shi)上升”。
為什么說這是一種“螺旋式上升”?盡管(guan)有(you)上述相(xiang)似之處,但(dan) Blazor 絕非(fei)簡單的(de)“復古”,它是在現代 Web 技術棧上對過去理(li)念的(de)重新思考和進化。- 組件化與聲明式UI: 這(zhe)是(shi)最大的(de)不(bu)同。經典(dian) ASP 是(shi)命(ming)令式(shi)(shi)和(he)基(ji)于(yu)字符串模板的(de)。你需要(yao)用 <% %> 塊在(zai) HTML 中混編代(dai)碼,然后手動(dong)控制輸出。而(er) Blazor 是(shi)聲(sheng)明式(shi)(shi)和(he)基(ji)于(yu)組件的(de)。你通(tong)過組件(如(ru) <MyTable Data="@items"/>)來(lai)構建 UI,當數據(ju)狀態 (items) 改變時,UI 會自動(dong)更新(xin)。這(zhe)是(shi)現代(dai)前(qian)端(duan)框架(React, Vue, Angular)的(de)核心思想,Blazor 將其帶(dai)入了 .NET 世界(jie)。
- 強大的數據綁定: Blazor 提供了靈活且強大的(de)雙向數據綁定(@bind),遠(yuan)比(bi)經典 ASP 的(de)簡(jian)單輸出或 Web Forms 的(de)復雜 ViewState 機制要清晰和(he)高效。
- 現代化的實時通信: Blazor Server 使用(yong) SignalR 在客戶端和(he)服(fu)務(wu)器之間建(jian)立(li)持久化的(de) WebSocket 連接。這使得 UI 更新是(shi)增量(liang)式的(de)、實(shi)時的(de),體(ti)驗非常流暢。而經(jing)典 ASP 是(shi)純(chun)粹(cui)的(de)“請(qing)求-響應(ying)”模型,每次交互(hu)都(dou)需要完整的(de)頁面回(hui)發(fa)和(he)刷新,體(ti)驗不可同日而語。
- 清晰的架構選擇:
- Blazor Server: 類似于(yu)“復(fu)古”模式,但底層技術是現代、高效的(de)。
- Blazor WebAssembly: 這是完全不同的(de)模式,C# 代碼直接在瀏覽器中運行(xing),可以構建真正的(de)單頁面應用(yong),完全脫離了“回到服務器”的(de)感覺。這更像是一(yi)個用(yong) C# 編寫(xie)的(de) React/Vue 應用(yong)。
- 擁抱 Web 標準: Blazor 最終(zhong)編譯和運行(xing)在現代瀏覽器標準(zhun)之上(shang)(WebAssembly 或通過 SignalR)。它不依(yi)賴像 Web Forms 那樣笨重的、封(feng)裝了 HTML 的服務器控(kong)件(jian)。
結語(yu)
Blazor Server 模式確實在(zai)開發(fa)體驗(yan)上讓人重溫了服務端(duan)渲染的便(bian)捷和(he)高(gao)效,特別(bie)是(shi)(shi)(shi)對于(yu)后端(duan)開發(fa)者(zhe)來說,用 C# 搞定一切非常爽。但這絕不(bu)是(shi)(shi)(shi)簡單(dan)的倒退,而(er)是(shi)(shi)(shi)‘螺(luo)旋(xuan)式上升’。
它保留(liu)了(le)服務端開發的(de)高生產率(lv)和對(dui)后端資源直接訪問的(de)優(you)點,但(dan)同(tong)時(shi)融入了(le)現代前端框架的(de)‘組件化(hua)’和‘聲明式UI’等先進理念。而且,你還有(you) Blazor WebAssembly 這(zhe)個選項,可以(yi)讓你用同(tong)樣的(de)技術棧構(gou)建完(wan)全在客戶端運行的(de)單頁面應用。所以(yi),它更(geng)像(xiang)是取二(er)者之精華,為 .NET 開發者提供(gong)了(le)一(yi)條(tiao)通往現代 Web 開發的(de)全新路徑。
簡單來說,我認為 Blazor 降低 .NET 開發者進入現代 Web 開發門檻——它讓(rang)熟悉服務器端思維(wei)的人能夠平滑過渡,同時又(you)賦予(yu)了他(ta)們(men)構(gou)建(jian)現(xian)代化、交互式(shi) Web 應用(yong)的能力(li)。
