Blazor全栈是个陷阱
前言
大家好,我是曦远~
最近有个项目急着上线
大概就是接受一堆客户端连接上报数据,然后在界面上展示数据和简单的控制
这种场景感觉 Blazor 还挺合适的,折腾之心蠢蠢欲动
于是掏出了 Blazor 开搞
现在 .NET9 的 Blazor 已经进化了,像 Next.js 那样可以把 server 和 client 放在同一个项目里跑,不过还是差了点,WebAssembly 的 client 必须单独一个 project
也很好理解,WebAssembly 毕竟是一个单独的程序集,要分发到浏览器端运行的
不过搞了半天,我后面还是放弃了
在意识到浪费了太多时间之前,我及时跳坑了
PS: 文章只是个人观点,仅代表作者自己的看法,不喜勿喷
原因
原因有几个方面
生态问题
Blazor 的组件库有点缺乏,我倾向于使用 Tailwind CSS 组件库,这点要给 Flowbite 点个赞,不仅提供了支持,还开了个官方的 Flowbite-Blazor 项目,不过还处在早期开发状态;还有一个 LumexUI,虽然 star 不多,但组件方面已经挺完善的了,可堪一用。
这么一看,生态似乎还好,反正都是用 Tailwind CSS,缺少的组件我自己封装就完事了,还可以搭配 JSInterop 实现交互。
如果在几年前,确实是这样的。
但是,「大人,时代变了」,我之前也很多次说到了,现在是 AI 时代了,什么是 AI 时代?就是要尽可能利用好 AI 去做一些重复性的、不重要的工作。
在我看来封装常用组件,做简单的页面布局,这些工作完全可以交给 AI 生成,之后再自己改一改,这样才能提高效率。
也正是因为生态问题,AI 对 Blazor 的支持比较有限,比起前端技术栈,AI 体验相差较多。
稳定性问题
这里不是说框架的稳定性
是文档、API的稳定性
Blazor 还在发展中,很多功能和写法变化太快,就像 Auth 一样,变来变去的,现在让 AI 生成还可以拿几个大版本之前的写法来糊弄我,这不是坑我吗
之前大家总说前端更新得太快,学不动了
但前端变来变去,还是那些东西,无非就是 JavaScript 和 CSS
但前端变来变去,还是那些东西,无非就是 JavaScript 和 CSS。
React 这样的框架,JSX 完全就是在写 JavaScript。
Tailwind CSS 归根到底还是 CSS。
而 Blazor 就不一样了 —— 它的生态和写法会直接跟着 .NET 版本走,每次 .NET 发大版本,API 改动幅度不小。
于是可能经常会遇到「文档和示例用的是旧写法」「AI 生成的代码直接跑不通」「StackOverflow 上的答案全是过时的」。这种不确定性会导致开发效率大打折扣。
全栈的错觉
Blazor 最大的卖点就是「全栈」,可以前后端都写 C#,不用管 JS,不用折腾 Node,不用 npm/yarn/pnpm,不用面对一大堆前端工程化配置,看起来很美好。
但这其实是个陷阱。
因为你终究还是要面对前端世界。
- 你要做炫酷交互,最后绕不开 JavaScript;
- 你想接入成熟的前端库(比如图表、富文本编辑器),要么等社区封装,要么自己写 JSInterop;
- 你要优化构建、部署、SEO、SSR,Blazor 的那套体系就没法和 Next.js、Nuxt 这种前端框架相比。
换句话说,Blazor 的「全栈」更像是「把前端尽量弱化」,但不是「完全替代前端」。这就像是「你以为不用学 JS 了,其实你只是不知道你哪天会被微软教做人」。
学习成本与团队问题
还有一个现实点的因素:团队。
前端工程师基本都熟悉 React/Vue/Svelte 这一类技术栈,而 Blazor 在前端圈几乎是小透明。要是做个人项目,折腾折腾还行;但要是做团队协作,Blazor 直接劝退大部分前端。
而且 AI 在 React/Vue 这类主流框架上已经能给到非常成熟的支持,从代码生成、Bug 定位到最佳实践提示,几乎就是「你的副驾」。但在 Blazor 上,AI 的帮助有限,很多时候还会给你错的答案。
这就意味着,Blazor 看起来能统一语言,实际上却可能把你锁死在一个「别人帮不上忙」的生态里。
性能与部署
再说个我遇到的小坑:WebAssembly。
Blazor WebAssembly 本质上是把 .NET runtime 搬进浏览器跑,再加载程序集。第一次加载的时候,体积往往是几十 MB 起步。虽然现在有 AOT 和压缩,但体验还是不如主流前端框架。
Blazor Server 模式虽然轻量,但是需要长连接(SignalR),一旦并发量上去,服务器压力会非常大。等用到生产环境,就会发现「小 demo 可以,真要跑业务就得掂量掂量」。
不过 Server 模式在我这次的项目里非常合适,这种项目用的人不多,不会有太大的服务器压力,Blazor 提供的数据交互和长连接优势还是很明显的,可惜没能驾驭哈哈哈
小结
Blazor 并不是一个坏框架,它在某些场景下确实很合适,比如:
- 内部工具 / 管理后台;
- 小团队 / 个人项目;
- 对 .NET 技术栈高度依赖的公司。
但是,如果你想用「Blazor 全栈」去替代主流前端栈,甚至幻想着「一个人写 C# 就能搞定所有 Web 项目」,那大概率会掉坑里。
它解决了一部分问题,但引入了更多潜在的坑。
全栈不是陷阱,「Blazor 全栈」才是陷阱。
所以我的建议是:如果喜欢 C#,用 Blazor 做一些小工具是挺爽的。但如果要做严肃的生产项目,尤其是需要长期维护、团队协作、快速迭代的项目,还是乖乖用 React / Vue / Angular 吧,别和自己过不去。
不过 Blazor 的潜力我还是很看好的,或许有一天,Blazor 全栈能和 Next.js 一样能打
Blazor全栈是个陷阱的更多相关文章
- 来自后端的逆袭 blazor简介 全栈的福音
背景 什么是SPA 什么是MPA MPA (Multi-page Application) 多页面应用指的就是最传统的 HTML 网页设计,早期的网站都是这样的设计,所之称为「网页设计」.使用 MPA ...
- [转]来自后端的逆袭 blazor简介 全栈的福音
背景 什么是SPA 什么是MPA MPA (Multi-page Application) 多页面应用指的就是最传统的 HTML 网页设计,早期的网站都是这样的设计,所之称为「网页设计」.使用 MPA ...
- 通往全栈工程师的捷径 —— react
腾讯Bugly特约作者: 左明 首先,我们来看看 React 在世界范围的热度趋势,下图是关键词“房价”和 “React” 在 Google Trends 上的搜索量对比,蓝色的是 React,红色的 ...
- duang~免费的学习视频来啦:学霸君之全栈测试
学霸君向童鞋们推荐一款 同名学霸学习 视频教程 重点是完全免费收看学习噢!!! 今天 学霸君推荐腾讯课堂的学霸君之全栈测试 复制下方链接至腾讯课堂中报名学习 https://ke.qq.com/cou ...
- .NET全栈开发工程师学习路径
PS:最近一直反复地看博客园以前发布的一条.NET全栈开发工程师的招聘启事,觉得这是我看过最有创意也最朴实的一个招聘启事,更为重要的是它更像是一个技术提纲,能够指引我们的学习和提升,现在转载过来与各位 ...
- 《web全栈工程师的自我修养》读书笔记
有幸读了yuguo<web全栈工程师的自我修养>,颇有收获,故在此对读到的内容加以整理,方便指导,同时再回顾一遍书中的内容. 概览 整本书叙述的是作者的成长经历,通过经验的分享,给新人或者 ...
- Python全栈【Socket网络编程】
Python全栈[socket网络编程] 本章内容: Socket 基于TCP的套接字 基于UDP的套接字 TCP粘包 SocketServer 模块(ThreadingTCPServer源码剖析) ...
- Python全栈【异常处理】
Python全栈[异常处理] 本节内容: 1.异常处理 2.什么时候用异常处理 异常处理 1.异常处理: 异常就是程序运行时发生错误的信号,异常处理是在编程过程中为了增加友好性,在程序出现bug时一般 ...
- Python全栈开发【面向对象进阶】
Python全栈开发[面向对象进阶] 本节内容: isinstance(obj,cls)和issubclass(sub,super) 反射 __setattr__,__delattr__,__geta ...
- Python全栈开发【面向对象】
Python全栈开发[面向对象] 本节内容: 三大编程范式 面向对象设计与面向对象编程 类和对象 静态属性.类方法.静态方法 类组合 继承 多态 封装 三大编程范式 三大编程范式: 1.面向过程编程 ...
随机推荐
- GPRS DTU
GPRS DTU ZLAN8305/ZLAN8305L是上海卓岚新推出的一款高性价比的串口232/485转GPRS DTU.这款的核心亮点是支持M级别的数据暂时存储 高性价比 支持MQTT 支持全网通 ...
- Luogu P9588 队列 题解
P9588 队列 考虑转化问题,将原问题转化为一个长度为 \(q\) 的序列.序列中 \(x\) 表示一段 \(1\sim x\) 的区间. 操作 \(1\) 每次增加时,输入 \(x\),在数组末尾 ...
- 前端开发系列089-Node篇之os
一.OS模块介绍 Node中的OS模块提供了和当前系统相关的一系列实用方法.在代码中可以直接用os = require("os")的方式来引入.OS模块本身非常的简单,本文将简单对 ...
- AtCoder Beginner Contest 184 ABCDE 题解
A - Determinant 签到. B - Quizzes 签到. C - Super Ryuma 贪心,同时分情况讨论: 1.本身就在范围里面,就1次(特判起始点和终点重合). 2.在两步范围内 ...
- 渐入佳境--从零开始建设k8s监控之pushgateway(四)
前言 书接上文,prometheus默认是采取pull的方式获取数据,但是有些情况我们依然希望能够主动推数据给prometheus pushgateway就像是一个提供监控数据的静态节点,promet ...
- Java 中的 ==
简介 如果没有重写 equals 方法, 相当于 == 比较, 即比较两个对象的地址是否相等. 如果是基本数据类型, 直接对值进行比较. code /** * Created by lee on 20 ...
- "firmwarepasswd": MacOS Firmware Password Management: CHECK and DELETE Macbook Pro Firmware Password from the command line.
Abaels-MacBook-Pro:~ abaelhe$ su Password: bash-3.2# firmwarepasswd -check Password Enabled: Yes bas ...
- Zulip: Debugging Zulip-Mobile: Server + Android + IOS
https://github.com/abaelhe/zulip https://github.com/abaelhe/zulip-mobile Debugging Seeing what the a ...
- prometheus学习笔记(2)-利用java client写入数据
继续学习prometheus,上一节演示了用http方式使用curl向pushgateway发送数据,本节将研究如何利用client jar包,以java代码的方式写入数据. 一.依赖的jar包 1 ...
- JAVA基础-9-三元运算符--九五小庞
public class Demo5 { public static void main(String[] args) { int a=10; int b=20; a+=b; System.out.p ...