☆前端技術(shù)全景展望

前言

如果你正在進(jìn)行前端項(xiàng)目的技術(shù)選型,可能就會(huì)發(fā)現(xiàn)灿椅,你已經(jīng)跟不上前端生態(tài)的變化了,甚至令你眼花繚亂,因?yàn)楝F(xiàn)在有太多的技術(shù)棧供你選擇:React茫蛹、Flux操刀、Angular、Aurelia婴洼、Mocha骨坑、Jasmine、Babel窃蹋、TypeScript卡啰、Flow、Vue...這些技術(shù)棧的出現(xiàn)試圖前端開(kāi)發(fā)變得簡(jiǎn)單化警没、模塊化匈辱、工程化,但有一部分卻增加了學(xué)習(xí)成本和項(xiàng)目維護(hù)的不穩(wěn)定性杀迹,因?yàn)榧夹g(shù)棧的變化速度太快了亡脸。

由于 JavaScript 的語(yǔ)法很簡(jiǎn)單,前端入門比較簡(jiǎn)單树酪,基本上少則數(shù)周就可以開(kāi)發(fā)項(xiàng)目了浅碾,但要學(xué)習(xí)提升成為一名優(yōu)秀的前端的工程師又極其不易,因?yàn)樯婕暗募夹g(shù)點(diǎn)很多续语,如:grunt / gulp, npm, requre.js / seajs 等輔助性技術(shù)垂谢;學(xué)習(xí) prototype / _proto_等較晦澀的語(yǔ)法知識(shí);掌握 MVC / MVP / MVVM 等設(shè)計(jì)模式疮茄;Backbone.js / Vue.js / React / AngularJS 等框架滥朱;jQuery / Protorype / lodash等庫(kù)。

所以力试,我們往往需要閱讀很多書(shū)籍才能理解前端技術(shù)的知識(shí)體系徙邻。本文將在前端知識(shí)體系上進(jìn)行總結(jié)和梳理,涵蓋了前端技術(shù)絕大部分的知識(shí)內(nèi)容畸裳,會(huì)講解前端技術(shù)的幾條重要的演進(jìn)路線缰犁,希望起到一個(gè)啟蒙作用,能幫助讀者快速把握前端技術(shù)的整個(gè)脈絡(luò)怖糊,培養(yǎng)更完善的體系化思維帅容。

疑惑

一些初學(xué)者大多都有這樣的想法:我現(xiàn)在可以用 JavaScript 編寫程序了,并且也正常上線了伍伤,而且運(yùn)行的也不錯(cuò)丰嘉,為什么我要再花額外的時(shí)間學(xué)習(xí)這些技術(shù)棧呢?

上述這些技術(shù)棧是為了彌補(bǔ) JavaScript 在開(kāi)發(fā)大型項(xiàng)目時(shí)的短板嚷缭。

JavaScript 作為前端開(kāi)發(fā)領(lǐng)域中最重要的語(yǔ)言,難道無(wú)法勝任現(xiàn)在的大型項(xiàng)目開(kāi)發(fā)嗎?如果要尋求這個(gè)答案阅爽,需要我們重新認(rèn)識(shí) JavaScript 的前世今生路幸。

前世

JavaScript 在創(chuàng)造初期用來(lái)( 腳本形式 )彌補(bǔ)網(wǎng)頁(yè)開(kāi)發(fā)的不足。在那個(gè)時(shí)代付翁,JavaScript 作為諸如: ASP / JSP 等開(kāi)發(fā)語(yǔ)言的輔助功能存在简肴,經(jīng)常使用的場(chǎng)景( 之一 ) 就是 『表單驗(yàn)證』。雖然 JavaScript 的締造者 Brendan Eich 大神早已 『洞悉』了未來(lái)百侧,但也無(wú)法阻擋 JavaScript 只花 10天 創(chuàng)造出來(lái)的事實(shí)砰识。( 第一版 )那個(gè)時(shí)代,還沒(méi)有一個(gè)專門從事 JavaScript 開(kāi)發(fā)的職位佣渴,前端開(kāi)發(fā)先驅(qū)們將更多的精力放在了 『瀏覽器大戰(zhàn)』 之后的兼容性問(wèn)題上辫狼。

發(fā)展

瀏覽器大戰(zhàn)之后的另外一個(gè)影響,就是推動(dòng)了 JavaScript 成為國(guó)際化標(biāo)準(zhǔn)辛润,即:ECMAScript(歐洲標(biāo)準(zhǔn)化組織ECMA(European Computer Manufacturers Association))膨处,后者用來(lái)描述 JavaScript 的語(yǔ)法結(jié)構(gòu),并推動(dòng)它的發(fā)展砂竖,前者只是后者的實(shí)現(xiàn)方案真椿。

備注:另外一個(gè) ECMAScript 實(shí)現(xiàn)方案是 ActionScript 3.0

今生

隨著 Chrome 這種現(xiàn)代瀏覽器的出現(xiàn),其背后的 JavaScript 解析器(V8)大大增強(qiáng)了 JavaScript 的執(zhí)行速度/效率乎澄。(在 V8 的基礎(chǔ)上突硝,另外一位大神 Ryan Dahl 發(fā)明了 Node.js,將本來(lái)僅僅運(yùn)行在瀏覽器端的語(yǔ)言置济,發(fā)展到了后端開(kāi)發(fā)解恰。)jQuery 的誕生,使前端開(kāi)發(fā)先驅(qū)們抽離出『瀏覽器兼容性問(wèn)題的泥沼』舟肉,有更多的精力來(lái)思考 JavaScript 的未來(lái)修噪。網(wǎng)絡(luò)帶寬的增大以及 Ajax 技術(shù)的出現(xiàn),使網(wǎng)頁(yè)具有異步更新的方式路媚,大大的加快了由傳統(tǒng) B/S 架構(gòu)向 C/S 架構(gòu)的探索黄琼,Google Gmail 的成功進(jìn)一步推動(dòng)此項(xiàng)技術(shù)成為大型項(xiàng)目的可能性。最終出現(xiàn)了SPA( Single Page Application:?jiǎn)雾?yè)面應(yīng)用程序 )整慎,至此使用 JavaScript 開(kāi)發(fā)大型項(xiàng)目成為一種趨勢(shì)和標(biāo)準(zhǔn)脏款。

短板

由于 ECMAScript 推動(dòng)著 JavaScript 的發(fā)展,即便 JavaScript 是上世紀(jì)的產(chǎn)物裤园,但使用它開(kāi)發(fā)一個(gè)小型的前端項(xiàng)目撤师,其實(shí)并不困難。但是拧揽,一個(gè)大型的 SPA 項(xiàng)目往往具有N個(gè)外部引用類庫(kù)剃盾,數(shù)十個(gè)(甚至更多)js/html/css/圖片 等資源組成腺占;多人參與長(zhǎng)時(shí)間維護(hù),成千上萬(wàn)行的代碼的特點(diǎn)痒谴。顯然衰伯,這些都是 JavaScript 在最初時(shí)所沒(méi)有考慮過(guò)的情況。

正如前文描述积蔚,技術(shù)棧彌補(bǔ)了JavaScript 在開(kāi)發(fā)大型項(xiàng)目上的短板意鲸,所以為了更加清晰的分析技術(shù)棧的特點(diǎn),先從問(wèn)題入手尽爆,一個(gè)大型的 JavaScript 項(xiàng)目通常需要解決哪些問(wèn)題怎顾?

  1. JavaScript先天不具有包管理功能
    這并沒(méi)有阻礙我們偉大的前端開(kāi)發(fā)先驅(qū)們的探索,npm漱贱,bower 這類技術(shù)棧為我們解決了包管理問(wèn)題槐雾。

  2. 過(guò)多的代碼導(dǎo)致的項(xiàng)目更新,迭代饱亿,重構(gòu)難題
    既然代碼過(guò)多蚜退,就需要使用諸如:封裝,繼承等現(xiàn)代化編程語(yǔ)言的面向?qū)ο缶幊谭绞奖肓km然 JavaScript 締造初期并不是解決這些問(wèn)題的钻注,但 Brendan Eich 大神顯然預(yù)見(jiàn)了未來(lái),即在初版的 JavaScript 語(yǔ)言中配猫,就包含了 OO 思想幅恋。換言之,JavaScript 是基于對(duì)象的開(kāi)發(fā)語(yǔ)言泵肄。
    雖然都是面向?qū)ο罄唬?JavaScript 與傳統(tǒng)的面向?qū)ο蟛惶粯樱褂昧?strong>更高級(jí)但晦澀的繼承鏈方式腐巢,這就是我們需要理解 prototype / _proto_ 這些技術(shù)棧的原因品追。

  3. 多人參與,開(kāi)發(fā)的職責(zé)區(qū)分困難
    由于大型 SPA 項(xiàng)目的出現(xiàn)冯丙,頁(yè)面不僅承載了用戶行為肉瓦,更多的是將后端主導(dǎo)的邏輯開(kāi)發(fā)也帶到了前端。原本 MVC 中的 『M』比任何以往都要『重』胃惜,以至于在 『M』層泞莉,又形成了新的框架理論。因此了解并掌握 MVC / MVP / MVVM 等設(shè)計(jì)模式就變成了必要手段船殉,進(jìn)而前端框架開(kāi)始流行鲫趁。與其它語(yǔ)言一樣,選用現(xiàn)成的前端框架自然變成了趨勢(shì)利虫,這些現(xiàn)代化框架的『設(shè)計(jì)思想』包含了前端開(kāi)發(fā)新穎的理念挨厚, 如:操作虛擬 DOM( Virtual DOM )的 React堡僻;單純的踐行 MVC 理論的 Backbone.js;MVVM 風(fēng)格的 AngularJS疫剃;等苦始。學(xué)習(xí)并掌握前端框架可以更好的區(qū)分職責(zé),而框架統(tǒng)一的 API 實(shí)現(xiàn)了長(zhǎng)時(shí)間多人開(kāi)發(fā)/維護(hù)的可能性慌申。

  4. 雖然網(wǎng)絡(luò)帶寬得到了很大的提高,但頁(yè)面的加載速度仍是問(wèn)題
    由于SPA 是單頁(yè)面應(yīng)用理郑,因此頁(yè)面在加載的時(shí)候幾乎包含了全部功能蹄溉,但用戶往往卻只使用其中的一部分,所以網(wǎng)速的限制您炉,帶寬的浪費(fèi)柒爵,用戶的等待則是另一個(gè)難題。『模塊化開(kāi)發(fā)』 是解決這類難題的銀彈赚爵,而 AMD / CMD 的理論自然成為前端開(kāi)發(fā)者們掌握的必要知識(shí)棉胀,而 requre.js / seajs 則是這些理論的具體實(shí)現(xiàn)方式。由于 Http 的特性所致 ( 分散的冀膝,小的靜態(tài)資源在加載的時(shí)候更慢 )唁奢,因此 合并/壓縮 則是另外一個(gè)解決方案,因此也產(chǎn)生了一個(gè)新的問(wèn)題窝剖,即第五個(gè)問(wèn)題麻掸。

  5. 靜態(tài)資源( html/js/css/圖片等資源 )過(guò)多導(dǎo)致上線時(shí)的重復(fù)性工作量增大
    當(dāng)這類靜態(tài)資源很少的時(shí)候,手動(dòng) 合并/壓縮 并沒(méi)有問(wèn)題赐纱,反之這些資源呈指數(shù)上升的時(shí)候脊奋,手動(dòng)方案顯示不是一個(gè)好辦法。自動(dòng)化方案 的引入勢(shì)在必行疙描,而其中踐行者:grunt / gulp / webpack 就需要掌握了诚隙。

不掌握這些技術(shù)也可以實(shí)現(xiàn) JavaScript 開(kāi)發(fā),但掌握了這些技術(shù)椘鹨龋可以使我們從 『繁重 / 繁瑣』的事務(wù)中抽離出來(lái)久又,更加 『專注于業(yè)務(wù)邏輯』。所以待错,恭喜你籽孙,歡迎來(lái)到新世界!;鸲怼犯建!

歡迎來(lái)到新世界!9峡汀适瓦!

上述列舉的知識(shí)點(diǎn)僅僅屬于前端技術(shù)棧的一部分竿开,除此以外還包括了:調(diào)試/測(cè)試,性能優(yōu)化玻熙,CSS預(yù)編譯方式否彩,編碼規(guī)則,SEO嗦随,移動(dòng) Web 開(kāi)發(fā)等列荔。

掌握這些技術(shù)后就萬(wàn)事無(wú)憂了嗎?當(dāng)然不枚尼,隨著前端開(kāi)發(fā)的發(fā)展贴浙,總有一天,這些技術(shù)仍無(wú)法滿足開(kāi)發(fā)署恍。所以要了解這些技術(shù)棧背后的理論邏輯崎溃,以不變應(yīng)萬(wàn)變,方為制勝之道盯质!

技術(shù)全景

轉(zhuǎn)自《現(xiàn)代前端技術(shù)解析》一書(shū)

基礎(chǔ)技術(shù)

基礎(chǔ)技術(shù)

技術(shù)演進(jìn)

對(duì)于前端技術(shù)的演進(jìn)過(guò)程袁串,主要都是為了解決前端在大型項(xiàng)目開(kāi)發(fā)過(guò)程中遇到的問(wèn)題,比如:包管理呼巷、模塊開(kāi)發(fā)囱修、多人協(xié)作、資源管理朵逝、打包構(gòu)建蔚袍、頁(yè)面加載等方面的問(wèn)題,其演進(jìn)過(guò)程主要分為5條主線:JS編程語(yǔ)言配名、CSS編程語(yǔ)言啤咽、JavaScript模塊化、前端分層模式渠脉、前端自動(dòng)構(gòu)建宇整。

演進(jìn) 過(guò)程 目標(biāo) 文章
JS編程語(yǔ)言 JavaScript、TypeScript芋膘、CoffeeScript鳞青、ES5、ES6为朋、Babel轉(zhuǎn)碼器臂拓、Traceur 轉(zhuǎn)碼器 使得 JavaScript 語(yǔ)言可以用來(lái)編寫復(fù)雜的大型應(yīng)用程序,成為企業(yè)級(jí)開(kāi)發(fā)語(yǔ)言 文章待續(xù)
包依賴管理 Bower习寸、npm胶惰、Browserify 為了解決JavaScript沒(méi)有包管理系統(tǒng)。不能自動(dòng)加載和安裝依賴問(wèn)題 文章待續(xù)
CSS編程語(yǔ)言 Sass霞溪、LESS和Stylus 使我們可以用編程思想來(lái)編寫CSS孵滞,并可以幫助我們快速編譯代碼中捆,及更好進(jìn)行前端項(xiàng)目的維護(hù) 文章待續(xù)
JavaScript模塊化 CommonJs (Node.js)、AMD (RequireJS)坊饶、CMD (SeaJS)泄伪、UMD 為了解決JavaScript沒(méi)有模塊系統(tǒng)的問(wèn)題,減少命名沖突匿级,消除全局變量蟋滴;一個(gè)模塊一個(gè)文件,組織更清晰痘绎;依賴自動(dòng)加載脓杉,按需加載 文章待續(xù)
前端分層模式 MVC、MVP简逮、MVVM 為了解決前端邏輯越來(lái)越重,越來(lái)越復(fù)雜尿赚,路由不好掌控散庶,復(fù)雜前端情況下模塊化JS、多人協(xié)作等問(wèn)題 文章待續(xù)
前端自動(dòng)構(gòu)建 Grunt凌净、Gulp悲龟、Webpack、Yeoman 為了解決前端開(kāi)發(fā)中預(yù)處理冰寻、風(fēng)格與測(cè)試须教、資源壓縮、靜態(tài)資源替換斩芭、模塊化處理轻腺、性能優(yōu)化等問(wèn)題 文章待續(xù)

參考資料

  1. 現(xiàn)代前端技術(shù)解析目錄
  2. 現(xiàn)代前端開(kāi)發(fā)技術(shù)棧
  3. 統(tǒng)一回復(fù)《怎么學(xué)JavaScript?》
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末划乖,一起剝皮案震驚了整個(gè)濱河市贬养,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌琴庵,老刑警劉巖误算,帶你破解...
    沈念sama閱讀 218,122評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異迷殿,居然都是意外死亡儿礼,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門庆寺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)蚊夫,“玉大人,你說(shuō)我怎么就攤上這事止邮≌獬龋” “怎么了奏窑?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,491評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)屈扎。 經(jīng)常有香客問(wèn)我埃唯,道長(zhǎng),這世上最難降的妖魔是什么鹰晨? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,636評(píng)論 1 293
  • 正文 為了忘掉前任墨叛,我火速辦了婚禮,結(jié)果婚禮上模蜡,老公的妹妹穿的比我還像新娘漠趁。我一直安慰自己,他們只是感情好忍疾,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布闯传。 她就那樣靜靜地躺著,像睡著了一般卤妒。 火紅的嫁衣襯著肌膚如雪甥绿。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,541評(píng)論 1 305
  • 那天则披,我揣著相機(jī)與錄音共缕,去河邊找鬼。 笑死士复,一個(gè)胖子當(dāng)著我的面吹牛图谷,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播阱洪,決...
    沈念sama閱讀 40,292評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼便贵,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了冗荸?” 一聲冷哼從身側(cè)響起嫉沽,我...
    開(kāi)封第一講書(shū)人閱讀 39,211評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎俏竞,沒(méi)想到半個(gè)月后绸硕,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,655評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡魂毁,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評(píng)論 3 336
  • 正文 我和宋清朗相戀三年玻佩,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片席楚。...
    茶點(diǎn)故事閱讀 39,965評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡咬崔,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情垮斯,我是刑警寧澤郎仆,帶...
    沈念sama閱讀 35,684評(píng)論 5 347
  • 正文 年R本政府宣布,位于F島的核電站兜蠕,受9級(jí)特大地震影響扰肌,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜熊杨,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評(píng)論 3 329
  • 文/蒙蒙 一曙旭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧晶府,春花似錦桂躏、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,894評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至较沪,卻和暖如春进倍,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背购对。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,012評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留陶因,地道東北人骡苞。 一個(gè)月前我還...
    沈念sama閱讀 48,126評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像楷扬,于是被迫代替她去往敵國(guó)和親解幽。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容