JavaScript生態(tài)圈現(xiàn)狀:初學者地圖

前言
雖然各種框架炸茧、庫發(fā)版之快昧港,但并不會阻止部分人去研究應用。昨天的文章可能帶給你的是一些前端的名詞解釋膨桥,那么今天由@謝麗翻譯的文章可能會給你另一番不同的感受。

正文從這開始~

如果你以前有編程經(jīng)驗唠叛,但是一名前端JavaScript開發(fā)的初學者只嚣,那么一系列的術(shù)語和工具容易引起混淆。我們不會糾纏于細節(jié)的討論艺沼,而是會縱覽當前的“JavaScript生態(tài)圈”册舞。這應該足夠你找準方向,開啟前端開發(fā)之旅障般。

關鍵術(shù)語顯示為粗體调鲸。如果你想跳到可以工作的樣板代碼庫,那么我已經(jīng)將我的一些建議整理成了一個GitHub庫挽荡。

客戶端JavaScript是如何工作的藐石,為什么要使用它?

關鍵術(shù)語:DOM(文檔對象模型)定拟、JavaScript贯钩、async、AJAX

為了編寫高效的前端代碼办素,你需要對如何綜合運用HTML角雷、CSS和JavaScript創(chuàng)建Web頁面有一個基本的了解。

當客戶端(通常是瀏覽器)訪問HTML頁面時性穿,它會下載它勺三,解析它,然后使用它構(gòu)造DOM(文檔對象模型)需曾。JavaScript可以同DOM交互及修改DOM吗坚,交互式站點就是這樣創(chuàng)建的祈远。這里有一個DOM的基本介紹。

JavaScript是如何包含到頁面中的商源?那是另一個復雜的問題车份,但它是以script標簽開始的。

JavaScript的執(zhí)行會阻塞DOM構(gòu)造牡彻。這就是說扫沼,執(zhí)行JavaScript的時間過長會讓人覺得頁面沒響應。為了避免這種情況庄吼,客戶端JavaScript經(jīng)常都是大量使用異步缎除。(你可能聽說過AJAX,它就代表asynchronous JavaScript and XML总寻。)

如果你正在構(gòu)建一個交互式站點器罐,那么你會需要使用JavaScript,你可能會使用這種或另一種方式處理異步渐行。

框架是什么轰坊?我需要使用trendy.js嗎?

關鍵術(shù)語:React祟印、Angular衰倦、Ember、Backbone旁理、jQuery樊零、Underscore、Lodash

“框架”這個詞有許多意思孽文。JavaScript框架的目標通常是減少構(gòu)建交互式Web頁面過程中無謂的工作驻襟。從根本上說,框架就是腳手架芋哭,設計用來解決一個特定種類的問題沉衣。

許多當前流行的框架都是設計用來解決這樣的問題的,“如何創(chuàng)建一個支持復雜用戶交互的單頁Web應用减牺,并在前端管理所有的業(yè)務邏輯豌习?”單頁應用或者SPA是不需要刷新頁面的Web應用,產(chǎn)品的大部分都是作為一個單獨的“頁面”而存在——回想下Facebook首頁或者Gmail收件箱拔疚。

那么該用哪個框架呢肥隆?React? Angular? 還是Ember?甚至說你需要框架嗎?選擇麻痹癥的信號稚失!

所有這些項目都試圖幫你編寫更好的Web應用程序栋艳。對于選擇哪個框架,沒有正確的答案句各,如果有吸占,你就應該使用晴叨。

如果你是剛剛開始使用JavaScript,那么不使用框架可能會更好一些矾屯,嘗試使用jQuery構(gòu)建一個站點兼蕊,其他的少用或不用。那很快就會變得讓人厭煩件蚕,但你能做到孙技,這會讓你了解到一些重要的、有關JavaScript工作原理的東西骤坐。你還可以使用jQuery踐行好的軟件工程準則绪杏。

如果你正在開發(fā)一個相當復雜的站點下愈,那么你會發(fā)現(xiàn)框架很有用纽绍。當前,Angular势似、React和Ember都是流行且明智的選擇拌夏。Backbone是一個相對較小的老式框架;它也適合于許多項目履因。我為本文整理的初學者工具包使用了React障簿,但實際上,沒有錯誤的選擇栅迄。TodoMVC使用不同的框架實現(xiàn)了同一個清單應用程序站故,檢出它,自己比較一下各種框架毅舆。

JavaScript還缺少許多其他語言內(nèi)置的標準庫函數(shù)西篓,像字符串填充或數(shù)組重排。為此憋活,我們通常會使用像jQuery岂津、Underscore和Lodash這樣的庫來彌補這種不足。按照慣例悦即,這些庫在導入后要分別使用$吮成、引用,因此辜梳,如果你看到一個JavaScript文件中有許多美元符號粱甫,幾乎可以肯定這是調(diào)用了jQuery。

如果你要開始一個新項目作瞄,我建議使用React或者Angular以及Lodash魔种。

我應該編寫JavaScript,還是其他的什么粉洼?JavaScript的種類有哪些节预?

關鍵術(shù)語:ES5叶摄、ES6、ES2015安拟、CoffeeScript蛤吓、TypeScript、ClojureScript糠赦、Babel会傲、“轉(zhuǎn)譯(transpiling)”、“編譯(compiling)”拙泽、MDN參考

“JavaScript”實際上并不是一門單獨的語言淌山。每個瀏覽器供應商都實現(xiàn)了自己的JavaScript引擎,由于瀏覽器和版本之間的差別顾瞻,JavaScript飽受碎片化之苦泼疑。CanIUse.com記錄了部分不一致的情況;你也可以查看Mozilla開發(fā)者社群里的文檔荷荤。

ES6又稱 ES2015/Harmony/ECMAScript6/ECMAScript 2015退渗,是JavaScript規(guī)范的最新版本。它引入了新的語法和功能蕴纳。胖箭頭会油、ES6類、本地模塊和模板字符串都是這個JavaScript版本的一部分古毛。Treehouse提供了一份不錯的ES6入門教程翻翩。

雖然JavaScript處于一個碎片化的環(huán)境,但能夠使用新的語言特性也不錯稻薇。因此嫂冻,像Babel這樣的工具會把你閃亮的標準JavaScript代碼轉(zhuǎn)換成一個同舊平臺兼容的版本。這個過程稱為轉(zhuǎn)譯颖低。這同編譯沒有太大的區(qū)別絮吵。使用像Babel這樣的工具,你不必太過擔心特定的瀏覽器是否支持你使用的JavaScript特性忱屑。

轉(zhuǎn)譯工具不只是將ES6 JavaScript轉(zhuǎn)換成ES5蹬敲。還有一些工具可以對JavaScript的變體,如ClojureScript莺戒、TypeScript和CoffeeScript伴嗡,做同樣的事情。ClojureScript是Clojure的一個版本从铲,可以編譯成JavaScript瘪校。TypeScript本質(zhì)上是JavaScript,但有一個類型系統(tǒng)。CoffeeScript同JavaScript非常像阱扬,但有更閃亮的語法泣懊;由CoffeeScript創(chuàng)建的許多語法糖都已經(jīng)被ES6采用,這在很大程度上顯得CoffeeScript不那么有用了麻惶。所有這些都會編譯成普通的JavaScript馍刮。

那么你應該使用什么呢?如果你是前端開發(fā)的初學者窃蹋,那么你也許應該編寫ES6風格的JavaScript卡啰。大部分ES6特性都得到了各瀏覽器供應商的廣泛支持。如果你需要支持相對較老的平臺警没,那么像Babel這樣的工具可以替你將ES6編譯成兼容ES5的JavaScript⌒偃瑁現(xiàn)在先不要考慮閃亮的compile-to-JavaScript選項,如ClojureScript杀迹,不過亡脸,一旦你有了更多的前端開發(fā)經(jīng)驗,那么它們當然值得研究佛南。

如何使用其他人的代碼梗掰?

關鍵術(shù)語:AMD嵌言、commonJS模塊嗅回、ES6模塊、npm摧茴、Github

在JavaScript中绵载,代碼共享和模塊的歷史有一點復雜。我強烈建議你閱讀Preethi Kasireddy的文章“JavaScript模塊入門指南”來了解更多信息苛白。

對于我們而言娃豹,術(shù)語模塊和庫基本上是等價的:它們代表大量的自包含代碼,我們可以在自己的項目中使用及重用购裙。JavaScript模塊一般通過node包管理器npm發(fā)布懂版。你可以在npm或GitHub上搜索JavaScript模塊。

模塊定義(有時稱為模塊語法)有幾種存在競爭關系的方式躏率,主要包括CommonJS躯畴、AMD和ES6原生模塊。CommonJS采用一種同步的薇芝、面向服務器的方法蓬抄。相反,AMD(異步模塊定義)允許你使用異步夯到、非阻塞的方式定義和加載模塊嚷缭。CommonJS和AMD都是在JavaScript沒有原生支持任何模塊或依賴概念的情況下創(chuàng)建的。

ES6增加了原生JavaScript模塊支持,它既支持CommonJS的聲明式語法阅爽,又支持AMD的異步加載路幸,還有其他一些特性。終于付翁,模塊成為現(xiàn)行語言的一部分劝赔。

在工作中,你很可能會遇到所有這三種類型的模塊胆敞。對于新項目着帽,你該應該使用ES6原生模塊。構(gòu)建工具移层,如webpack(下面會介紹)仍翰,會幫助你在現(xiàn)有項目中使用各種類型的模塊。

我需要Node.js嗎观话?

關鍵術(shù)語:Node.js予借、npm、nvm

Node.js是一款編寫服務器端JavaScript的工具频蛔。等一下灵迫,難道我們談論的不只是前端JavaScript嗎?

由于JavaScript模塊通常在打包后通過node包管理器npm分享晦溪,所以你需要安裝Node.js瀑粥,即使你不會把它用于服務器端開發(fā)。在OS X或基于Linux的系統(tǒng)上三圆,最好的方式是通過Node版本管理器nvm狞换,這簡化了不同Node.js版本的管理。Windows用戶應該看下nvm-windows舟肉。

我該用什么構(gòu)建工具修噪?

關鍵術(shù)語:grunt、gulp路媚、bower黄琼、browserify、webpack整慎、“熱重載(hot reloading)”脏款、sourcemap

一個script標簽接一個script標簽地請求將每個JavaScript依賴作為頁面的一部分會很慢。因此院领,大多數(shù)站點都使用所謂的JavaScript bundles弛矛。捆綁過程會獲取所有依賴,并把它們“捆綁”在一起比然,生成一個單獨的文件丈氓,包含到頁面中。根據(jù)需要,有些開發(fā)人員還會使用一個“最小化(minifying)”步驟万俗,將所有不必要的字符從JavaScript代碼中去除湾笛,而又不改變代碼的功能。這可以減少客戶端需要下載的數(shù)據(jù)量闰歪。

有些工具還支持諸如熱重載及sourcemaps這樣的特性嚎研,前者會在你保存一個文件時自動在瀏覽器中更新你的項目,后者提供了一個從捆綁好的JavaScript到其原始形式的映射库倘,簡化了調(diào)試工作临扮。

本質(zhì)上講,我剛剛描述的是一個構(gòu)建過程教翩。不管是否大多數(shù)JavaScript開發(fā)人員都這樣描述杆勇,你都是將代碼編譯成一個生產(chǎn)就緒的格式”ヒ冢“前端devops”或者管理構(gòu)建蚜退、部署工具及依賴項的過程成為一項日益復雜的工作。

Grunt彪笼、gulp钻注、broccoli、brunch配猫、browserify和webpack都是JavaScript構(gòu)建工具幅恋。比較它們非常困難,因為它們每一個都致力于解決不同的問題章姓。它們中有許多使用了不同的抽象概念來討論相同的問題佳遣,我們實在是還沒有一個共用的術(shù)語庫识埋。

根據(jù)我的經(jīng)驗凡伊,開發(fā)人員往往對這些工具的配置文件不甚了解,因此就在項目之間粘來粘去窒舟。下面是我為初學者庫整理的webpack配置文件系忙,供參考:

var webpack = require('webpack');
module.exports = {
    entry: [
        "./app.js"
    ],
    output: {
        path: __ dirname + '/static',
        filename: 'bundle.js'
    },
    module: {
        loaders: [
            { 
                test: /\.js?$/, loader: 'babel-loader', query:{presets:['es2015', 'react']},
                exclude: /node_modules/
            }
        ]
    },
    plugins: []
}

如上,該webpack配置文件指示webpack完成以下工作:

  • 啟動app.js作為入口點惠豺;
  • 處理以.js結(jié)尾的所有文件银还;
  • 使用babel-loader對它們進行轉(zhuǎn)換,尤其是處理ES6轉(zhuǎn)譯(所以es2015 query)和JSX(所以react query)洁墙;
  • 將所有JavaScript文件捆綁成一個文件static/bundle.js蛹疯。

對于新項目,我推薦webpack热监。它有很強的適應性捺弦,而且能夠很好地處理具有復雜依賴圖的大型項目。

我如何測試代碼?

關鍵術(shù)語:Mocha列吼、Jasmine幽崩、Chai、Tape寞钥、Karma慌申、Selenium、phantomjs

同許多其他類型的編程一樣理郑,前端JavaScript可以從測試中獲益蹄溉。大多數(shù)JavaScript開發(fā)人員都表示,他們至少會編寫部分測試您炉。

JavaScript缺少一種內(nèi)置的框架用于運行測試类缤,因此,開發(fā)人員需要依賴外部庫邻吭。不同的測試工具致力于問題的不同方面餐弱,這點同JavaScript構(gòu)建系統(tǒng)非常像。

Mocha和Jasmine是兩個流行的庫囱晴,有時候稱為測試框架膏蚓,可以幫助你編寫測試。他們的API十分類似畸写;你描述應該出現(xiàn)的行為驮瞧,然后使用斷言測試它。

describe('helloWorld()', function(){
   it('should greet me by name', function(){
        // assertions go here
   }); 
});

Mocha實際上沒有內(nèi)置斷言庫枯芬,因此论笔,大多數(shù)開發(fā)人員都會將它同Chai結(jié)合使用。它們的斷言語法類似:

// Jasmine
expect(helloWorld("Bonnie")).toEqual("Hello, Bonnie");

// Chai
expect(helloWorld("Bonnie")).to.equal("Hello, Bonnie");

為了運行測試千所,Mocha提供了一個命令行工具狂魔,而Jasmine沒有。許多開發(fā)人員使用Karma淫痰,這是一個測試執(zhí)行器最楷,既可以運行Jasmine風格的測試,也可以運行Mocha風格的測試待错。

那很適合單元測試籽孙;對于基于JavaScript的集成測試,我們需要更多工具火俄。在前端領域犯建,集成測試通常涉及使用一個瀏覽器實際地渲染和加載頁面,模擬用戶交互瓜客,并檢查結(jié)果适瓦。

Selenium是一個Web驅(qū)動程序沟启,通常可以用于這些測試犹菇。你需要為Selenium配備一個瀏覽器驅(qū)動程序德迹,以便它能夠啟動瀏覽器。PhantomJS是一個所謂的無頭瀏覽器——它運行時沒有圖形用戶界面——通常用于測試中揭芍。由于它們不需要GUI胳搞,所以無頭瀏覽器對自動化測試而言非常有用。你可能會發(fā)現(xiàn)Sinon有用称杨;它提供了一個模擬服務器肌毅,可以用于模擬AJAX請求的響應。

你還可以設置JavaScript測試同持續(xù)集成(CI)系統(tǒng)一起運行姑原,如Jenkins或Travis悬而。

JavaScript測試工具有大量堪稱完美的選擇。對于新項目锭汛,我常常選擇Karma和Jasmine笨奠,并使用PhantomJS作為測試瀏覽器,但Mocha + Chai也是一個不錯的選擇唤殴。

那么我如何入手呢般婆?

我整理了一個GitHub庫,里面包含一個基本的前端開發(fā)配置:https://github.com/wzxm/react-starter.git朵逝。

它使用:

  • React蔚袍;
  • Babel轉(zhuǎn)譯;
  • Webpack構(gòu)建配名;
  • ES6語法(針對React類和模塊導出)啤咽;
  • Karma + Jasmine + PhantomJS測試;

讓我們稍微詳細地討論下渠脉。React是我們使用的框架宇整,它讓我們可以更輕松地創(chuàng)建交互式站點。(你描述UI连舍,React會為你渲染并處理DOM操作没陡。)我們將編寫符合ES6規(guī)范的JavaScript代碼。Webpack會使用Babel將ES6 JavaScript代碼轉(zhuǎn)譯成兼容ES5的JavaScript代碼索赏。Webpack還會管理依賴和模塊導入。最后贴彼,我們使用Karma和PhantomJS運行測試潜腻,并使用Jasmine庫編寫這些測試。

首先器仗,確保你有一個可用的npm版本融涣。然后童番,安裝這個GitHub庫的依賴,并開始使用:

npm install
webpack

然后威鹿,使用它進行開發(fā)剃斧,運行:

webpack --watch

這會指示webpack監(jiān)視項目,并在JavaScript文件變化時重新編譯它忽你。想要查看應用程序幼东,就需要啟動一個本地服務器。在OS X或Linux上科雳,使用Python很容易做到:

python -m SimpleHTTPServer

……你已經(jīng)準備好開始了!編輯app.js或Hello.js增加更多的React組件根蟹,并使用npm test來運行測試。

當然糟秘,有一個可以工作的初始代碼庫只是成功的一半简逮。前端JavaScript開發(fā)領域很復雜,有大量的工具尿赚、術(shù)語以及新概念需要學習散庶,同時也有大量的問題需要解決。上述任意一個主題都很容易寫滿一個博客凌净。希望這篇文章能讓你對JavaScript生態(tài)圈有一些了解督赤,能在你學習更多有關前端開發(fā)的知識時提供一些指導。

最后
對全局引導類的文章泻蚊,在我看來還是有一定的幫助躲舌,至少讓你知道了原來還有這個東西,猶如很多構(gòu)建工具的依賴包一樣性雄,當你需要了没卸,你可以立馬學習并使用它。有新東西出來并不可怕秒旋,說明前端社區(qū)至少還是很活躍约计,大家選擇入前端坑還是沒錯的。以自己的思考去選擇適合自己的也是蠻有學問的事情迁筛。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末煤蚌,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子细卧,更是在濱河造成了極大的恐慌尉桩,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贪庙,死亡現(xiàn)場離奇詭異蜘犁,居然都是意外死亡,警方通過查閱死者的電腦和手機止邮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進店門这橙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來奏窑,“玉大人,你說我怎么就攤上這事屈扎“Nǎ” “怎么了?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵鹰晨,是天一觀的道長墨叛。 經(jīng)常有香客問我,道長并村,這世上最難降的妖魔是什么巍实? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮哩牍,結(jié)果婚禮上棚潦,老公的妹妹穿的比我還像新娘。我一直安慰自己膝昆,他們只是感情好丸边,可當我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著荚孵,像睡著了一般妹窖。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上收叶,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天骄呼,我揣著相機與錄音,去河邊找鬼判没。 笑死蜓萄,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的澄峰。 我是一名探鬼主播嫉沽,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼俏竞!你這毒婦竟也來了绸硕?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤魂毁,失蹤者是張志新(化名)和其女友劉穎玻佩,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體漱牵,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡夺蛇,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了酣胀。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片刁赦。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖闻镶,靈堂內(nèi)的尸體忽然破棺而出甚脉,到底是詐尸還是另有隱情,我是刑警寧澤铆农,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布牺氨,位于F島的核電站,受9級特大地震影響墩剖,放射性物質(zhì)發(fā)生泄漏猴凹。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一岭皂、第九天 我趴在偏房一處隱蔽的房頂上張望郊霎。 院中可真熱鬧,春花似錦爷绘、人聲如沸书劝。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽购对。三九已至,卻和暖如春陶因,著一層夾襖步出監(jiān)牢的瞬間骡苞,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工楷扬, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留解幽,地道東北人。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓毅否,卻偏偏與公主長得像亚铁,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子螟加,可洞房花燭夜當晚...
    茶點故事閱讀 43,486評論 2 348

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