作為一名干了10年開(kāi)發(fā)的搬磚工程師屋摇,一直以來(lái)對(duì)前端是既熟悉简烤,而更多的又陌生版保。熟悉是因?yàn)闀?huì)使用各種常用的前端技術(shù)和框架來(lái)完成日常工作(其實(shí)主要是jQuery)果覆,而陌生則來(lái)自于近些年前端技術(shù)百花齊放的蓬勃發(fā)展所帶來(lái)的各種變化颅痊。這些變化層出不窮,眼花繚亂局待,讓人真實(shí)感覺(jué)到腦子不夠用了斑响。為了找回對(duì)自己智商的自信,也為了更好的理解前端當(dāng)前的發(fā)展钳榨,我決定花點(diǎn)時(shí)間好好研究一下前端(不只限于前端技術(shù))舰罚。首先,讓我們從前端的發(fā)展歷程開(kāi)始吧薛耻。
任何一個(gè)事物從誕生到發(fā)展沸停,再到成熟,最終走向滅亡的整個(gè)過(guò)程昭卓,都受到外部環(huán)境和內(nèi)部條件等客觀事實(shí)和規(guī)律的左右愤钾。就像人類文明能夠發(fā)展到今天,既有很多偶然候醒,也是必然一樣能颁。那些現(xiàn)在看來(lái)是偶然的歷史事件,在當(dāng)時(shí)的環(huán)境下倒淫,都是合理的伙菊,必然發(fā)生的。前端的發(fā)展也一樣敌土,它一路伴隨著互聯(lián)網(wǎng)的產(chǎn)生而產(chǎn)生镜硕,伴隨著計(jì)算機(jī)技術(shù)和互聯(lián)網(wǎng)的發(fā)展而發(fā)展。
第一階段返干,三駕馬車誕生兴枯,拉開(kāi)前端發(fā)展序幕
20世紀(jì)70年代,互聯(lián)網(wǎng)誕生矩欠,誕生之初的互聯(lián)網(wǎng)财剖,僅僅只是在電腦之間傳輸和顯示文本,那時(shí)候癌淮,沒(méi)有瀏覽器躺坟,沒(méi)有HTML,只有TCP/IP乳蓄。到了90年代咪橙,隨著通過(guò)互聯(lián)網(wǎng)傳遞信息并將信息鏈接起來(lái)的需求不斷出現(xiàn),迫切需要一個(gè)文件格式規(guī)范,來(lái)更好的組織互聯(lián)網(wǎng)上的文本美侦。1991年产舞,在CERN工作的英國(guó)物理學(xué)家蒂姆·伯納斯-李,提出了HTML Tags音榜,并使用它制作了幾個(gè)網(wǎng)頁(yè)文件庞瘸,為了展示這些網(wǎng)頁(yè),他還寫(xiě)了第一個(gè)網(wǎng)頁(yè)瀏覽器赠叼。隨后他提出WWW(World Wide Web)萬(wàn)維網(wǎng)的概念 —— 一個(gè)由許多互相鏈接的超文本組成的系統(tǒng)擦囊,通過(guò)互聯(lián)網(wǎng)訪問(wèn)。并持續(xù)推動(dòng)萬(wàn)維網(wǎng)的建立嘴办。1995年瞬场,IETF發(fā)布了HTML 2.0標(biāo)準(zhǔn),這是第一個(gè)成為后續(xù)標(biāo)準(zhǔn)的依據(jù)的HTML規(guī)范涧郊。
最初的HTML贯被,只是一種用來(lái)結(jié)構(gòu)化文本信息的超文本標(biāo)記語(yǔ)言,它本身并不包含顯示樣式妆艘。為了顯示文本彤灶,不同瀏覽器都結(jié)合了自己的樣式語(yǔ)言,讀者可以通過(guò)調(diào)節(jié)這些樣式來(lái)調(diào)整網(wǎng)頁(yè)的顯示方式批旺。但隨著HTML的成長(zhǎng)幌陕,為了滿足設(shè)計(jì)師的要求,HTML獲得了很多顯示功能汽煮。隨著這些功能的增加搏熄,瀏覽器定義樣式的語(yǔ)言越來(lái)越?jīng)]有意義了。1994年哈肯·維姆·萊提出了CSS的最初建議暇赤,并由W3C與1996年底心例,發(fā)布了CSS1.0。
1994年鞋囊,網(wǎng)景公司推出了世界上第一款商用瀏覽器Navigator止后,很快便成為世界上最流行的瀏覽器。隨后失暴,微軟也發(fā)布了其IE瀏覽器坯门,并利用Windows操作系統(tǒng)的捆綁銷售,形成對(duì)網(wǎng)景的有力競(jìng)爭(zhēng)逗扒。為了在商業(yè)上保持優(yōu)勢(shì),網(wǎng)景不斷創(chuàng)新瀏覽器產(chǎn)品欠橘,期望在靜態(tài)HTML文檔中矩肩,能加入一些動(dòng)態(tài)效果。為此,網(wǎng)景創(chuàng)建了Javascript腳本語(yǔ)言黍檩,并大獲成功叉袍。隨后,微軟也在IE瀏覽器中推出JScript語(yǔ)言刽酱,加入與網(wǎng)景的競(jìng)爭(zhēng)喳逛。為了對(duì)兩個(gè)主流的瀏覽器腳本語(yǔ)言標(biāo)準(zhǔn)化,1997年由網(wǎng)景棵里、Sun润文、微軟、Borland等公司組織及個(gè)人組成的技術(shù)委員會(huì)在ECMA(歐洲計(jì)算機(jī)制造商協(xié)會(huì))確定定義了一種名叫ECMAScript的新腳本語(yǔ)言標(biāo)準(zhǔn)殿怜,規(guī)范名為ECMA-262典蝌。JavaScript成為了ECMAScript的實(shí)現(xiàn)之一。完整的JavaScript實(shí)現(xiàn)應(yīng)該包含三個(gè)部分头谜,即ECMAScript(語(yǔ)言核心)骏掀、DOM(文檔對(duì)象模型)、BOM(瀏覽器對(duì)象模型)柱告。
至此截驮,前端三駕馬車HTML、CSS际度、Javascript正式建立葵袭,前端也迎來(lái)了初生。在Web1.0時(shí)代甲脏,互聯(lián)網(wǎng)以公司產(chǎn)生內(nèi)容為主眶熬,大量的門(mén)戶網(wǎng)站涌現(xiàn)。這時(shí)的前端块请,還是以HTML和CSS為主娜氏,Javascript輔助實(shí)現(xiàn)一些動(dòng)態(tài)效果。所有的前端展示內(nèi)容墩新,都是由服務(wù)器端通過(guò)模板直接輸出贸弥。對(duì)于前端工程師來(lái)說(shuō),這時(shí)候海渊,工作更多的是基于三駕馬車的網(wǎng)頁(yè)模板制作绵疲。
第二階段,默默無(wú)聞的積蓄力量臣疑,在平靜中等待爆發(fā)
從1998年至2004年盔憨,網(wǎng)景在與微軟的競(jìng)爭(zhēng)中,逐漸落敗讯沈。在瀏覽器領(lǐng)域郁岩,微軟一家獨(dú)大,控制了絕大部分市場(chǎng)份額,沒(méi)有了殘酷的商業(yè)競(jìng)爭(zhēng)问慎,瀏覽器產(chǎn)品的創(chuàng)新和發(fā)展也開(kāi)始放慢了腳步萍摊。隨著互聯(lián)網(wǎng)的高速發(fā)展,以雅虎為代表的大型互聯(lián)網(wǎng)公司紛紛快速崛起如叼,在這個(gè)蠻荒的年代冰木,大部分公司都把注意力放到了通過(guò)內(nèi)容獲取流量,爭(zhēng)奪更多的用戶上笼恰,對(duì)于前端技術(shù)創(chuàng)新的需求也逐漸減弱了踊沸。這些因素綜合作用,導(dǎo)致前端的發(fā)展進(jìn)入相對(duì)比較平穩(wěn)的一段時(shí)期挖腰。在這幾年里雕沿,一方面,前端三駕馬車HTML猴仑、CSS审轮、Javascript被大廠商和標(biāo)準(zhǔn)化組織推動(dòng),繼續(xù)完善著各自的標(biāo)準(zhǔn)辽俗。1999年疾渣,W3C發(fā)布了非常重要的HTML4.0標(biāo)準(zhǔn)和CSS2.0標(biāo)準(zhǔn)。同年崖飘,ECMAScript3.0發(fā)布榴捡,成為JavaScript的通行標(biāo)準(zhǔn)。也正是在這個(gè)版本中朱浴,提出了JSON數(shù)據(jù)交換語(yǔ)言吊圾。另一方面,瀏覽器廠商翰蠢,也逐步開(kāi)始完善對(duì)三駕馬車標(biāo)準(zhǔn)的支持项乒。2000年微軟發(fā)布的IE5,成為第一個(gè)完全支持CSS1.0的瀏覽器梁沧。
2000年之后檀何,隨著互聯(lián)網(wǎng)泡沫破滅影響的逐漸消失,互聯(lián)網(wǎng)的發(fā)展又開(kāi)始慢慢恢復(fù)了生機(jī)廷支。瀏覽器領(lǐng)域除了2001年微軟發(fā)布IE6外频鉴,也開(kāi)始涌現(xiàn)出新的面孔。2002年Firefox1.0發(fā)布恋拍,2003年Safari1.0發(fā)布垛孔,開(kāi)始挑戰(zhàn)微軟的霸主地位。這個(gè)時(shí)期施敢,也誕生了一項(xiàng)對(duì)后來(lái)前端發(fā)展至關(guān)重要的技術(shù)——Ajax似炎。微軟在IE5中辛萍,實(shí)現(xiàn)了XMLHttpRequest接口悯姊,允許Javascript發(fā)出異步HTTP請(qǐng)求羡藐,標(biāo)志著Ajax技術(shù)誕生。
第三階段悯许,Ajax廣泛應(yīng)用帶來(lái)前端大爆發(fā)仆嗦,人人都是前端工程師
2005年,搜索巨頭Google在其發(fā)布的多款交互式Web應(yīng)用程序(如Gmail先壕、Google地圖瘩扼、Google討論組)中,采用Ajax異步通信技術(shù)垃僚,實(shí)現(xiàn)了良好的用戶體驗(yàn)和互動(dòng)效果集绰,讓Ajax技術(shù)迅速引起大家的注意。隨著《Ajax: A New Approach to Web Applications》一文的迅速流傳谆棺,人們開(kāi)始有意識(shí)的在應(yīng)用中使用Ajax技術(shù)栽燕。
Ajax技術(shù)的廣泛使用,既順應(yīng)了Web2.0以用戶為中心交互的特點(diǎn)改淑,也強(qiáng)烈的改變了前端的工作內(nèi)容碍岔。在沒(méi)有采用Ajax技術(shù)之前,前端展示的所有內(nèi)容朵夏,都來(lái)自服務(wù)端的輸出蔼啦,用戶的交互行為大部分也都需要與服務(wù)器做一次完整的交互,并重新獲取全部?jī)?nèi)容仰猖。而且由于Javascript不具備發(fā)送HTTP請(qǐng)求的能力捏肢,也限制了Javascript只能做一些僅限于前端的動(dòng)態(tài)效果,而無(wú)法直接實(shí)現(xiàn)與服務(wù)端交互相結(jié)合的動(dòng)態(tài)效果饥侵。而Ajax的廣泛應(yīng)用鸵赫,完全釋放了Javascript作為瀏覽器端腳本語(yǔ)言的威力,與服務(wù)端的交互能力結(jié)合對(duì)DOM的操作爆捞,使得Javascript可以優(yōu)雅的完成更多的工作奉瘤,也使得Web開(kāi)發(fā)前后端的完全分離成為了可能。
正是Ajax技術(shù)的廣泛應(yīng)用煮甥,使得Javascript在前端領(lǐng)域的作用凸顯了出來(lái)盗温,也推動(dòng)了前端技術(shù)在Javascript領(lǐng)域的飛速發(fā)展。隨著Javascript能力的增強(qiáng)成肘,人們對(duì)前端的需求也逐漸變得豐富起來(lái)卖局。為了方便使用Javascript來(lái)進(jìn)行各種前端的操作,迄今為止最流行的Javascript類庫(kù)jQuery應(yīng)運(yùn)而生双霍。2006年砚偶,jQuery1.0發(fā)布批销,主要提供了便捷的DOM操作、創(chuàng)建動(dòng)畫(huà)效果染坯、處理事件及Ajax操作等功能均芽。由于其簡(jiǎn)單易用的編程模型和跨平臺(tái)支持的特性,jQuery在隨后幾年里一路高歌猛進(jìn)单鹿,很快成為了大部分前端Web應(yīng)用共同的第一選擇掀宋。jQuery的成功,一方面得益于Web2.0時(shí)代人們對(duì)于具備良好交互能力的前端需求的爆發(fā)仲锄,另一方面劲妙,也得益于其構(gòu)建的龐大的插件生態(tài)系統(tǒng),為前端研發(fā)提供了大量便利的工具庫(kù)儒喊,極大的降低了前端研發(fā)的復(fù)雜性镣奋。越來(lái)越多的人開(kāi)始投身并關(guān)注前端研發(fā)工作,越來(lái)越多的大公司開(kāi)始重視前端研發(fā)工作怀愧。投身前端研發(fā)的人一多起來(lái)侨颈,各種需求、想法和實(shí)踐便開(kāi)始層出不窮掸驱,前端迎來(lái)了有史以來(lái)最開(kāi)放肛搬、最多元化的發(fā)展階段。
第四階段毕贼,百家爭(zhēng)鳴温赔,百花齊放,眼花繚亂的前端發(fā)展圖譜
從2008年開(kāi)始鬼癣,隨著互聯(lián)網(wǎng)的快速發(fā)展和前端能力的增強(qiáng)陶贼,互聯(lián)網(wǎng)行業(yè)對(duì)前端的期望和需求也越來(lái)越大。前端開(kāi)始承擔(dān)越來(lái)越多待秃、越來(lái)越復(fù)雜的功能拜秧。為了讓前端更好的適應(yīng)這種變化,各路大神和大企業(yè)開(kāi)始關(guān)注前端技術(shù)的方方面面章郁,幫助前端建立完成大型應(yīng)用開(kāi)發(fā)的能力枉氮。一時(shí)間,各種前端框架暖庄、UI工具庫(kù)聊替、語(yǔ)言標(biāo)準(zhǔn)、模塊化培廓、工程化工具等如雨后春筍般涌現(xiàn)惹悄。
從2008年開(kāi)始,人們對(duì)前端用戶體驗(yàn)的追求越來(lái)越極致肩钠。Web應(yīng)用桌面化的想法逐漸開(kāi)始出現(xiàn)泣港。隨著SPA(Single Page Application)單頁(yè)Web應(yīng)用等概念被提出來(lái)并付諸實(shí)踐暂殖,前端項(xiàng)目的代碼越來(lái)越龐大,越來(lái)越復(fù)雜当纱。為了更好的組織前端代碼呛每,受服務(wù)端一直采用的MVC架構(gòu)模式的啟發(fā),前端領(lǐng)域也產(chǎn)生了各種基于MV*架構(gòu)(MVC惫东、MVP莉给、MVVM等)的框架。如適合開(kāi)發(fā)大型應(yīng)用的大而全的AngularJS廉沮、EmberJS、KnockoutJS徐矩,適合開(kāi)發(fā)小型應(yīng)用的小巧的BackboneJS等滞时。與此同時(shí),關(guān)注MV*架構(gòu)中一些關(guān)鍵問(wèn)題的更精致和專注的類庫(kù)也逐步發(fā)展起來(lái)滤灯。比如重點(diǎn)關(guān)注前端用戶界面構(gòu)建的框架坪稽,特別是UI組件化方案的ReactJS、VueJS等鳞骤,以及關(guān)注UI組件間狀態(tài)管理窒百,能夠更React配合使用的Redux。
2008年豫尽,Google發(fā)布新一代Javascript執(zhí)行引擎V8篙梢,這個(gè)高性能的嵌入式Javascript執(zhí)行引擎,一方面大幅提高了Javascript的執(zhí)行效率美旧,同時(shí)也為在非瀏覽器環(huán)境下執(zhí)行Javascript提供了可能渤滞。2009年,對(duì)于Javascript來(lái)說(shuō)具有劃時(shí)代意義的NodeJS誕生榴嗅,它使得過(guò)去只是在前端使用的Javascript語(yǔ)言妄呕,能夠用來(lái)構(gòu)建高性能的服務(wù)端應(yīng)用。這極大的激發(fā)了Javascript工程師的工作熱情嗽测,全棧工程師成為了他們的新目標(biāo)绪励。為了讓NodeJS能夠在服務(wù)器端開(kāi)發(fā)中大顯身手,很多優(yōu)秀的Javascript工程師向NPM提交了大量高質(zhì)量的第三方功能包唠粥,使得NodeJS的生態(tài)系統(tǒng)迅速發(fā)展疏魏。就像之前Ajax的廣泛應(yīng)用和jQuery及其生態(tài)系統(tǒng)的發(fā)展推動(dòng)前端領(lǐng)域快速發(fā)展一樣。NodeJS的出現(xiàn)及其基于NPM的生態(tài)系統(tǒng)的發(fā)展厅贪,又一次極大的釋放了Javascript的能力蠢护。進(jìn)一步推動(dòng)Javascript朝著工程化、模塊化方向發(fā)展养涮。
隨著Javascript在前后端都開(kāi)始大顯身手葵硕,應(yīng)用的復(fù)雜性開(kāi)始顯著增加眉抬。對(duì)Javascript模塊化的需求也越來(lái)越強(qiáng)烈。出現(xiàn)了基于AMD的RequireJS懈凹,和基于CMD的CommonJS蜀变、SeaJS。在ECMA2016標(biāo)準(zhǔn)里介评,也正式提出了模塊化標(biāo)準(zhǔn)库北。包、模塊等軟件工程的概念在Javascript的工程里出現(xiàn)们陆,隨之而來(lái)的就是對(duì)于項(xiàng)目的依賴管理寒瓦、打包、構(gòu)建等軟件工程工具的需求也應(yīng)運(yùn)而生坪仇。出現(xiàn)了Webpack杂腰、Grunt、Gulp等依賴管理和構(gòu)建工具椅文。
回顧前端從90年代初誕生到現(xiàn)在的發(fā)展歷史喂很,大部分的創(chuàng)新和發(fā)展都集中在Javascript領(lǐng)域。推動(dòng)Javascript發(fā)展的最重要的兩個(gè)階段皆刺,一是Ajax的廣泛應(yīng)用和jQuery及其生態(tài)的發(fā)展少辣,二是NodeJS的廣泛應(yīng)用和NPM生態(tài)的發(fā)展。在這兩個(gè)階段羡蛾,Javascript能力得到了重大升級(jí)漓帅,使得Javascript能夠在更大的舞臺(tái)展現(xiàn)自己。從最開(kāi)始只是在瀏覽器端完成一些簡(jiǎn)單的動(dòng)態(tài)效果林说,到現(xiàn)在能夠被用來(lái)構(gòu)建前后端統(tǒng)一的煎殷,大型的高性能應(yīng)用。我們可以預(yù)見(jiàn)Javascript還有很多發(fā)展空間腿箩。未來(lái)豪直,一方面Javascript會(huì)繼續(xù)在工程化方面加強(qiáng)自己的能力,另一方面珠移,它也會(huì)深刻的影響當(dāng)前主流的開(kāi)發(fā)模式弓乙。我們可以大膽的想象,隨著客戶端計(jì)算能力的增強(qiáng)钧惧,應(yīng)用開(kāi)發(fā)領(lǐng)域完全可能實(shí)現(xiàn)類似Svn到Git的去中心化的升級(jí)暇韧。在每個(gè)客戶端,都是一個(gè)完整的基于Javascript的前后端應(yīng)用浓瞪,各個(gè)客戶端之間互相備份懈玻。