Hello Blazor:(4)终于有人把Blazor WebAssembly和Blazor Server的区别讲清楚了! #yyds干货盘点#_.net

从上图可以看到,实际上微软提出了两种托管Blazor应用程序的方法:

  • Blazor WebAssembly
  • Blazor Server

那么,它们之间有什么区别呢?

现象

想了解两种Blazor托管方式的简单方法,就是创建一个包含Blazor WebAssembly和Blazor Server项目的Visual Studio解决方案。

项目结构

两个项目的目录结构基本相似,都是基于ASP.NET Razor语法,混合了HTML代码、C#代码和特定Blazor标记来创建动态网页。例如,有一个counter.razor页面,其源代码在两种托管模式下完全相同:

Hello Blazor:(4)终于有人把Blazor WebAssembly和Blazor Server的区别讲清楚了! #yyds干货盘点#_数据_02

运行效果

在调试模式下第一次打开页面时,两个项目需要执行请求的数量和传输数据的大小有明显区别:

  • Blazor WebAssembly项目需要传输9.4MB的数据,在我本机,加载完毕都需要接近2秒,这也导致出现明显的Loading页面 
  • Hello Blazor:(4)终于有人把Blazor WebAssembly和Blazor Server的区别讲清楚了! #yyds干货盘点#_服务器_03
  • Blazor Server项目仅需要传输161KB的数据,页面几乎瞬时加载完成 
  • Hello Blazor:(4)终于有人把Blazor WebAssembly和Blazor Server的区别讲清楚了! #yyds干货盘点#_服务器_04

一旦我把项目停止运行,Blazor WebAssembly项目还是可以正常工作,而Blazor Server项目则立刻提示要重连服务器: 

Hello Blazor:(4)终于有人把Blazor WebAssembly和Blazor Server的区别讲清楚了! #yyds干货盘点#_.net_05

部署方式

2个项目的发布文件也明显不同。

Blazor WebAssembly项目只有一个wwwroot目录,目录内部除了_framework目录以外也基本上是html常规文件;而Blazor Server项目则是明显的ASP.NET Core项目的输出。 

Hello Blazor:(4)终于有人把Blazor WebAssembly和Blazor Server的区别讲清楚了! #yyds干货盘点#_.net_06

同样,Blazor WebAssembly项目可以独立部署到静态文件服务器,而Blazor Server项目则必须部署到ASP.NET Core应用服务器上。

原理

我们已经看到了Blazor WebAssembly和Blazor Server的众多区别,下面我们再来讲讲是什么造成的:

Blazor

Blazor是一个使用.NET生成交互式客户端Web UI的框架。Blazor使用Razor语法,用于将HTML标记与C#代码结合在一起。最后会将C#代码文件和Razor文件统一编译为.NET程序集。

Blazor WebAssembly和Blazor Server都是基于Blazor框架,这也是它们项目结构基本相同的原因。

WebAssembly标准

WebAssembly是一种可移植的二进制代码语言,很像.NET IL代码,其目标就是充分发挥硬件能力以达到原生执行效率。所有现代浏览器都支持WebAssembly。

WebAssembly运行在一个沙箱化的执行环境中,甚至可以在现有的JavaScript虚拟机中实现。WebAssembly可以被 JavaScript调用,进入JavaScript上下文,也可以像Web API一样调用浏览器的功能。当然,WebAssembly不仅可以运行在浏览器上,也可以运行在非web环境下。

Blazor WebAssembly

顾名思义,Blazor WebAssembly依赖于WebAssembly标准(通常简称为wasm)。

但是由于.NET的IL格式和WebAssembly是2种不同的二进制文件格式。因此,Microsoft实现了包含.NET运行时的WebAssembly文件:dotnet.wasm。它的职责之一就是,编译IL代码以在WebAssembly边界内执行。 

Hello Blazor:(4)终于有人把Blazor WebAssembly和Blazor Server的区别讲清楚了! #yyds干货盘点#_.net_07

这样就导致运行Blazor WebAssembly项目时,所有dll都必须传输到客户端。​这就是传输的数据比较大的原因。

另外,程序直接在浏览器中执行,​所以,即使断网也不受影响。

同时,WebAssembly不依赖.NET运行时,​因此可以部署在静态文件服务器上。

Blazor Server

Blazor Server项目不涉及WebAssembly,所有组件呈现逻辑都是在服务端实现的,只是将需要处理的UI更新通过SignalR发送给浏览器。 

Hello Blazor:(4)终于有人把Blazor WebAssembly和Blazor Server的区别讲清楚了! #yyds干货盘点#_数据_08

浏览器仅需处理javascript、CSS和HTML代码。​因此传输的数据比较小。

但这样导致Blazor Server项目必须实时和服务端交互​,使用类似_blazor?id=xxx这样的连接传递数据: 

Hello Blazor:(4)终于有人把Blazor WebAssembly和Blazor Server的区别讲清楚了! #yyds干货盘点#_服务器_09

当然,服务端必须依赖.NET运行时,​因此只能部署在ASP.NET Core应用服务器上。

优缺点

根据我们看到的,很容易比较两种Blazor托管方式的优缺点:

  • Blazor WebAssembly的优点
  • 在浏览器中执行C#代码,不需要额外的插件
  • 可以基于WebAssembly的性能优势和可在浏览器内执行的能力,获得更快页面处理速度
  • 支持无服务器和离线场景
  • Blazor WebAssembl的缺点
  • 需要加载太多资源,首次展现速度较慢
  • 由于所有代码都在浏览器中执行,不能嵌入机密数据
  • Blazor Server的优点
  • 页面加载是轻量级的
  • 服务器可以使用机密数据,例如访问数据库
  • 它支持100%的浏览器,即使是那些没有WASM支持的浏览器,如Internet Explorer。
  • Blazor Server的缺点
  • 需要一个ASP.NET Core服务器
  • 不支持无服务器和离线场景
  • 大量SignalR连接可能引发性能问题

结论

希望你现在Blazor WebAssembly和Blazor Server有了更清晰的认识。

有了这些知识,你现在可以轻松选择哪种项目开始Blazor开发了。

如果你觉得这篇文章对你有所启发,请关注我的个人公众号”My IO“,记住我!

Hello Blazor:(4)终于有人把Blazor WebAssembly和Blazor Server的区别讲清楚了! #yyds干货盘点#_服务器_10