原文:http://www.infoq.com/cn/articles/why-choose-angular2/
沒有選擇是痛苦的样勃,有太多的選擇卻更加痛苦伪窖。而后者正是目前前端領(lǐng)域的真實(shí)寫照。新的框架層出不窮:它難嗎若治?它寫得快嗎慨蓝?可維護(hù)性怎樣?運(yùn)行性能如何直砂?社區(qū)如何菌仁?前景怎樣?好就業(yè)嗎静暂?好招人嗎济丘?組建團(tuán)隊(duì)容易嗎?
每一個(gè)框架都得評估數(shù)不清的問題洽蛀,直到耗光你的精力摹迷。這種困境,被稱為“布利丹的驢子” —— 一只驢子站在兩堆看似完全相同的干草堆中間郊供,不知道如何選擇峡碉,最終餓死了。
當(dāng)然驮审,那只是一個(gè)哲學(xué)寓言■昙模現(xiàn)實(shí)中,大多數(shù)人采用了很簡單的策略來破解它:跟風(fēng)疯淫,選擇目前最流行的那個(gè)地来。這是一個(gè)低成本高收益的策略,不過也有風(fēng)險(xiǎn):成為現(xiàn)實(shí)版的《猴子下山》熙掺。最理想的方案還是要看出這兩堆“干草”之間的差異未斑,選擇更適合自己的那個(gè)。
本文就將帶你了解Angular 2這個(gè)“干草堆”的各種細(xì)節(jié)币绩。
ALL-IN-ONE
不管是1還是2蜡秽,Angular最顯著的特征就是其整合性。它是由單一項(xiàng)目組常年開發(fā)維護(hù)的一體化框架缆镣,涵蓋了M芽突、V、C/VM等各個(gè)層面董瞻,不需要組合诉瓦、評估其它技術(shù)就能完成大部分前端開發(fā)任務(wù)。這樣可以有效降低決策成本,提高決策速度睬澡,對需要快速起步的團(tuán)隊(duì)是非常有幫助的。
讓我們換一種問法吧:你想用樂高搭一個(gè)客廳眠蚂,還是買宜家套裝煞聪?
Angular 2就是前端開發(fā)領(lǐng)域的“宜家套裝”,它經(jīng)過精心的前期設(shè)計(jì)逝慧,涵蓋了開發(fā)中的各個(gè)層面昔脯,層與層之間都經(jīng)過了精心調(diào)適,是一個(gè)“開箱即用”的框架笛臣。
當(dāng)然云稚,你可能還記著Angular 1帶給你的那些快樂以及……痛苦。這是有歷史原因的沈堡。由于它是從一個(gè)用來做原型的框架演化而來的静陈,加上誕生時(shí)間很早(2009年,作為對比诞丽,jQuery誕生于2006年)鲸拥,當(dāng)時(shí)生態(tài)不完善,連模塊化機(jī)制都得自己實(shí)現(xiàn)(這就是angular.module的由來僧免,也是Angular 2中拋棄它的理由)刑赶。在長達(dá)七年的演化過程中,各種進(jìn)化的遺跡非常明顯懂衩,留下了不少“闌尾”撞叨。
但Angular 2就不同了,它的起點(diǎn)更高浊洞,整合了現(xiàn)代前端的各種先進(jìn)理念牵敷,在框架、文檔沛申、工具等各個(gè)層面提供了全方位的支持劣领。比如它的“組件樣式”能讓你在無需了解CSS Module的前提下獲得CSS Module的好處,它的Starter工程能讓你在無需了解Webpack的前提下獲得Hot Module Replacement等先進(jìn)特性铁材,它能讓你從Web Worker(你知道這是什么嗎尖淘?)中獲得顯著的性能提升。
你只管在前臺秀肌肉吧著觉!剩下的村生,讓Angular在幕后幫你搞定!
模塊化的技術(shù)
雖然Angular是一個(gè)ALL-IN-ONE的框架饼丘,但這并不妨礙它同時(shí)是一個(gè)靈活的框架趁桃。還記得OCP(開閉原則)嗎?一個(gè)好的設(shè)計(jì),對擴(kuò)展應(yīng)該是開放的卫病,對修改應(yīng)該是關(guān)閉的油啤。
Angular 2很好的踐行了OCP原則以及SoC(關(guān)注點(diǎn)分離)原則。
它非常有效的分離了渲染與交互邏輯蟀苛,這就讓它可以很好的跟包括React在內(nèi)的渲染引擎搭配使用益咬,除此之外,它還可以使用內(nèi)存渲染引擎帜平,以實(shí)現(xiàn)服務(wù)端渲染幽告;還可以使用Native渲染引擎,以編譯出真正的原生程序(NativeScript)裆甩。
它還分離了數(shù)據(jù)供應(yīng)與變更檢測邏輯冗锁,從而讓它可以自由使用包括RxJS以及ImmutableJS在內(nèi)的第三方數(shù)據(jù)框架/工具。
不僅如此嗤栓。
在Angular 1和Angular 2中最具特色的應(yīng)該算是依賴注入(DI)系統(tǒng)了冻河,它把后端開發(fā)中用來解決復(fù)雜問題、實(shí)現(xiàn)高彈性設(shè)計(jì)的DI技術(shù)引入了前端抛腕。Angular 2中更是通過引入TypeScript賦予它更高的靈活性和便利性芋绸。
不過,Angular 2并沒有敝帚自珍担敌,把它跟框架本身緊緊黏結(jié)在一起摔敛,而是把它設(shè)計(jì)成了一個(gè)獨(dú)立可用的模塊。這就意味著全封,無論你正在使用什么前端框架马昙,甚至NodeJS后端框架,都可以自由使用它刹悴,并從中獲益行楞。
全生命周期支持
除非你打算寫一個(gè)一次性應(yīng)用,否則軟件的生命周期會很長土匀。宏觀來看子房,真正的挑戰(zhàn)來自多個(gè)方面,而且在不斷變化就轧。
開始的階段证杭,我們需要非常快速的建立原型妒御,讓它跑起來解愤,引入最終用戶來試用,這個(gè)時(shí)候乎莉,挑戰(zhàn)來自開發(fā)速度以及可復(fù)用資產(chǎn)送讲。
之后奸笤,會建立一個(gè)逐漸擴(kuò)大的項(xiàng)目組,來完善這個(gè)原型的功能哼鬓。主要的挑戰(zhàn)是讓這個(gè)原型通過重構(gòu)不斷進(jìn)行演化监右,特別是在演化的后半個(gè)階段,產(chǎn)品需要保持隨時(shí)可以上線的狀態(tài)异希。但技術(shù)上的挑戰(zhàn)那都不是事兒秸侣!關(guān)鍵是人。
如何讓新人快速融入項(xiàng)目組宠互,貢獻(xiàn)生產(chǎn)力?這可沒那么簡單椭坚∮璧“你先去學(xué)xxx 0.5、yyy 0.9善茎、zzz 5.3...還要了解它們前后版本之間的差異券册,我再給你講代碼”,這種話垂涯,我可說不出口烁焙。一個(gè)優(yōu)秀的框架需要對分工提供良好的支持,每個(gè)人都可以先從一些簡單任務(wù)開始耕赘,逐步的從修改一個(gè)文件擴(kuò)大到修改一個(gè)目錄再到獨(dú)立實(shí)現(xiàn)一個(gè)特性骄蝇。
有了這種分工,每個(gè)團(tuán)隊(duì)成員就可以從一個(gè)成功走向一個(gè)更大的成功操骡。這就需要框架在設(shè)計(jì)上具有良好的局部性:你可以放心大膽的修改一部分九火,而不用擔(dān)心影響另一部分。你可以只修改CSS册招,可以只修改HTML岔激,可以只修改TS/JS,而不用擔(dān)心自己的修改破壞了其他部分是掰。而Angular 2通過聲明式界面虑鼎、組件樣式以及獨(dú)立模板文件等對這種安全感提供了有力的保障。
再然后键痛,如果你的軟件順利的進(jìn)入了線上維護(hù)階段炫彩,那么恭喜你,你終于迎來真正的大Boss了散休!這個(gè)大Boss就是可維護(hù)性媒楼。Angular開發(fā)組有很多程序員來自Google,如果要問誰的軟件維護(hù)經(jīng)驗(yàn)最豐富戚丸,Google和微軟必然名列前茅划址。微軟通過TypeScript的強(qiáng)類型機(jī)制體現(xiàn)了自己的經(jīng)驗(yàn)扔嵌,而Google則通過將OCP、SoC夺颤、SRP等一系列軟件設(shè)計(jì)原則融入Angular體現(xiàn)了自己的經(jīng)驗(yàn)痢缎。具體技術(shù)上則體現(xiàn)為:DI、生命周期鉤子世澜、組件等等独旷。
最后,如果你的軟件完成了歷史使命需要逐步退出寥裂,是不是就能松口氣了嵌洼?不行,你還得繼續(xù)留人維護(hù)它封恰。如果你選擇的是一個(gè)閉源的或某個(gè)社區(qū)很羸弱的開源技術(shù)麻养,你就把以前的主力架構(gòu)師、資深程序員留下來繼續(xù)維護(hù)它吧诺舔”畈或者你就得鼓起勇氣跟用戶說:你們玩兒,我先走了低飒。而Angular是一個(gè)大型開源項(xiàng)目许昨,并得到了Google的鼎力支持。即使經(jīng)歷過Angular 2項(xiàng)目組初期的公關(guān)失敗褥赊,它仍然有著其它競品無法企及的繁榮社區(qū) —— 無論在全球還是在中國糕档。顯然,無論是對傳統(tǒng)社區(qū)資源的繼承崭倘,還是對新社區(qū)資源的開拓翼岁,我們都有理由相信,Angular社區(qū)仍將一如既往地繁榮司光。至少琅坡,如果你不想讓自己的軟件建立在一大堆由個(gè)人維護(hù)的核心庫上,那么Angular毫無疑問是最好的選擇残家。
逃離“版本地獄”
如果是一兩個(gè)人開發(fā)一個(gè)預(yù)期壽命不到一年的系統(tǒng)榆俺,那么任何框架都可以勝任。但坞淮,現(xiàn)實(shí)中我們都把這種系統(tǒng)稱之為“坑”茴晋。作為一個(gè)高度專業(yè)、高度工程化的開發(fā)組回窘,我們不能把“坑”留給友軍诺擅。這些坑中,最明顯的就是“版本地獄”
想象一下啡直,你僅僅升級了庫的次版本號烁涌,原來的軟件就不能用了苍碟,損壞了N處單元測試以及M個(gè)E2E場景。這種情況對于開發(fā)組來說簡直是一個(gè)噩夢 —— 畢竟撮执,誰也不想做無用功微峰,更何況是一而再、再而三的抒钱◎阉粒或者,它每次小的改動(dòng)都會修改主版本號 —— 對谋币,我就是不向后兼容仗扬,你能咋地?你所能做的就是每一次決定升級都如臨大敵蕾额,不但要小心翼翼的升級這個(gè)庫本身還要升級與它協(xié)作的幾乎所有庫厉颤。
可見,亂標(biāo)版本號可能會讓使用者付出巨大的代價(jià)凡简。這不但體現(xiàn)在工作量上,還會體現(xiàn)在研發(fā)團(tuán)隊(duì)的招募與培養(yǎng)上精肃,想象一下秤涩,對小版本之間都不兼容的框架,研發(fā)團(tuán)隊(duì)都需要記住多少東西司抱?那簡直是噩夢筐眷!
但是,版本號的問題在業(yè)內(nèi)早就有了事實(shí)性標(biāo)準(zhǔn)习柠,那就是SemVer語義化版本標(biāo)準(zhǔn)匀谣。唯一的問題是,作為框架/庫的作者资溃,遵循SemVer標(biāo)準(zhǔn)需要付出的努力是巨大的武翎。是否愿意付出這些代價(jià),是一個(gè)框架(及其開發(fā)組)是否成熟的重要標(biāo)志溶锭。
Angular就是這樣一個(gè)框架宝恶,其開發(fā)組曾作出的努力是有目共睹的。如果你是從Angular 1.2開始使用的趴捅,那么你為1.2所寫的代碼都可以毫無障礙的遷移到最新的1.5版垫毙,新的版本只是引入了新特性,而沒有破壞老特性拱绑。這是因?yàn)锳ngular開發(fā)組寫了大量單元測試和E2E測試综芥,借助CI來保障這種平滑過渡。只有在從1.0到1.2的遷移過程中(1.1一直是beta猎拨,忽略不計(jì))膀藐,出現(xiàn)了一系列破壞性變更屠阻,這些變更被明確的記錄在文檔中,并且解釋了做出這些變更的理由 —— 大多數(shù)是因?yàn)樘嵘岸舜a安全性消请。即使你恰好遇到了這些破壞性變更栏笆,它也會給出明確的錯(cuò)誤提示。
這些必要而無聊的工作臊泰,正是幫助我們逃離“版本地獄”的關(guān)鍵蛉加。是否愿意做這些無聊而瑣碎的工作,是一個(gè)框架的開發(fā)組是否成熟缸逃、專業(yè)的關(guān)鍵特征针饥。而Angular的開發(fā)組已經(jīng)證明了它值得你信任!
遇見未來的標(biāo)準(zhǔn)
編程領(lǐng)域需频,創(chuàng)新無處不在丁眼。但對一個(gè)工程團(tuán)隊(duì)來說,最難得的是標(biāo)準(zhǔn)昭殉。標(biāo)準(zhǔn)意味著:
招人容易苞七。因?yàn)闃?biāo)準(zhǔn)的東西會的人最多,而且人們愿意學(xué)它 —— 因?yàn)橹缹W(xué)了就不會浪費(fèi)挪丢。
養(yǎng)人容易蹂风。因?yàn)榫W(wǎng)上有很多教程可用,即使不得已自己做教程乾蓬,性價(jià)比也是最高的惠啄。
換人容易。標(biāo)準(zhǔn)就意味著不是私有技術(shù)任内,一個(gè)人離開了撵渡,就能用另一個(gè)人補(bǔ)上,而不會出現(xiàn)長期空缺死嗦,影響業(yè)務(wù)趋距。
但是,標(biāo)準(zhǔn)永遠(yuǎn)會比創(chuàng)新慢一拍或N拍越除。這就意味著如果你追新棚品,那么在獲得技術(shù)上的收益的同時(shí),也要付出工程上的代價(jià)廊敌。固然铜跑,兩者不可兼得,但是還是有一些策略能夠調(diào)和兩者的骡澈。最簡單的策略就是:遇見未來的標(biāo)準(zhǔn)锅纺。
所謂未來的標(biāo)準(zhǔn),就是某個(gè)標(biāo)準(zhǔn)的草案肋殴,它很有希望成為未來的標(biāo)準(zhǔn)囤锉,這代表了業(yè)界對某項(xiàng)技術(shù)的認(rèn)可坦弟,于是,即使它還不成熟官地,人們也愿意為之投資酿傍。比如雖然Google曾經(jīng)提出過N種自有技術(shù),包括SPDY驱入、Gears赤炒、OGG等,但卻并沒有把它們變成私有技術(shù)亏较,而是對社區(qū)開放以及并入W3C的標(biāo)準(zhǔn)草案莺褒。
Angular 2采用的就是這種策略。它所參照的標(biāo)準(zhǔn)草案比較多雪情,一個(gè)是WebWorker遵岩,它借助WebWorker來把繁重的計(jì)算工作移入輔助線程,讓界面線程不受影響巡通;另一個(gè)是WebComponents尘执,Angular 2的組件化體系就是對WebComponents的一種實(shí)現(xiàn);最后是CSS scoping宴凉,現(xiàn)在雖然市面上有了很多CSS模塊化技術(shù)正卧,但事實(shí)上最終還是會被統(tǒng)一到CSS Scoping標(biāo)準(zhǔn)上,屆時(shí)跪解,如果:local等關(guān)鍵字無法進(jìn)入標(biāo)準(zhǔn),就會成為私有技術(shù)签孔。而Angular 2選擇的方式是直接實(shí)現(xiàn)CSS scoping標(biāo)準(zhǔn)草案叉讥,比如:host、:host-context等饥追。顯然图仓,采用這種策略,“遇見未來的標(biāo)準(zhǔn)”的成功率會高得多但绕。
可以看到救崔,Angular 2的設(shè)計(jì)哲學(xué)中貫穿著對標(biāo)準(zhǔn)化的熱烈擁抱,這是我判斷它將贏得未來的另一個(gè)信心來源捏顺。
速度與激情
Angular 2終于擺脫了舊的技術(shù)框架束縛六孵,開始了對速度的極致追求。在Angular 1中幅骄,雖然絕大多數(shù)場景下性能都不是問題劫窒,不過還是因?yàn)槠浯a中存在的一個(gè)用來實(shí)現(xiàn)臟檢查的三重循環(huán)而飽受抨擊 —— 似乎真有人能感受到30毫秒和100毫秒的差異似的。
不過拆座,有軟肋總是不太好主巍。于是冠息,在Angular 2中,通過重新設(shè)計(jì)和引入新技術(shù)孕索,從原理上對速度進(jìn)行了提升逛艰,據(jù)官方以前提供的一個(gè)數(shù)據(jù)說是把“變更檢測”的效率提升了500%。
它在“變更檢測”算法上做了兩項(xiàng)主要的改進(jìn):
在設(shè)計(jì)上搞旭,把以前的“多輪檢查散怖、直到穩(wěn)定”策略改成了“一輪檢查、直接穩(wěn)定”策略选脊。當(dāng)然杭抠,這會對自己的代碼產(chǎn)生一定的限制,但實(shí)際上只在有限的少數(shù)幾個(gè)場景下才會遇到這個(gè)限制恳啥,而且官方文檔中也給出了明確的提示偏灿。
在實(shí)現(xiàn)上,把“變更檢測”算法移入了由WebWorker創(chuàng)建的輔助線程中執(zhí)行《鄣模現(xiàn)代的家用電腦很多都已經(jīng)是多核超線程的翁垂,但是瀏覽網(wǎng)頁時(shí)實(shí)際上無法充分利用全部線程,而WebWorker提供了一個(gè)新的機(jī)制硝桩,
讓一些相對繁重的計(jì)算工作運(yùn)行在輔助線程中沿猜,等執(zhí)行完了再通知主線程。即使你不明白WebWorker的工作原理碗脊,
至少也能知道Ajax請求是不會阻塞界面響應(yīng)的啼肩,WebWorker也一樣。
除此之外衙伶,Angular還對數(shù)據(jù)源進(jìn)行了抽象蹦浦,你完全可以用ImmutableJS來作為Angular的數(shù)據(jù)源研侣,獲得其在提升“變更檢測”速度方面的所有優(yōu)勢俘闯。
除了“變更檢測”外甸各,Angular以及所有前端SPA程序,都有一個(gè)通卜页痢:首次加載太慢躺同,要下載完所有js和css才能渲染出完整的界面來。React通過虛擬DOM解決了此問題丸逸,而Angular 2則通過獨(dú)立的服務(wù)端渲染引擎解決了這個(gè)問題蹋艺。我們前面說過,Angular 2把渲染引擎獨(dú)立了出來黄刚,因此可以在NodeJS中實(shí)現(xiàn)服務(wù)端的內(nèi)存渲染车海。所謂內(nèi)存渲染就是在內(nèi)存中把DOM結(jié)構(gòu)渲染出來并發(fā)回給瀏覽器,這樣,客戶端不需要等JS代碼下載完就可以顯示出完整的界面了侍芝。這種分離還帶來了另一個(gè)好處研铆,那就是SEO。SEO同樣是傳統(tǒng)SPA的一個(gè)難點(diǎn)州叠,它和服務(wù)端渲染是同一個(gè)問題的兩個(gè)方面棵红,因此隨著服務(wù)端渲染的完成,SEO問題也被順便解決了咧栗。
讓你無縫升級
Angular 2開發(fā)組在早期階段曾犯下一個(gè)嚴(yán)重的公關(guān)錯(cuò)誤:過早宣布不兼容Angular 1逆甜,也不提供從Angular 1到2的升級方案。
這讓Angular 2開發(fā)組付出了沉重的代價(jià)致板,可謂傷透了粉絲的心交煞。作為技術(shù)人員,這種失誤固然是可以理解的斟或,但卻需要付出更多的努力來彌補(bǔ)它素征。而Angular 2確實(shí)這么做了。
在Angular 2中萝挤,開發(fā)組提供了一個(gè)UpgradeAdapter
類御毅,這個(gè)升級適配器讓Angular 1.x的所有部件都能和Angular 2.x中的所有部件協(xié)同工作。
而最牛的地方在于怜珍,它讓你可以一個(gè)文件一個(gè)文件的逐步升級到Angular 2端蛆,而在整個(gè)升級過程中,應(yīng)用可以繼續(xù)在線上跑酥泛!看著神奇嗎今豆?其實(shí)也算不了啥,Google做這種事早就是輕車熟路了柔袁。這只不過是對Angular開發(fā)組出色的工程化開發(fā)能力的一點(diǎn)小小證明而已呆躲。
不過,既然如此瘦馍,當(dāng)初又何必急匆匆宣布不兼容呢?可見应役,再出色的工程團(tuán)隊(duì)情组,如果缺少了和社區(qū)溝通的產(chǎn)品運(yùn)營技巧,也會付出巨大代價(jià)箩祥。希望Angular開發(fā)組以后能謹(jǐn)言慎行院崇,多用行動(dòng)來平息質(zhì)疑。
幕后 —— 當(dāng)Google牽手微軟
當(dāng)年的瀏覽器大戰(zhàn)袍祖,讓人記憶猶新底瓣,Chrome的出品商Google和IE的出品商微軟正是瀏覽器大戰(zhàn)的兩大主角。
俗話說:沒有永遠(yuǎn)的朋友,也沒有永遠(yuǎn)的敵人捐凭,只有永遠(yuǎn)的…… 精益求精拨扶。
正是在這樣的“俗話”指導(dǎo)下,Google與微軟相逢一笑泯恩仇茁肠,撤銷了很多針對彼此的訴訟患民,甚至在一些領(lǐng)域開始合作。而實(shí)際上垦梆,在他們公開和解之前匹颤,就已經(jīng)開始公開合作了,其契機(jī)就是Angular 2托猩。
這就要扯出一點(diǎn)小八卦了印蓖。
在Angular 2開發(fā)的早期階段,由于傳統(tǒng)JS(ES5)以及當(dāng)時(shí)的ES6草案無法滿足項(xiàng)目組的開發(fā)需求京腥,項(xiàng)目組有點(diǎn)煩赦肃。后來有人靈機(jī)一動(dòng)開發(fā)了一種叫做AtScript的新語言,它是什么呢绞旅?一個(gè)帶類型支持和Annotation支持的升級版JS摆尝。其實(shí)在類型支持方面,TypeScript早就已經(jīng)做了因悲,而且那時(shí)候已經(jīng)比較成熟堕汞,唯一的遺憾是不支持Annotation,也就是像Java中那樣通過@
符號定義元數(shù)據(jù)的方式晃琳。
Angular開發(fā)組就這樣孤獨(dú)的走過了一小段兒時(shí)間讯检,后來也不知道怎么這兩個(gè)歡喜冤家就公然牽手了∥篮担總之人灼,最后的結(jié)果是:TypeScript中加入了與Annotation相似的Decorator特性,而Angular放棄了AtScript改用TypeScript顾翼。
這次結(jié)合無論對兩大廠商還是對各自的粉絲投放,都是一個(gè)皆大歡喜的結(jié)局,稱其為世紀(jì)聯(lián)手也不為過适贸。此后灸芳,Google與微軟不再止于暗送秋波,而是開始了一系列秀恩愛的動(dòng)作拜姿。無論如何烙样,對于開發(fā)者來說,這都是一個(gè)好消息蕊肥。
軟粉們可能還記得在6.1的微軟開發(fā)者大會上谒获,微軟曾公開提及Angular 2。事實(shí)上,TypeScript目前雖然已經(jīng)相當(dāng)完備批狱,但應(yīng)用度仍然不高裸准。就個(gè)人感覺來說,Angular 2將是TypeScript的一個(gè)殺手級應(yīng)用精耐。TypeScript如果當(dāng)選TIOBE年度語言狼速,Angular 2的推出功不可沒。
為什么我要特意插播這段兒故事呢卦停?那是因?yàn)槲艺J(rèn)為一個(gè)產(chǎn)品的未來最終取決于開發(fā)組的未來向胡,而不是相反。軟件的本質(zhì)是人惊完!一個(gè)心態(tài)開放僵芹、講究合作、勇于打破陳規(guī)陋習(xí)的開發(fā)組小槐,才是框架給人信心的根本保障拇派。
后端程序員的終南捷徑
前端程序員自不必說,因?yàn)橛泻芏嗳司褪强緼ngular進(jìn)入專業(yè)前端領(lǐng)域的凿跳。下面這段話主要寫給后端程序員件豌。
不管是想學(xué)習(xí)新技術(shù)還是出于工作需要,都有很多后端程序員對前端技術(shù)躍躍欲試控嗜。但面對前端讓人眼花繚亂的大量候選技術(shù)以及未知的概念茧彤,他們往往感覺感覺無所適從。如果你是其中的一員疆栏,那么Angular可以“治愈”你的選擇恐懼癥曾掂。
正如前面所說,Angular是一個(gè)“ALL-IN-ONE”的框架壁顶,這就意味著你只要掌握了Angular就可以完成大量的前端工作了珠洗。
這首先得益于它對各種技術(shù)的封裝,讓你不用關(guān)心它的實(shí)現(xiàn)細(xì)節(jié)若专。Angular隔離了瀏覽器的細(xì)節(jié)许蓖,大多數(shù)工作你甚至都不需要知道DOM等前端知識就可以完成。
其次调衰,Angular選擇了TypeScript作為主語言膊爪。如果你是個(gè)C#程序員,一定會對它的語法感覺似曾相識窖式。沒錯(cuò)蚁飒,TypeScript和C#动壤、Delphi有同一個(gè)“爹” —— 傳奇人物Anders Hejlsberg萝喘。即使是Java程序員,也不會覺得陌生:強(qiáng)類型、類阁簸、接口爬早、注解等等,無一不是后端程序員們耳熟能詳?shù)母拍钇裘谩Uf到底筛严,并沒有什么前端語言和后端語言,在語言領(lǐng)域耕耘多年的Anders太熟悉優(yōu)秀語言的共性了饶米,他所做的取舍值得你信賴桨啃。
再次,Angular在前端實(shí)現(xiàn)了服務(wù)與依賴注入的概念檬输。隨著前端需求的進(jìn)一步膨脹照瘾,即使只算邏輯代碼,其需求復(fù)雜度也即將甚至已經(jīng)趕上了大部分后端程序丧慈。所以析命,后端遇到過的挑戰(zhàn)前端也遲早會遇到,這正是后端程序員彎道超車的好機(jī)會逃默,而依賴注入正是后端程序員的看家本領(lǐng)鹃愤。
最后,Angular對團(tuán)隊(duì)作戰(zhàn)提供了良好的支持完域,比如模板與代碼的分離软吐、樣式表的局部化、組件化的設(shè)計(jì)筒主、服務(wù)與依賴注入體系等关噪。這些特性讓后端程序員可以先專注于跟后端代碼最像的模型和交互邏輯部分,而把諸如樣式乌妙、模板等自己不擅長的部分交給隊(duì)友使兔。