(2/30)大家一起學blazor:網頁和blazor居間

(2/30)大家一起學blazor:網頁和blazor居間

筆者對網站的認知為前端、後端及資料庫,使用者在瀏覽器頁面按下按鈕或是表單請求,觸發前端事件,將收集起來的條件打包送往後端

最后更新 2021/12/9 下午11:04
StrayaWorker
预计阅读 6 分钟
分类
Blazor
专题
一起學blazor系列
标签
.NET C# ASP.NET Core Blazor

筆者對網站的認知為前端、後端及資料庫,使用者在瀏覽器頁面按下按鈕或是表單請求,觸發前端事件,將收集起來的條件打包送往後端,後端接收條件後去資料庫據此處理判斷,撈出使用者想要的數據後,後端將頁面、數據回傳給前端,前端再將相應數據呈現在頁面上,這就是最原始的前後端交流。

後來有人發現每次都要刷新頁面實在太麻煩,而發展出了可以異步執行的 ajax 技術,假如一個事件 a 沒做完的話,其他事件 b, c 不會等 a 做完,而是會自己往下做,如此一來當使用者發送表單請求時,網頁不會一直跑小圈圈等待刷新,而是會先讓使用者看到頁面,其他事在使用者看不到的地方繼續處理,這樣大大提升了使用者體驗。

由於動態網頁規範已經被 js 統一,即便後來出現強類型的 tyepscript (也就是 angular, react,vue 等前端框架使用的語言),最終仍要編譯成瀏覽器認識的 js,且 tyepscript 也是基於 js,所以一個後端工程師若要自己寫個網站,就不可避免地必須跟 js 打交道,對於習慣強類型的人來說無異從頭拓荒,若是遇到公司規範不嚴又遇到喜用任意類型的同事,一個變量可以一下使用 number,一下又使用 string,就足以讓人抓狂了,幸好這時 blazor 出現了。

blazor 是 browser 和 razor 的合成字,代表在瀏覽器上執行的 razor 組件。

blazor 分為兩種模式,webassembly hosting 及 server hosting,簡單來說就是 client side 及 server side,兩者各有優缺點。不過在繼續說下去前要先說明 webassembly 是什麼。

webassembly 簡稱 wasm,是一種二進位表示語言,任何程式語言經過特定編譯都可以轉成 wasm,wasm 的優點是將整個程式傳到瀏覽器而不需要伺服器,由於是二進位且已經編譯過的關係,渲染網頁的速度會比 js 更快,文件也會更小。

blazor webassembly 是將編譯過的 dll 文件及.net 運行時打包後發送到使用者的瀏覽器,所以第一次建立連接時會比較慢; blazor server 則是在伺服器跟瀏覽器之間建立 singalr 連接,當瀏覽器觸發事件後,server 處理完不是整頁刷新(將所有 html 元素送往前端),而是通過 singalr 將變化的元素(如 div)送往瀏覽器,這是因為 blazor 也是如 angular 使用 spa(single page application)模式,從頭到尾只有一個頁面,上面布滿了不同功能的 components,觸發事件只會更新相關 component。

Blazor WebAssembly

優點:

  1. 因為文件都在瀏覽器上,速度相較於 blazor server 更快
  2. 不需要伺服器
  3. 不需要隨時跟伺服器連接
  4. client 端的瀏覽器被充分利用,減輕伺服器負擔
  5. 可以架在任何伺服器上,例如雲端、微軟的 azure 甚至 cdn(content delivery network,一種將數據暫存到離使用者地理位置更近的模式,比如說我如果想登入主機在美國的網站,速度一定比主機在台灣的網站慢得多,cdn 會將數據暫存在離台灣比較近的地區的主機,如香港、新加坡,讓使用者連接速度更快)

缺點:

  1. 第一次載入會花比較多時間,因為瀏覽器要下載.net runtime 等組件(註:鐵人賽前筆者建立了新的 blazor webassembly 項目,發現已經沒下載組件了,微軟官方圖片也沒看到有下載組件,或許是新版本有所改動)
  2. 受限於瀏覽器的處理能力
  3. client 端的軟硬體都很重要

Blazor Server

優點:

  1. 載入速度比較快
  2. 可以充分利用伺服器的能力
  3. 任一 client 使用這軟體唯一需要的只有瀏覽器
  4. 由於原始碼不會傳到 client 端所以會更安全

缺點:

  1. 需要伺服器
  2. 需要跟伺服器保持連接
  3. 由於數據來回傳遞,延遲感會更重
  4. 不容易提升運算能力,因為一個伺服器能承受的 client 端有限,微軟給出的數據為一個單核配有 3.5g 內存的 blazor server 可以處理 5000 個連接;一個四核配有 14g 內存的 blazor server 可以處理 20000 個連接。

若將 blazor webassembly 和 blazor server 的優缺點分別列出,可以看到沒有一種模式是最完美的,只有最適合的。如果已經有了其他程式語言架構的伺服器如 php, node 或是 rails,需要一個提供給使用者且不需要時刻連接伺服器的 client 端程式,blazor webassembly 就是很好的選擇,且 blazor webassembly 具有 pwa (progressive web app)功能,雖然以網站模式開發卻能讓使用者像下載軟體一樣下載到桌面或是手機,知名網站如 twitter, pinterest, starbucks 都是知名例子,如果用電腦開啟 twitter 網站,就能在網址列最右方看到下載的按鈕;而如果需要從無到有生出一個需要頻繁連接伺服器(如對數據新增、修改、刪除)的網站,就適合用 blazor server。

不過 blazor 畢竟是微軟的新產品,筆者也只用過 asp.net core 搭配 blazor,blazor webassembly 想跟 php 等非微軟語言開發的後端整合或許會有其他要注意的地方,若有相關需求的人可能要多方考量。

講了一大堆文字,想必還是很多人跟筆者一開始接觸時一樣沒有看懂,明天筆者會將兩種項目都創建起來,讓大家看一下兩者差在哪裡。

註:本文代碼通過 .net 6 + visual studio 2022 重構,可點擊原文連結與重構後代碼比較學習,謝謝閱讀,支持原作者

Keep Exploring

延伸阅读

更多文章
同分类 / 同标签 2021/12/25

(29/30)大家一起學blazor:blazor單元測試

開發一個系統最無聊的過程大概就是解決bug了,尤其是那種嘗試對null 對象取值的錯誤(`object reference not set to an instance of an object.`),這應該是大部分人剛踏入編程領域最常碰到的問題,為了從枯燥的解決bug過程解脫,這篇就來居間`單元測試`。

继续阅读
同分类 / 同标签 2021/12/25

(28/30)大家一起學blazor:policy-based authorization

之前有說到`asp.net core identity` 使用的是基於`claim` 的驗證,其實`asp.net core identity` 有不同類型的授權方式,最簡單的`登錄授權`、`角色授權`、`claim 授權`,但上述幾種都是以一種方式實現:原則授權(`policy-based authorization`)。

继续阅读