為什麼有一些Angular開發人員再也不想用它了?

數據看前端框架現狀調查,明明寫著64%的Angular用戶還向繼續用,所以滿意度很高。


更新於8月4日

這個回答是將近半個月以前寫的。這次撕逼之後直接被贊到前排也是惶恐。

這次撕逼期間我看了一個分享,標題是Angular and React——Friends learning from each other。https://pascalprecht.github.io/slides/angular2-react/

現在想想國內這次撕逼還真是諷刺啊哈哈哈哈。

多扯一句:在這次之前我去參加Js Conf還穿著ng的文化衫,想著ng用戶沒人權。在ng的演講後和演講者Ryan聊了下如何在ng中遠程非同步載入第三方公共庫的問題。Ryan很和善的告訴我願意幫我給ng團隊反饋問題。在我看來,ng團隊的人還是很nice的。當然,我不幫任何人洗地。

======原答案於7月26日=======

這個問題其實很嚴肅。

前端程序員群體可能真的是水平最參差不齊的一個程序員群體了。

他們有些人連面向對象都不知道有什麼意義,而有些人卻在做編譯器等等的事情。

Angular難,肯定難,難在不符合前端的直覺上,因為Angular很多時候不能很直觀讓人感受到框架的便利,反而還帶來許多門檻。

在angular.js流行的時候,需要理解什麼是Service和Directive就攔了許多人在門外,但是在國內仍然能火爆,全靠一點——MVVM。MVVM給你帶來的快感也足以克服這些痛苦。

但是在現在來看,MVVM能選擇的就太多了,這也是在國內vue這麼火的緣故——學了angular.js基本無門檻接受了vue的設定。

而在這個關鍵的節點,Angular 2竟然和angular.js不能良好的過度了。TypeScript和新的ngModule、Component等等這些概念再一次讓部分程序員無法接受(包括我同事)。在這種情況下他們也並不能感受到這個框架所帶來的便利。

PS:

Angular被黑也不是一天兩天了,我還是想勸勸各位,前端不是炫技能,而是用最趁手的方式去做完工作,也望諸君知悉。

第一,你們也不用無腦黑angular難用,它本身已經提供了一種很好的解決方案,這個方案是為了大規模企業級應用而設計(用官方原話就是Angular is a platform),在更大的應用上,比vue和react做到了更好維護。這一點其實就能在很多場景下具有競爭力。

第二,黑Angular效率沒有那麼高的也可以休息。從數據上看的確如此,比如你刪除1000行數據再插入1000行,但是如果遇到這種問題,這時候你應該想想是不是你業務設計出了問題,而不應該把鍋丟給框架,框架不背。

第三,@大漠窮秋 也在答案里寫了,Angular在全球範圍內使用率就是高。黑用的人少的也不用再黑了。


怎麼說呢,只能說有些人黑Angular的唯一手段就是撒謊。

他們知道自己在撒謊

我們也知道他們在撒謊

他們也知道我們知道他們在撒謊

然而

他們還是在撒謊

這種貨色,別用Angular,不想與你為伍。請把你的臟手從Angular身上拿開。


因為用Angular不只是前端的事。

Angular是個SPA整套解決方案,對於項目非前端成員來講,需要付出代價去迎合它,即便這套技術能讓產品質量有質的飛躍,也很難有團隊成員能夠忍受前端程序員的作。

以下都是去年9月以來開發一個Angular項目和一個Ionic項目吸取的血的教訓:

1.只能SPA:

官方從不推薦你使用CDN鏈接,也沒有使用非構建環境開發Angular項目的藍圖。

因此,使用Angular,你只能SPA。

不同於React和Vue的漸進式,Angular的使用你只有一條路可以走——採用工程化的方式構建一個gzip後兩百多kb依賴項的前端SPA。

這對於設計來說,以前按頁面組織的設計得跟著你改成按組件的設計,工作負擔驟然變大。

對於後端來說,如果需要進行服務端渲染以支持SEO,而Angular的服務端渲染只給出了express和.net兩種平台的方案,採用express只需要如下代碼:

import { PLATFORM_ID } from "@angular/core";
import { isPlatformBrowser, isPlatformServer } from "@angular/common";
constructor(@Inject(PLATFORM_ID) private platformId: Object) { ... }
ngOnInit() {
if (isPlatformBrowser(this.platformId)) {
// Client only code.
...
}
if (isPlatformServer(this.platformId)) {
// Server only code.
...
}
}

但是如果使用.net,則有洋洋洒洒一整頁的road map等你去填坑。

其他平台只能自己摸索了,你覺得後端程序員會喜歡你怎麼折騰么?

所以在自己node水平不夠的時候,不要貿然上Angular。

2.開發調試:

很多後端程序員由於平台本身OO,很難理解函數式的JavaScript,而Angular的請求,最佳實踐要求都是在服務里完成的,你甩一大堆Rx給後端,你叫後端怎麼辦?

我們的方案是使用Nginx反向代理,前後端一起聯合調試,費時費力。

除非你能用node,代理調試fake都你自己搞定,否則複雜度直線上升。

3.介面調用:

Angular採用類型聲明的TS,成熟的做法是將數據服務完全剝離,但是大多數情況下,前端是在後端還沒有完全確定數據結構的時候進行開發的,導致你的數據類和後端的數據類不一致,你還得新建一個適配器,有時候這就很坑爹了。

而採用Bootstrap+jQuery的方案就沒有這樣的煩惱,反正寫完一個有樣式的頁面交給後端就是了。

4.職能定位:

後端完全不管視圖和控制器?你把後端當什麼了?資料庫管理員?

對於有追求的後端來說,你這樣能讓他更安心地玩集群和機器學習,但是對某些php程序員來說,怕是最重的活都被你幹了。

5.學習曲線:

一般人的JavaScript的學習路線是:

閉包-&>redux-&>Rx

而Angular程序員的學習路線是:

Rx-&>redux-&>發現用redux完全是找事-&>用回behaviorSubject.value-&>發現Observable.scan才能完成所有redux功能-&>發現自己JavaScript水平極差-&>重新學習this綁定和V8原理-&>發現Observable胡亂訂閱,學習zone-&>發現zone封裝的事件循環-&>重新學習瀏覽器和node事件循環-&>不能理解contentCheck和ViewCheck的區別,發現得研究webkit,blink原理...

的確目前為止很多用Angular的人水平只停留在玩cli工具和使用模板語法上,但是作為一個Angular發布就一直開發到現在的探險家伊澤瑞爾,我可以很負責任地告訴你,其學習曲線陡峭到令人髮指。

而且你很多時候是在補身為前端沒有設計模式經驗的課。

6.測試:

寫不寫測試?很多人當然是不寫了,但是不寫的話程序健壯性不足還是小事,spec文件跟個狗皮膏藥一樣一直跟著你的生成文件,處女座不得急死?

寫吧?呵呵,恭喜你入了另外一個大坑...

7.庫少:

唯一現在用得舒服的庫,只有官方的material庫,其他的庫要麼是bootstrap換了馬甲,要不就和antd一樣,前期各種changed before checked,現在還沒出正式版的。

這個倒還好,因為這麼工程化的框架,你是絕對想要自己擼設計組件的,多多和設計妹子交流吧。

8.項目(最重要的):

採用Angular的方式太過於違反web開發的慣例,最重的部分全部壓到前端去了,導致組織結構和管理制度得跟著改變,而很多時候是改變不過來的(政治上的東西,呵呵)。

你一用,就會發現項目在不斷延期,谷歌官方自己的Angular官網開發了多久?Angular Material庫又開發了多久?你確定你比他們都強?

這些還都只是Angular困難度複雜度的一個縮影,但是我相信即便它缺點再多,任何一個在職業上有追求的程序員都會喜歡上這一框架的。

它匯聚了太多的設計模式,巧思和工程化思想,對於前端開發來講是一次質的飛躍。雖然在開發小型項目上來講與Vue和react相比一點優勢也沒有,但是在開發大型應用時,其開發愉悅程度是遠超React+Flow+mobx+Rxjs+Immutable以及一眾外部庫的。

Angular虐我千百遍,我待Angular如初戀,你們是沒看到我司的Java程序員看到Angular時的表情,當天晚上就接了個Angular的外包,然後各種廢寢忘食,哈哈。

Angular並沒有被放棄,只是很多人發現自己項目的體量,根本犯不著用Angular而已。


使用vue和react的時候,都經過一番折騰用typescript代替es,有同黨在嗎?


#### 前來更新打臉

其實嘛,也不算是打臉的,只是現在 TypeScript 真的太特么好用了,比 JavaScript 不知道高到哪裡去了,IDE 的支持又好,還用個什麼鬼 flow/babel,微軟大法好啊哈哈哈哈哈。

但是 TypeScript 不等於 Angular,我對 Angular 的看法基本沒變,一站式服務,要實現一點稍微複雜點的功能就要去了解一堆類、為什麼要這樣設計,比如單頁 Web 中台做多 Tab 要用到的 `RouteReuseStrategy`. 學習曲線比 Vue 陡太多了。

#### 原答案

Angular 是一個很重很強大的框架,說再也不想用它,有那麼一點吧。主要是不太喜歡 TypeScript,還是原生 JavaScript 寫得爽啊。以前 Java 寫多了,嚮往著 Javascript 的自由,有一種又被 TypeScript 和 Angular 束縛了的感覺= =

但 Angular 提供的方便和便捷,用 Vue 來實現要不就各種找插件要不就自己造輪子,對小團隊來說就是噩夢。比如 ReactiveForm,當初在 Vue 上沒找到很好的解決方案。

如果用習慣了 Angular,再讓前端們再去用 Vue 這種「山寨小作坊」的框架,肯定都是這也不行、那也不行的抱怨。但我個人還是喜歡靈活性大一點的,可控性較大的解決方案,如果是自己的項目,肯定是不會選 Angular 的,但對於一些小團隊的項目(非大廠),Angular 優勢還是挺明顯的,簡單無腦,用個 angular-cli,我猜大部分項目都不會 eject 吧?


因為不懂。

很少是理解了,懂的了設計理念之後再拋棄angular的 ,大部分都是根本不明白為什麼要抽象出service。


Angular == Vue + TypeScript + axios + Vue-router + mocha + Vue-i18n + vue-cli + ... + 健全的文檔 + 健全的中文文檔

這麼貼心的框架去哪裡找?只有 Ember.js 能與之媲美了。

大部分前端還處在不知框架為何物的階段,不怪你們,等過幾年你們就知道了,Vue 和 React 目前還沒有形成成熟的框架,還處在摸索階段。

Angular 雖然是個框架,但是它的方案沒有被廣泛認可。但是一旦你認可了 Angular,肯定就瞧不上 Vue 和 React 這種層面的工具了。

反之,一旦你不認可 Angular 了(可能一開始你認可,後來發現理解不了),那當然就不會再用了。

有經驗程序員用框架可不會猶猶豫豫的,用就用,不用就不用。

所以才需要佈道者呀。


一半以上,不要那麼危言聳聽好不好,我不是angular的痴迷粉絲,但是用過它之後,深切覺得它太強大好使了,至少現在做的一個應用,不到一個月就完成了具體功能;之前用過Extjs三年,jQuery兩年,開發周期與angular比不可同日而語;就現在我了解的周圍前端開發來說,大部分都還是很喜歡用angular的,還極力推薦;真的很少看到說用過angular的以後都不想再用了的,但也不排除沒有這種,那就是自身不適應罷了......


請繼續黑,不中度使用就逼逼的一大把。

Angular 定位是一個框架,基本算是一個較完整的解決方案。至於我喜歡的 React 定位是一個庫,是不一樣的。

上手來講,有一定曲線,學過後端的可能知道,學一個框架哪有分分鐘的事情,比如 Spring MVC。

使用體驗大家可能更多說的是升級,我們也有時候會升級,也沒遇到什麼特別大的問題,當然你在不成熟版本引入造成較大問題,大項目我覺得這麼干只能說同事沒說你就不錯了。小項目試水是培養團隊比較簡單的做法,成本來說我認為沒某些人說的恐怖。話說升級要改代碼的情況所有代碼都有,React 在這裡還算問題,就14, 15比較跨,Angular 4之後還算好,現在也穩定了。

下面來說TS,我只能說寫了他無論什麼型號項目我都會用,有一定保障寫代碼想不出哪點不好。

說生態,ionic 應該是加分項,吐槽的肯定有,但是找個目前其他更好方案來再說。

說Rx,這玩意不用你就轉 promise ,用的好後應該比較棒,多學點東西才有競爭力,不是所有人的親爹都是首富,而且一般項目也用不到幾個操作符。

後端這邊https://docs.nestjs.com/ 出了個這個,有點.net風格,基本無縫切入吧,順便就深入網站端了,注意,不是全棧,應該會有人懂這句。你就可以外包一套帶走,加上 angular cli給你搭環境。

本來就是愛好問題,說什麼少,全球份額不少好不,就像有人在說我喜歡 React 又喜歡 Angular感覺怪怪的,其實一個自由一個嚴謹生產力,不挺好么,而且還能接受一點後端模式,不也更好?


這種調查本身就是片面的,而調查的網站本身受眾面不同,得到的結果並不具有廣泛性,看看就好不用當真,ng不管別人有沒有用過又用出了什麼花樣,誰都說上手難性能差,於是先嚇退了一大群人,所以vue和react也就在這個時候被廣泛追捧。ng2引入TS 上手難度又上了一個台階,對於絕大多數都是野生的前端程序員來說無疑就是噩夢。所以這個調查不具有參考性,用的人的數量也無法代表什麼框架好什麼框架不好。


各類框架只是停留在熟練使用的階段。

NG被黑也不是一天兩天了,各個框架之間的學習成本大小,模式理念的不同。都會觸動使用者的認同或抵觸。

關於框架良性看待,根據不同的業務場景合理選擇。框架沒有最好的,僅僅只有最合適的。

看看jquery都被黑的一無是處了,但做輕量級或DOM操作複雜的應用jquery還是最方便的。雖然它僅僅是個類庫。

雖然如此,還是存在不可迴避的問題。NG最大的敗筆應該是1-2不兼容,大版本更新過於急躁,雖然很有遠見。然而第一波浪往往干在了沙灘上。

但不得不說,NG做管理系統還是蠻方便的。


對於前端來說,大企業內部 SPA 是必要之惡;更多好玩的東西是做交互的部分。 React 和 Vue 做交互組件比 angular 和 dom 方便;angular 做交互組件雖然比 dom 方便但是要寫的多


給你一套完整且優秀的技術方案,附贈完善的文檔,又替你把原有開發效率低的語言優化了。如此盡心儘力,然而並沒有多少人用。

這並不僅僅是 ng 的問題,我實際說的是 .net,而且.net 還有藍星第一IDE加成。

大家雖然都是搞技術的,然而很多問題並不是單純的技術問題,這就是學術與工程的區別。前者總是能假設一個理想的條件,後者不得不去考慮各種艹蛋的情況。

舉個例子 : ng 學習曲線高,有人反駁說,這是你工作的團隊太差,趕緊換個地方。然而實際上,假如你僅僅是個開發,當然可以拍拍屁股走人,可是假如你是一個leader呢?一個 leader 本來就需要在現有的條件下發揮團隊最大的效率,你不可能指望你的團隊各個都是大神,於是不得不選擇一個偏保守的方案。


說實話,angularjs確實很多人不想用angular的。遷移成本這麼高,又完全不同,誰敢說想用


真的是不想用了 屁大點功能寫出java的感覺了 ……。


不要將你的想當然強加到別人身上。我觀在都不知有多喜歡TS和angular,ts和js可以混合用,所有JS庫在ts下都可用。angular也挻好玩的。


分頁阅读: 1 2