我很困惑Razor组件和Blazor之间的区别是什么,哪个更好,在最新版本的.NET Core 3.0 Preview 3中,将那些添加到Razor组件中
剃刀组件的改进:
答案 0 :(得分:17)
基本上,有3个部分需要理解。
剃刀组件
这是早在2018年7月为服务器端Blazor的第一版创建的核心,进程外组件模型的名称。
Razor组件是框架的核心,包含以下所有内容。
服务器端Blazor
这是在ASP.NET Core上运行的Razor组件的服务器端托管模型。此版本在服务器上托管Razor组件模型。它使用小的运行时将UI事件从浏览器发送到服务器。一旦由Razor Components处理,所有UI更新都将从服务器发送回浏览器,并且运行时将处理DOM更新。所有这些通信都是通过SignalR连接进行的。甚至JS互操作调用都是以这种方式处理的。
客户端Blazor
这是Razor组件的客户端托管模型。
在此模型中,所有内容都托管在浏览器中。 .NET运行库是编译为WebAssembly的Mono。最重要的是Razor Components,然后是应用程序。
关于此体系结构的一件好事是,从理论上讲,添加到Razor组件的任何功能都应可用于两个托管模型。尽管实际上,并非总是如此。
有什么更好的方法?
这在很大程度上取决于您想做什么。
客户端Blazors最大的缺点是其下载大小。仅此一项就可以排除许多开发人员。下载很容易就变成了多个MB,如果有人试图在连接速度慢的移动设备上查看您的应用程序,他们将不会有很好的体验。但是,值得注意的是,第一次下载后会缓存很多内容,因此后续加载可能只有几百个kb。
客户端Blazors调试经验现在也很原始。这意味着以开发人员身份进行开发有时可能会充满挑战。
服务器端Blazor在调试方面拥有更好的开发人员经验。该应用程序的下载速度更快,并且只有几百个kb的大小,然后才能进行任何缓存。
缺点是潜在的可扩展性。但这在很大程度上取决于您期望的并发用户数。由于此模型使用SignalR,因此您的应用将对并发连接有最高限制。但是,您可以通过插入Azure SignalR进行管理,以允许与您的应用程序进行更多的连接。
最终,两个Razor Components托管模型还有很长的路要走。尽管可以说客户端Blazor处于更好的位置,但两者的认证故事还处于初期。路由引擎仍然受到限制,表单和验证仅在其首次发布时才有,并且仍有工作要做。
要记住的另一件事是,可以很容易地在模型之间进行交换。因此,无论您做出什么决定,都不会受其束缚。甚至在某个时候,都将有一种将其内置到框架中的方法,因此您现在所做的一切都不会浪费。
任何问题,请询问。但我希望这会有所帮助。
答案 1 :(得分:8)
Razor组件是一个框架,可用于创建SPA Web应用程序。它分为两种执行模式。当Web应用程序在浏览器上托管并执行时,它称为Blazor。 Blazor应用程序用C#编写并编译成.NET程序集。它们由Mono运行时作为.NET程序集执行并在浏览器上运行,而Mono运行时本身已编译为Web Assembly。
第二种执行模式是服务器端。也就是说,您的Web应用是在服务器上执行的,而不是在浏览器上执行的。请注意,此处的运行时环境不是Mono Web Assembly,而是Asp.net Core运行时。这被称为服务器端Blazor,但也使用了术语Razor Components,因此混淆不清。原因是历史性的:一开始,浏览器中仅运行Blazor。但是后来想到了一个Web应用程序可以在服务器上运行的想法,并且只有diff可以通过SignalR发送到浏览器。在服务器上运行Web应用程序比在浏览器上运行容易得多,并且开发人员可以使用他在浏览器中无法使用的许多元素,例如调试等。由于这种可能性,Asp.Net重命名了Blazor框架作为Razor组件,您可以将其视为构建Blazor的超结构。这就是为什么混乱。让我们强调一下这种划分:
Razor组件-> Blazor(前端;浏览器)
Razor组件-> Razor组件(服务器端Blazor)
我知道这是造成混乱的原因,但这就是...
关于哪个更好的问题,我只能说这完全取决于您的要求。这些执行方式中的每一种都有其优点和缺点。 Blazor应用程序更适合作为公共网站在Internet上运行,而服务器端Blazor应用程序最好在Intranet上作为企业网站使用。
您显示的列表与Razor组件框架有关。目前,某些改进可能仅与Blazor有关,而其他改进与服务器端Blazor有关。只有一种方法可以知道哪种:学习剃刀组件。学习它要花时间,比Angular少,尤其是如果您是.Net开发人员,但这仍然需要一些投资。
希望这会有所帮助... 稍后我会对其进行改进,但是如果您有特定问题,请随时提出...
答案 2 :(得分:1)
您完全有权利混淆,命名已经发生了很大变化,当您撰写原始问题时,Blazor团队最近将“ Server Side Blazor”重命名为“ Razor Components”。值得庆幸的是,该方法已被放弃,请参见下面的时间表以获取更多信息。
对于任何发现此处答案中的命名约定似乎与他们在较早的博客文章中所阅读的内容不符的人来说,值得一提的是,“剃刀组件”的含义随着时间的推移反复变化。
这也可能会帮助像我这样从一开始就使用Blazor并确定名称已更改的人!
在预发行期间,命名已经发生了很大变化。微软和Blazor团队因想出清晰的名称并愿意在需要时改回名称而致以荣誉。但是,这在较旧的文章中留下了混合命名约定的遗产,并且某些Blazor退伍军人有时会使用较旧的命名约定。
截至2020年9月,Blazor的版本为3.2,the official naming convention为:
当Blazor 0.6.0发布时,决定将服务器端Blazor正式命名为“ Razor组件”。
Dan Roth在2018年10月的Blazor 0.6.0 experimental release now available博客文章中对此进行了讨论:
我们上个月在.NET Conf上宣布,我们已决定搬迁 通过将Blazor服务器端模型作为ASP.NET的一部分进行交付而向前发展 .NET Core 3.0中的核心。大约有一半的Blazor用户表示他们 将使用Blazor服务器端模型,并将其运送到.NET Core中 3.0将使其可供生产使用。作为将Blazor组件模型集成到ASP.NET Core中的一部分,我们决定提供 它是一个新名称,以区别于在.NET中运行.NET的功能。 浏览器:Razor组件。
ASP.NET Core updates in .NET Core 3.0 Preview 2博客文章中对此进行了更多讨论。
可能是由于引起的混乱,服务器端Blazor的Razor组件名称已扩展为“ ASP.NET Core Razor组件”。 Blazor 0.8.0 release notes中提到了这一点:
服务器端Blazor现在是.NET Core中的ASP.NET Core Razor组件 3.0正如最近宣布的那样,服务器端Blazor现在作为.NET Core 3.0中的ASP.NET Core Razor组件提供。我们已经整合了 将Blazor组件模型引入ASP.NET Core 3.0,并将其重命名为Razor 组件。 Blazor 0.8.0现在基于Razor组件构建并启用 您可以在WebAssembly的浏览器中托管Razor组件。
在April 2019 Blazor server side went into official preview中,服务器端Blazor的命名又被改回了一部分:
简化命名和版本控制
一段时间以来,我们在某些情况下使用术语“剃刀组件”,而在另一些情况下使用Blazor。 案件。事实证明,这令人困惑,因此请注意以下几点 社区反馈,我们决定不再使用ASP.NET Core Razor 组件,然后改回服务器端Blazor。
这强调Blazor是具有多个功能的单个客户端应用程序模型 托管模型:
- 服务器端Blazor 通过SignalR在服务器上运行
- 客户端Blazor 在WebAssembly上运行客户端
...但无论哪种方式,它都是相同的编程模型。相同的剃刀 组件可以在两种环境中托管。
请注意,在上面的描述中根本没有提到Razor组件,现在我们有两种不同的Blazor托管模型(客户端和服务器端)作为将Blazor组件传递到浏览器的方式。
Dan Roth的下一个版本的Blazor和.NET Core发行说明不再提及“剃刀组件”一词,直到.NET Core 3.0 Preview 9时,该术语又以“剃刀组件单元测试框架”的名义出现。原型”。
到2020年5月,Razor组件和Blazor组件现在将彼此用作同义词,并且两种托管模型的命名也已发展。
Blazor WebAssembly 3.2.0 now available博客对此进行了如下描述(我强调):
然后可以以不同的方式托管Blazor组件,以创建您的Web应用程序。第一种受支持的方式称为 Blazor服务器。在 Blazor Server应用程序,则组件使用.NET Core在服务器上运行。
然后...
Blazor WebAssembly 现在是支持 Blazor组件的第二种受支持的方式:使用基于WebAssembly的.NET在浏览器中托管客户端 运行时。
如果真的这样会容易得多。似乎“ Blazor Component”会更自然。但是没有,来自Components section of the official documentation:
Blazor中的组件正式称为Razor组件。