asp.net 自动渲染模式在Blazor .NET 8中如何工作?

wydwbb8l  于 12个月前  发布在  .NET
关注(0)|答案(1)|浏览(206)

我一直在.NET 8中试用Blazor,我试图了解自动渲染模式是如何工作的。根据我所了解的,Blazor最初在自动模式下使用WebSocket连接,通过服务器端渲染提供交互性。然后,当WASM资源在后台加载时,它切换到WebAssembly(WASM)。
然而,在我的测试中,我注意到在WASM资源完全加载之前没有可用的交互性。在浏览器的网络选项卡中,我可以看到一个WebSocket连接,但似乎UI只是预渲染而不是交互式的。
我还了解到,要在WASM中呈现的组件应该放在ProjectName.Client项目中,并且这些组件不能设置为WASM以外的任何呈现模式(包括服务器模式)。但如果自动模式要求组件通过WebSocket连接进行交互,(就像我们在Blazor Server应用程序中所做的那样),如何将这些组件放置在ProjectName.Client项目中?
在我的测试中,我启用了网络节流来模拟慢速网络,我发现Auto模式的行为与WASM渲染模式几乎相同。两种模式都提供预渲染,但在加载WASM资源之前没有交互性,即使在Auto模式下也是如此。
另外,我注意到如果我在WASM和自动渲染模式下都禁用预渲染,那么在WASM资源完全加载之前,任何组件都不可见。这似乎与自动模式应该尽快提供交互性的想法相矛盾。
我从Blazor的创建者Steve Sanderson那里看了这个YouTube video。在视频中,它显示了当一个组件在自动模式下第一次加载时,它使用WebSocket连接进行渲染和交互。从第二次刷新开始,它通过WebAssembly加载。然而,我在测试中似乎没有观察到这种行为。
有谁能解释一下自动模式在Blazor .NET 8中是如何工作的吗?如果它是WASM,只是预渲染,那么它与WASM渲染模式有什么区别(因为所有交互式渲染模式默认情况下都有预渲染)?任何见解都将受到极大的赞赏。🙏

gblwokeq

gblwokeq1#

经过数周的调查,以了解自动渲染模式在Blazor中的工作原理,我找到了答案。
我可以看到一个WebSocket连接,但似乎UI只是预渲染,而不是交互式的。
这是不对的。Blazor打开的与服务器的WebSocket连接用于在加载WebAssembly之前带来交互。它不明显的原因是Wasm在加载之后立即加载,因此客户端没有足够的时间通过它发送任何数据。您可以通过在浏览器的访客窗口中启用网络节流并打开wapp(Web应用程序)来验证此行为。
如果Auto模式要求组件第一次通过WebSocket连接进行交互(就像我们在Blazor Server应用程序中所使用的那样),那么如何将这些组件放置在ProjectName.Client项目中?
好吧,虽然组件放在Wasm项目中,但如果需要,它也可以在Auto模式下由Server渲染。由于.NET Blazor项目的结构,我猜他们没有其他解决方案。我认为这是因为渲染一个组件,放在Client项目中,在Server模式下比在Wasm模式下渲染Server组件更容易实现。
这可能看起来有点奇怪,但它的工作。
另外,我注意到,如果在WASM和自动渲染模式下禁用预渲染,那么在完全加载WASM资源之前,任何组件都不可见。
在Wasm渲染模式下,你是对的,这种行为是预期的。但在自动模式下,在后台发生的事情是wapp等待Wasm加载几毫秒。如果加载在这段时间内完成,那么它不会建立WebSocket连接,而是直接使用Wasm进行交互。但如果Wasm完全加载需要很长时间,然后它将建立一个临时的WS连接,以便在加载Wasm之前提供交互性。同样,您可以通过在启用网络节流的访客窗口中打开wapp来验证此行为。
在视频中,它显示了当一个组件在自动模式下第一次加载时,它使用WebSocket连接进行渲染和交互。从第二次刷新开始,它通过WebAssembly加载。然而,我在测试中似乎没有观察到这种行为。
在预览版中,它 * 曾经 * 是这样的,但它已经改变了。现在在.NET 8版本中,发生的事情更加令人兴奋。不需要刷新。当Wasm加载时,它从服务器检索组件的状态,并立即交换它们;而不需要刷新页面。从下一次访问开始,wapp将自动使用Wasm进行交互。

相关问题