Angular2是可怕的
搖搖欲墜的基礎
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修改過]
相關文章
- Eventloop不可怕,可怕的是遇上PromiseOOPPromise
- 遊戲炸服並不可怕,可怕的是你被嚇傻了遊戲
- 可怕的甲醛
- Redis ORM是一個可怕的主意嗎? -DEV社群RedisORMdev
- 理解Angular2中的ViewContainerRefAngularViewAI
- 分散式系統中,級聯故障是最可怕的分散式
- Angular2初識Angular
- Angular2 http服務AngularHTTP
- 邦芒職場:職場可怕的不是升職加薪,是“早衰”
- Angular2 元件生命週期Angular元件
- 可怕的萬聖節 Linux 命令Linux
- 禁止散戶質押加密貨幣?這是一條可怕的監管之路!加密
- 比隱私濫用更可怕的,是AI攝像頭的黑灰產之困AI
- 可怕!那些你看不到的程式
- 可怕!CPU竟成了黑客的幫凶!黑客
- [20200416]可怕的防水牆產品.txt
- 我用遊戲瞭解疾病的可怕,「惡意滿滿」的《瘟疫公司》背後是善意遊戲
- angular2 大體功能思維導圖Angular
- 創業最可怕的不是競爭,而是……創業
- 資訊洩露的後果很可怕
- Twaver HTML5中的 CloudEditor 進行Angular2 重寫HTMLCloudAngular
- Angular2入門系列(五)———— 路由引數設定Angular路由
- 使用Angular-cli搭建Angular2開發環境Angular開發環境
- OpenAI草莓Q星可怕之處OpenAI
- WWDC 中提到的瀏覽器 Fingerprinting 有多可怕?瀏覽器
- 人臉識別背後:可怕的不是技術
- 可怕!CPU暗藏了這些未公開的指令!
- 《Angular2 從開發到部署系列》之「環境搭建」Angular
- Angular2 興趣小組 & 問題及回答彙總Angular
- GPT4有那麼可怕嗎?GPT
- 從運營商拿到你的Cookie究竟有多可怕Cookie
- 2019 年最可怕的黑客事件與安全漏洞(上)黑客事件
- 2019 年最可怕的黑客事件與安全漏洞(下)黑客事件
- 出現可怕的NoSuchMethodError錯誤的解決辦法 -Gunnar MorlingError
- Angular2如何使用第三方類庫(如:jQuery)AngularjQuery
- 畫餅成癮的遊戲製作人究竟有多可怕?遊戲
- 防患於未然,“想哭”病毒並不可怕
- 勒索病毒很可怕?!一招解決
- leobert重構程式碼二三事--一.可怕的低階程式碼