Angular2是可怕的

banq發表於2016-12-02
我們使用Angular 2作為我們的前端, 而我並沒有參與這個決定,我是相對較晚才到這個專案工作。 這篇文章並不是對框架的全面評審,而是在使用了兩個多星期後的一系列觀察結果。 我不認為使用它了兩個星期會讓我成為專家,並歡迎任何更正,但對於它的價值, 我認為使用Angular 2是我們專案最大的錯誤之一 。

搖搖欲墜的基礎
Angular 2穩定版是建立在實驗語言特性(TypeScript decorators)和Rx.js 5.0測試庫之上。讓我重申一下:框架聲稱比其依賴和它所基於的語言更加穩定。這絕對是瘋狂 。 當Angular2的核心依賴性沒有落地成熟時,它不應該聲稱自身很穩定。在其上構建應用程式就像在一副牌上建造一樣脆弱。如果TypeScript decorators提議的語義改變了,或者更糟糕的是,從語言中完全撤消了會發生什麼?

這裡沒有發明
Angular 2是這個術語最真實意義上的一個框架。 它使用自己的模組載入系統(因為JavaScript沒有足夠的這些系統,對嗎?),嘗試抽象整個瀏覽器平臺,甚至載入了一個完整的HTML解析器和防毒程式。 它甚至說自己的語言 -結構化指令,管道,宣告,模組,注入器,服務,檢視封裝,裝飾器。

這給框架學習增加了一個很大的難度曲線。甚至對熟悉現有瀏覽器API和Reactive框架的人員來說,需要重新學習Angular是如何實現的。比如管道,幾乎完全不像UNIX管道,或傳統的模板語言的過濾器。 又如:Angular的HTTP客戶端返回Observable,而不是Promise,迫使你不僅要學習另一種非同步庫,但是是一個完全不同的非同步模式 。

這是尤其惡劣的,因為儘管文件的宣告,在用於Ajax請求時,Observables提供了沒有比Promises有明顯的改進。

許多Rx.js方法實際上適合流資料,但是對於單值請求來說太過度設計。

一個Ajax請求是單次的,使用執行類似方法Observable.prototype.map時候會永遠只能在管道中得到一個值,顯然這是沒有語義意義的。Promises另一方面表示一個尚未完成的值,這正是HTTP請求給出的。我花了幾個小時迫使Observable行為轉換回一個Promise,只是極簡單地使用Promise.all ,它的效果要比Rx.js好得多。

過早抽象
Angular喜歡假裝它是一個平臺無關的平臺。

它透過抽象出瀏覽器API來實現這一點 - Angular使用自己的HTML怪異變體來替換DOM,使用自己的路由和location服務替代瀏覽器歷史和本地location API,自己的HTTP客戶端替代XHR和websocket。 不幸的是,這些都是現代應用可能需要的API一個可笑的小子集。 任何時候你只需要LocalStorage, geolocation,notifications一樣簡單,否則很容易破壞應用跨平臺相容。

更重要的是,在許多情況下,這種抽象是完全不必要的。 一些Angular平臺API只是圍繞瀏覽器API進行薄薄的包裝,除非使它更難使用,否則並不提供有用的抽象。location和HTTP客戶端服務是兩個很好的例子。

你在Angular學習的知識並不能再在其他地方重複使用。比如學習Angular的HTTP客戶端,這個知識在Angular宇宙之外是無用的。

HTML減號
Angular聲稱是HTML Plus - 也就是是HTML,但更好。 但這是錯誤的。

首先,Angular HTML 不是 HTML。 HTML屬性不區分大小寫,而Angular是。 這可能看起來像一個小的不一致,但它意味著任何基於HTML建立工具不能支援Angular的版本。 WebStorm的程式碼自動完成,例如,建議ngif代替ngIf 這兩者是等價在HTML中,但在Angular HTML中不是。

其次,ANgular HTML語法設計不當,遠遠要複雜得多,而且充滿了小陷阱坑-只要看看模板語法參考上的紅色警告框數量 。 這裡有一些事情指南里沒有提到.

(這裡省略有關Html的問題說明..)


不必要的粗俗
元件是大多數現代JavaScript應用程式的基本構建塊。在前端開發中發生的最好的事情之一是:Web應用程式應該被組織成獨立的、可重用的元件。理想情況下,這意味著元件應易於建立。而Angular是完全相反的。

要在Angular中建立一個元件,你必須為JS,CSS和HTML建立單獨的檔案。 根據設定,JavaScript可能需要根據TypeScript和來自SCSS或LESS的CSS進行編譯,因此一個元件需要五個檔案。 有了這麼多檔案,您需要為每個元件準備單獨的資料夾。 元件本身是@Component裝飾,宣告元件後設資料,如樣式,模板和選擇器,使得元件可以在其他地方重複使用。然後透過建構函式注入元件依賴項,並記住宣告元件生命週期介面。 最後,你需要在應用程式的模組檔案中宣告元件。只是為了建立一個單一的元件這是一個很大的工作量。

單個檔案元件也可以使用Angular,但是你需要在TypeScript本身中宣告標記和樣式,並且(據我所知)與我們需要管理CSS變數的前處理器(如SCSS)不相容。與Vue的單個檔案元件進行比較。 對於Vue,標記,樣式和邏輯在單個檔案中宣告。 元件表示為簡單物件。只有很少的儀式,使其很容易建立新的元件。

差異是否顯著? 我會說是的。我們的Angular應用程式有21個元件,而我們的Vue應用程式有30多個,但是後者明顯不太複雜。 Vue元件小而瘦,而Angular元件不可控制地增長,因為與將單個元件提取成單獨的元件相比,將更多的東西堆積到單個元件中會更容易。

效能差和膨脹
這可能是由於我們的特定設定,但Angular 2感覺特別沉重。基於Vue的應用程式我構建的分配三個重建構建過程,在開發過程中的眨眼之間完成 - 當我切換工作區到我的瀏覽器,經常性此時頁面已經重新載入和呈現。 我們的Angular 2應用程式在不同,會花費幾秒鐘重建和渲染。 這聽起來可能很小,但請記住,任何改變都會導致過載重新整理原始碼的結果,所以這是每天必須做上百次。

我們的Vue應用程式還帶有熱載入模組和在開發模式下重新載入樣式,而Angular應用程式沒有。雖然這些可能配置Angular 2熱載入模組實現,但是Vue公司的樣板已經預設配置這種開箱即用的特性。

同樣的,而我們的Vue模板渲染是開箱即用的提前AoT渲染,而Angular2這樣做必須配置,並要求所有相關支援相同。 後者實際上更重要 -配置自己的應用程式來支援AoT編譯相對簡單,要求所有依賴相同是痛苦的。 這也助長規模膨脹。 我們的應用程式的初始大小就已經是1MB。
(....)

將Java放回JavaScript
我試圖理解為什麼我們的應用程式的分析器輸出看起來不像火焰圖,更像是一件抽象的後現代藝術...

篇文章討論了Angular 2的變化檢測策略:

預設情況下,即使我們必須每次檢查每個元件事件發生,Angular是非常快。它可以在幾毫秒內執行成千上萬的檢查。 這主要是由於Angular產生VM友好程式碼。

Angular將瀏覽器的JavaScript引擎視為VM,而不是完全不同於Java。 這意味著,除了使堆疊跟蹤長達三頁並且分析器毫無用處之外,框架的效能完全取決於其執行的引擎。雖然只有一個JVM,但是有六個JavaScript引擎,每個都有自己的效能配置檔案。我只能祈禱由Angular產生的就是“VM友好”對所有的程式碼。希望如此。

與Java相似不止這些。 Angular不是一個JavaScript框架,而是一個TypeScript框架。TypeScript喜歡假裝它是安全的,因為它是強型別。這有點真實,但TypeScript遭受與Java完全相同的問題 - 它不是null安全。 更糟糕的是,因為TypeScript沒有執行時元件,並且對許多不安全的轉換沒有發出警告,語言只提供了安全的錯覺。 例如,這是非常有效的TypeScript程式碼,不產生警告。

private static extractAgenda(agenda: any): Agenda {
  return agenda;
}
<p class="indent">


可怕的文件
Angular 2是我見過的主要框架中最壞的文件。 它是馬虎的,不完整的,寫得不好。 對於初學者來說, 快速入門頁面說:大多數文件是為TypeScript開發人員編寫的,尚未轉為JavaScript人員編寫。
(...)

前端開發的未來?
當我被介紹使用Angular2時,我希望它是一個優雅的框架,像Laravel和Django一樣,使得前端開發變得容易和愉快。 但是我發現得是一個不穩定、腫脹、過度設計的框架,承諾很多,但提供很少。

請為善良的緣故不要使用Angular。 對於不到其大小的十分之一的Vue.js卻提供了更好的開發體驗。


Angular 2 is terrible - meebleforp.com

[該貼被banq於2016-12-02 15:48修改過]

相關文章