Blazor是微软推出的用C#编写前端的Web框架,通过Blazor Server或Blazor WebAssembly两种运行时模型在浏览器中直接运行.NET代码,支持Razor组件、前后端共享模型与调试,但需深入理解SignalR、WASM内存、JS互操作等底层机制。
Blazor 是微软推出的、用 C# 写前端的 Web 框架,不是“又一个 JS 框架”,而是绕开 JavaScript 直接在浏览器里跑 .NET 代码的技术。它能让你用 Razor 语法写组件,用 C# 处理逻辑,前后端共享模型、验证规则、DTO,甚至调试器直接进浏览器里的 C# 方法——这点 Vue/React 做不到。
选错托管模型,项目后期会卡在部署、延迟或离线能力上:
Blazor Server:UI 渲染全在服务器,靠 SignalR 推 DOM diff 到浏览器。首次加载快(Blazor WebAssembly:.NET 运行时编译成 WebAssembly,整个 App 下载到浏览器本地执行。首次加载慢(约 300–500KB 启动包),但完全离线可用,可打包为 PWA,也更容易部署到 CDN。NavigationManager、JSRuntime 调用方式、状态管理策略都不同;HttpClient 默认行为也得重配(比如 WASM 下不能用服务端 Cookie 认证)。Vue 的 v-model 和 Blazor 的 @bind-Value 看似一样,但背后差异很大:
:rules="[{ required: true }]" 是 JS 对象,类型靠文档或 TS 类型定义补全;Blazor 中 [Required] 是 C# 特性,校验逻辑直接嵌在实体类里,EditForm 组件自动读取并触发 UI 反馈。props 需手动定义类型(prop: { type: String, required: true }),Blazor 的组件参数是 C# 属性:[Parameter] public string Title { get; set; },IDE 直接报错未赋值、类型不匹配。ref 或 defineComponent 返回对象,TS 提示依赖 JSDoc 或 defineComponent 包装;Blazor 中 @ref 绑定的是强类型实例,InputText 的 CurrentValue 就是 string,点出来就是方法和事件。调用第三方 JS 库(如 Chart.js、Mapbox)不可避免,但 Blazor 的 JS 互操作不是“加个 script 标签就完事”:
IJSRuntime.InvokeAsync 是异步的,不能像 Vue 的 onMounted 里直接 new Chart();必须等 OnAfterRender 或用 StateHasChanged() 手动触发重绘。window 上(如 window.initChart = (id) => {...}),否则 InvokeAsync 找不到入口。JSON.parse;而 Vue/React 本就是 JS 生态,对象传递天然无缝。DotNet.invokeMethodAsync,且目标方法必须是 static、带 
[JSInvokable] 特性——这比 Vue 的 $emit 或 React 的回调 props 重得多。Blazor 的真实门槛不在“会不会写 C#”,而在理解它如何与浏览器底层协作:SignalR 连接生命周期、WASM 内存模型、JS interop 的异步边界、以及调试时 Chrome DevTools 里看到的不是源码而是 WebAssembly 字节码。这些细节 Vue/React 开发者通常不用碰,但在 Blazor 里,漏掉一个 await 或错配一个托管模型,就会出现“页面不动”“状态丢失”“内存暴涨”这类难复现的问题。