Blazor与Razor的比较

96

有了 Blazor 的发明,我正在想知道这两种语言在代码创建、代码的实际编译/执行方面是否存在显著的效率差异?

https://github.com/SteveSanderson/Blazor

如果有人已经实施过它,您是否进行了任何性能测试,或者在与普通 Razor 相比较的编写过程中,是否有相关的口头反馈(是的,抱歉,我要求这个)?


7
Blazor只是一个使用Razor语言在客户端的框架。它们不能直接进行比较,因为一个是带有C#的标记语言,而另一个是允许您在浏览器中运行C#代码和Razor视图引擎的项目。 - SteelToe
最大的区别在于Blazor将一些代码编译为Web Assembly。(我相信.NET组件与之捆绑)据我所读,迄今为止,当访问DOM时,Web Assembly速度较慢。在这方面,Javascript更好。当您想要在画布内动画显示某些内容时,Web Assembly的速度提升才会显现。 - pcalkins
这里有一篇关于Blazor和Razor的区别的好文章:https://www.telerik.com/blogs/difference-between-blazor-vs-razor - Vladislav
Blazor会取代Razor吗? - aj go
3个回答

108

下面的信息大部分是从Steven Anderson的2月2日博客文章和我对该项目目标的理解中改编而来:

Blazor旨在将当前.NET Razor堆栈的思想与现代SPA框架架构相结合。

代码创建

旨在灵活,并鼓励基于组件的布局,如此示例所示:

<div class="my-styles">
   <h2>@Title</h2>
   @RenderContent(Body)
   <button onclick=@OnOK>OK</button>
</div>

@functions {
    public string Title { get; set; }
    public Content Body { get; set; }
    public Action OnOK { get; set; }
}

创建了一个在HTML标记中可重复使用的组件:

<MyDialog Title="Ski Lift controls" onOK="DismissSkiDialog">
    Gondola @gondolaId is now <em>running</em>
</MyDialog>

执行

Blazor期望速度快,因为WebAssembly很快。它编译为字节码,由浏览器的wasm加载器直接执行。例如,在javascript中,需要首先加载.js文件并组合不同的文件,然后解析和标记,并构建成树结构,最后可以被浏览器的javascript引擎(例如chrome的v8引擎)解释。

有关WebAssembly和javascript执行的深入比较,请参见此文章

SPA体系结构和设计

由于已经有了伟大的用于Web的javascript框架,Blazor已受到现代框架(如React、Vue和Angular)中已使用的思想的启发,并将包括在该文章中详细介绍的概念:

  • 布局
  • 路由
  • 依赖注入
  • 延迟加载
  • 单元测试

请注意,虽然在Razor中这些概念存在于服务器端,但并非所有这些概念都存在于客户端。前端路由在Razor中不可用,通常与javascript框架结合使用以填充该场景。

我个人曾在服务于Razor页面和AngularJs的企业应用程序上工作过。有时可能会变得混乱,并且永远不会感觉“干净”。

总结

Razor是用于服务器端架构的解决方案,可以处理API逻辑和服务器端模板化,但无法在JavaScript之外提供客户端逻辑。

Blazor是下一步(并希望成为Razor的继承者),将允许使用C#集成客户端逻辑,实现与Razor相同的服务器端功能。

我目前正在使用Blazor进行小型测试项目,并且到目前为止我发现它很容易使用。但是,博客和GitHub页面上的警告表明,它还远未准备好面向生产。

来自2018-09-26的第三方编辑

在.NET Conf 2018中宣布,Razor组件(“服务器端Blazor”)将成为.NET Core 3.0的一部分。演示了以下代码:

// inside index.cshtml - serverside use of blazor
<SurveyPrompt Title="How is Blazor working for you?" />
<div>
     <img id="bot" src="@imageurl" />
<div>
<button class="btn btn-primary" onclick="@changeImage">Click me</button>

@functions{

    string imageurl = "/images/dotnet-bot-1.png";

    void changeImage()
    {
        if(imageurl.Contains("1"))
        {
            imageurl= imageurl.Replace("1", "2");
        } 
        else 
        {
            imageurl= imageurl.Replace("2", "1");
        }
     }
}

7
你的例子中应该使用“代码”而不是“函数”。请注意,翻译时要保持原意,使语言通俗易懂,不需解释或提供其他信息。 - Nechemia Hoffmann
1
这个答案可能需要更新 :) - Pieter
自从回答这个问题以来,我就没有继续关注 Blazor 的开发。请随意提出/编辑建议。 - Felipe

17

简而言之:

Razor是一种流行的.NET模板标记语法。 Blazor(浏览器+ Razor)是一个基于.NET的Web框架,可以通过WebAssembly在客户端上运行,也可以通过SignalR在服务器上运行。

举个例子,当你用ASP.NET创建Web应用程序时,你会使用Razor语法,这可能是你以前见过的:

<h1>
  Hello @Model.Username
</h1> 

使用 Razor,根据您的模型数据渲染 HTML,同时支持各种条件和循环。而 Blazor 是一种类似于 ASP.NET CoreASP.NET MVC 的技术:

它可以为 Web 应用程序提供支持,并使用 Razor 作为其 UI 创建的模板语法。一个常见的误解是 Blazor 使用 Razor。这被两个其他类似的术语进一步加剧 - Blazor 组件和 Razor 组件。它们经常被交替使用,但正确的术语是 Razor 组件。组件是在单个 Razor 文件中(具有 .cshtml 扩展名)结合了标记(用 HTML 编写)和逻辑(用 C# 编写)的内容。

您可以在此处找到更多信息。


0
你可以把Blazor看作是带有额外功能的Razor组件!Razor家族的其他变体包括Razor视图和Razor页面。ASP.NET已经将它们合并在一起,你可以在一个项目中使用它们。它们只是ASP.NET Core中的服务,你可以注册或注入你想要的内容,这是ASP.NET的一个非常好的特性。请查看eShopOnWeb参考应用程序。 eShopOnWeb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接