尽管Blazor仍处于alpha版本,但我希望开始使用它。
据我所知,Blazor使用WebAssembly在客户端编译C#代码。
我的问题如下:
这种方法是否比例如React / Vue.js等JavaScript编译更快?
浏览器每次加载页面时是否需要下载WebAssembly库?
因为互联网上没有流行JavaScript框架性能的比较,所以我想了解微软新框架的理论性能。
尽管Blazor仍处于alpha版本,但我希望开始使用它。
据我所知,Blazor使用WebAssembly在客户端编译C#代码。
我的问题如下:
这种方法是否比例如React / Vue.js等JavaScript编译更快?
浏览器每次加载页面时是否需要下载WebAssembly库?
因为互联网上没有流行JavaScript框架性能的比较,所以我想了解微软新框架的理论性能。
浏览器每次加载页面时都需要下载WebAssembly库吗?
不需要,浏览器可以缓存文件。通常为Blazor应用程序提供的CDNs就可以解决这个问题。
相比于JavaScript编译的React/Vue.js等库,这个系统工作速度更快吗?
Blazor使用WebAssembly,在理论上,WebAssembly应该比任何JavaScript库更快。然而,并非所有浏览器都有成熟的WebAssembly解析器。因此,您可能会发现,目前一些浏览器无法以最优速度运行WebAssembly。
您可以创建一个小型的Blazor应用程序,并在Firefox、Chrome或Edge中运行它。在大多数情况下,Firefox比Chrome或Edge更快地运行Blazor应用程序,这意味着浏览器制造商仍需要改进,即使Firefox也可以改进。
如果您的应用程序需要频繁访问DOM,那么与任何JavaScript库相比,WebAssembly/Blazor肯定会更慢,因为WebAssembly不能直接访问DOM,必须使用调用(目前速度较慢,请参见下面的Blazor基准测试)。
在Firefox上,对于空方法的10,000个RegisteredFunction.InvokeUnmarshalle
调用只需要250毫秒,而Chrome和Edge在我的电脑上需要超过2400毫秒。在纯JavaScript中,相同的场景只需要不到10毫秒。
此外,Blazor的当前实现在浏览器的WebAssembly引擎之上有自己的MSIL引擎,这意味着有两个解释器正在运行Blazor项目,就像两个翻译员相互解释一样。目前,Microsoft正在开发一个AOT编译器,但尚未发布。一旦发布,Blazor将比当前的实现更快。
Mono and WebAssembly - Updates on Static Compilation
我们可以安全地假设WebAssembly是Web开发的未来,但目前我们无法确定Blazor的未来。从理论上讲,Blazor可能比任何其他框架都要快,但我们需要WebAssembly维护者、浏览器开发人员、Microsoft和社区的承诺来使这些理论得以实现。
WebAssembly仓库中有新的提案。
允许WebAssembly直接处理DOM。
接口类型 #8带垃圾回收的WebAssembly参考类型。WebAssembly参考类型
以上两个提案将为将来DOM和WebAssembly之间更快速的交互铺平道路。换句话说,Blazor在将来将会更快。
火狐团队成功实现了JavaScript到WebAssembly的调用速度与JavaScript到JavaScript方法调用一样快。目前火狐在支持WebAssembly方面遥遥领先于其他任何浏览器。
2021年4月,我们针对一款传统的Angular.js Web应用程序以及Flutter Web(HTML和CanvasKit渲染器)进行了Blazor WASM试验。 我们重新创建了传统应用程序的主页面(本质上是一个带有筛选、分页、排序等功能的大型数据表格)。以下是一些要点:
Lighthouse perf. Scores
Grid Displ. Data transf. Data uncomp. Reqs. FCP SI LCP TTI TBT CLS
Blazor* 2.2s 4.7MB 13.7MB 99 0.5s 1.6s 0.5s 2.1s 1.3s 0.01
Flutter HTML 1.7s 2.1MB 3.7MB 15 1.9s 2.5s 2.2s 2.3 0.2s 0
Flutter CanvasKit^ 2.8s 4.7MB 10.5MB 17 1.0s 2.2s -/- 2.2s 1s 0
AngularJS` 1.9s 2.0MB 5.7MB 294 2.1s 2.2s 2.6s 2.6s 0.1s 0
*Lighthouse给出的LCP值不正确(它将Blazor的空白“正在加载...”页面视为LCP)
^Flutter的CanvasKit渲染器不允许Lighthouse进行LCP测量
`遗留的应用程序比创建的PoCs要大得多,拥有更多的屏幕和资源,这会影响应用程序启动时的请求数量
一个重要的问题——它值得使用吗?我已经使用它大约六个月了。
对我来说,它非常好用。C#是一种很好的语言。有时候我会想念动态添加属性的功能,而且你经常需要手动启动重绘,但是有了像可空对象检查这样的特性,它会警告你没有检查你的代码是否可能导致空引用检查——它比JavaScript好多了。我经常觉得使用JavaScript "工具链"很痛苦。能够选择退出JavaScript库的混乱真是太好了。
基于:.net 7(2023 更新)
Blazor 网站现在更加成熟,当使用适当的 brotli 压缩和裁剪时速度更快。理论上,通过利用 WebAssembly 的性能优势,Blazor 可以在浏览器中实现类似本地的性能,这使其成为高性能应用程序的不错选择,但这只有在 wasm 直接访问 DOM 时才能看到。虽然还没有达到标准,但能够为前端 Web 应用编写 C# 代码是一种魔法。
如果您有兴趣看到它的实际效果,请务必查看我们自己的项目 PhotosNepal.com - 这是一个完全基于 Blazor 构建的库存图像网站。我们对结果感到满意,但还有一些需要改进的地方。