為什麼有一些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也挻好玩的。