为什么用 Angular 的比用 Vue/React 的少那么多? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
JounQin
V2EX    Angular

为什么用 Angular 的比用 Vue/React 的少那么多?

  •  1
     
  •   JounQin 2020-01-02 00:01:17 +08:00 3752 次点击
    这是一个创建于 2176 天前的主题,其中的信息可能已经有所发展或是发生改变。

    相关知乎问题


    丑话说在前头,如果有错误,欢迎斧正,不要玻璃心。


    说实话虽然在灵雀云用 Angular 做着企业级的应用,但我个人是很不认可它大而全的哲学的,虽然我也在 Angular 相关专栏发过几篇水文,但是习惯了 ReactVue 『纯粹』框架的哲学后依旧很不喜欢(不喜勿喷),但我很感谢 Angular 带我入了 rxjs 的坑,仅此而已。

    Angular 的模块系统和 bundler 都是自己搞得一套标准『黑盒』,也就是说没办法在各个框架直接平滑地切换,比如 http 请求库,其他框架都可以随便选,一般比较通用的是 axios,还有 axios-observable 支持 Observable API,但 Angular 为了更好地支持自己的 DI 又搞了一个 @angular/common/http ,其实大可以把 DI 部分抽成一个库嘛(以前是单独抽了一个 DI 包的,后面又被合到 core 里了),这样所有框架都能使用你这个 DI 系统,岂不美哉?ts 打包非要整出一个 ngfactory 的概念,连基本的库打包都要有个专门的 ng-packagr,真心受不了,学会 rollup/webpack 已经很不容易了,换个前端框架还要学这个???还有各种 NgModule 的报错信息实在不忍直视,用了 @angular/router 后它还直接给我退出到上一个无报错的页面了,也就是调试的时候我还得再点一次保存页面的入口,如果还有错,还得继续来?!

    说到这里实在不得不再吐槽 Angularhmr(hot module reload) 的支持简直弱爆了,甚至可以说是『垃圾』,(我的个人体验来说 Vuehmr 支持是最好的),开发个新功能页面不停地 reload, reload, reload... 我已经放弃挣扎了。

    有人会说这些 @angular/cli 都帮你解决了啊,这还是刚刚『黑盒』的问题,这也是我自己写项目都是不用什么所谓的 cli 的,而 @angular/cli 里我只用会用两个命令:ng serveng build,而且是在用 @alauda/custom-webpack 的前提下,因为:我压根儿不需要默认的那套打包配置,对我们的生产力反而是阻碍。为什么 Angular 不能往和其他框架一样纯框架的方向走呢?那些什么 ng lint/test 之类的命令真是醉了,这不是脱裤子放屁吗?自己加个 lint/test 脚本的事儿我为什么要去单独学啊?非得在angular.json 里配置?说到 angular.json 就更可笑了,连 js 格式都不支持?每个公司不同项目都要 copy/paste 吗?这也是为什么我在灵雀云搞了 @alauda/custom-webpack 的原因,因为自定义 webpack 配置在公司内部项目里也是通用的啊。

    我们再来看一个 css 打包的问题,Angular 的方案是把 css 文件内容处理完转化成字符串,然后运行时由 @angular/core 进行插入,这有什么问题?问题大了,比如 A/B 组件都在 styleUrls 里引用了 common.css 那么最终它会把 common inline 到 AB 上,也就是 css 内容是重复的,什么 vue-style-loader 它不香吗?明明是 bundler 该做的事情为什么要跑到框架层去做???

    还有之前吹 JITAOT 优化的事儿,你看 vue 吹过吗?vue/vue-loader 一直都是原生支持所谓的『AOT』的,到了 Angular 这儿就变成了大优化了,而且所有相关库和 App 都要做一些必要的修改才能支持 AOT,而且这个 AOT 呢还有各种乱七八糟的限制,一不小心就是 build error 说什么哪里哪里不支持箭头函数、哪里哪里得把变量导出去,可这些 JIT 的时候明明都是好好的。对了,JITAOT 的变更检测次数还是策略好像还不太一样,上次 ngChina 的时候有嘉宾演示了一下,这真不是劝退吗?

    再来,Angular 的维护者们似乎都喜欢自己玩儿自己的,连 i18n 方案它都帮你内置了,当然我肯定是不用的,因为和其他框架的使用方式差异太大,实在诡异。我们之前是用的 @ngrx/translste ,今年我『二进宫』回来就把这部分精简重写了,只保留并定制我们自己需要的东西。也就是说官方内置的方案它不一定是最好的或者说是对所有人都适用的。

    最后呢,再说说几个框架对 SSR 的支持,Vue 是有官方指导的,React 提供了基础能力,但是具体怎么玩儿全凭社区,Angular我感觉是对这一块儿不上心的,好像到现在都只有 express 相关的指导,不过毕竟目标是『企业级应用』嘛,基本是不需要考虑 SEO 问题。那既然 Angular 是更面向企业级应用的,那么个人应用就没必要选它了嘛。那既然我个人应用都没有用过 Angular 我怎么敢在公司项目里去用呢?(此处手动狗头)

    所以像 ReactVue 这种的轻量级框架才会更流行,因为它们才代表了自由,而我和很多人一样不喜欢被束缚,更何况只是一个前端框架,所以我的个人项目是绝不会考虑用 Angular 的。而公司的项目,当初选择 Angular 的大哥已经后悔并离职去写 React 了,而现在的我们这些接盘侠还将继续使用,毕竟历史包袱尾大不掉。但我仍然要感谢 Angular 带我走入 Observable 的世界,正如 @徐飞 所说,我相信 React/Vue 社区经过 hooks 的洗礼也可能会拥抱天然组合的 Observable


    写着写着好像变成了抨击 Angular 的文章,但其实不是,萝卜青菜各有所爱,有人喜欢框架的约束,让不太会写代码的人也能写出不那么差的代码,而我个人喜欢自由的代码,这样才能显示出我的架构能力不是?(继续狗头)


    本文首发于 知乎专栏 - 1stG 全栈之路

    19 条回复    2021-04-19 19:56:06 +08:00
    precisi0nux
        1
    precisi0nux  
       2020-01-02 07:02:37 +08:00 via iPhone
    有理有据。
    Mithril
        2
    Mithril  
       2020-01-02 07:46:26 +08:00   2
    自由的前提是每个人都有足够的能力和水平完成各部分组件的技术选型,调查,填坑和维护。如果你们组绝大部分人都不是前端开发专家,那么 Angular 可以让你的项目至少能活的更久一点。
    Vue 或者 React 确实自由,但除非你能把关好每一个招聘,Review 每一行代码,不然有可能在各种地方埋下潜在的炸弹。
    而 Angular 就是你找个后端开发,照着官方文档走一遍,那么大部分的功能组件的最佳实践就都知道是什么样了。随着项目进展逐渐能上手熟练的话,自己再抱怨发挥或者换 vue react 也可以。
    特别是当一个项目会开发好多年,功能非常复杂而且有大量人员参与的时候,能不能换 http 库真的不算什么大不了的。你随便搞一堆的库进来,公司法务早晚会炸掉。
    总的来说技术选型不能只考虑技术本身,自己公司的情况,未来的发展方向都得考虑进去才行。个人项目当然无所谓了,毕竟 Vue 简单好用。
    murmur
        3
    murmur  
       2020-01-02 07:55:54 +08:00   2
    如果说 ts+框架的严格要求就能开发出优美的代码
    那 java 和 c#的项目就是天下第一好维护的项目
    实际上不是
    java 和 c#的项目一样一堆屎坑
    所以框架和语法不能解决一切,该 review 还得 review,不能光凭 ts 就说 angular 比 vue 和 react 好维护
    JounQin
        4
    JounQin  
    OP
       2020-01-02 12:14:58 +08:00
    @Mithril 所以 Angular 受后端开发欢迎,前端开发不待见,也很容易理解嘛。

    『随着项目进展逐渐能上手熟练的话,自己再抱怨发挥或者换 vue react 也可以。』

    至于这一句不太认可了,像我们现在即使所有人都想换掉 Angular 都是不可能的,因为公司没有时间给你换框架从头再来,而 Angular 又是大而全不像 React/Vue 那么可以渐进式替换的。
    JounQin
        5
    JounQin  
    OP
       2020-01-02 12:16:12 +08:00
    @murmur 没错的,我看我们公司现有的 Angular 新项目的代码都能挑出一堆毛病,开发的重点是人,而不是框架。
    Necfol
        6
    Necfol  
       2020-01-02 13:42:18 +08:00
    给三大框架都精通的大佬跪了
    JounQin
        7
    JounQin  
    OP
       2020-01-02 13:43:51 +08:00
    @Necfol 请叫我 API boy,谢谢。
    hantsy
        8
    hantsy  
       2020-01-21 10:51:08 +08:00
    对于熟悉后端开发的人来讲,特别是 Spring 的人,Angular 上手太容易,就这么简单。
    JounQin
        9
    JounQin  
    OP
       2020-01-22 16:59:52 +08:00 via iPhone
    @hantsy 所以它注定只能吸引你说的那些后端开发,真的前端并不感冒,就这么简单粗暴。
    Hanggi
        10
    Hanggi  
       2020-02-12 12:42:50 +08:00   1
    感觉楼主说的这些都没有说到点上,都是楼主自己的问题。
    就比如 ng test 是不是脱裤子放屁,可能是,但是你打一下 ng test --help 你就会发现它不只是一个脚本的别名。

    其他的问题也都差不多,都是围绕“约定优于配置”。
    不管你的语言、框架有多么自由,到最后还是要制定一套规则、一套约定,可能是你个人的规则,也有可能是公司的规则。框架越自由,就会产生越多不同的规则。
    看看 React 的相关发展史就会发现出现了各种稀奇古怪的东西去补充它。现在刚接触 React 的人也很懵逼,Redux 是什么? MobX 是什么? Next 是什么?为什么你们公司的代码跟我们之前的代码完全不一样?用的是 React 吗?

    相比 Angular,虽然也有很多改变但是整体思想和兼容性并没有太大改变,要知道最近一本版本里 Angular 把他们的编译器都换了。

    感觉 Angular 的关键问题还是在推 2.X 初期那几波激进操作劝退了一大群人。这里感觉同一知乎的另一个回答更切中重点。
    [知乎相关回答]( https://www.zhihu.com/question/355760849/answer/938934606)

    楼主一直在说萝卜青菜各有所爱,但是这几点感觉真的算不上是多大的问题,只是楼主个人的体验问题。
    而且,React 用的人多是真的,但是 Vue 只是在国内用的人多,国外很多网站和公司都有在用 Angular,并不少。
    JounQin
        11
    JounQin  
    OP
       2020-02-14 00:52:38 +08:00
    @Hanggi 对的,全是使用的人自己的问题,所以使用的人就不用了呗。(手动滑稽)
    Hanggi
        12
    Hanggi  
       2020-02-26 13:38:18 +08:00
    @JounQin 所以不要说的理所当然的,而且 Vue 用的人也并没有很多,也就国内稍微有点。
    数据说话:
    https://www.npmtrends.com/@angular/core-vs-angular-vs-react-vs-vue
    https://npm-stat.com/charts.html?package=react&package=vue&package=%40angular%2Fcore&package=angular&from=2019-02-25&to=2020-02-25

    angular 对应 1.x 版本,@angular/core 对应 2.x 以后的版本。
    JounQin
        13
    JounQin  
    OP
       2020-02-27 09:40:19 +08:00 via iPhone
    @Hanggi 揣着明白装糊涂。
    https://www.zhihu.com/question/269980000/answer/353440859
    Angular 你用 CDN ?(手动狗头
    JounQin
        14
    JounQin  
    OP
       2020-02-27 09:43:52 +08:00 via iPhone
    ddup
        15
    ddup  
       2020-04-23 17:21:55 +08:00
    @murmur #3 ts 只是语言,angular 是框架,良好的框架能够较大程度上框住代码在规定的范围内,较大程度避免出现天马行空的代码。
    rf99wSiT6IxH1Z23
        16
    rf99wSiT6IxH1Z23  
       2020-08-12 10:45:11 +08:00
    之前 angular,现在 react 了( angular 有人死磕过源码吗?)
    rf99wSiT6IxH1Z23
        17
    rf99wSiT6IxH1Z23  
       2020-08-12 10:45:49 +08:00
    angular 国内尴尬,跟 vue 的状态是 gu 国内外刚好相反
    erwin985211
        18
    erwin985211  
       2020-11-26 16:13:54 +08:00
    接手 angular 项目,已经考虑离职了。真的想死
    DDMAnthony
        19
    DDMAnthony  
       2021-04-19 19:56:06 +08:00 via Android
    @erwin985211 那么现在离职了吗
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1047 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 29ms UTC 23:10 PVG 07:10 LAX 15:10 JFK 18:10
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86