現(xiàn)代JavaScript開(kāi)發(fā)者的工具箱
自從HTML5變得流行以來(lái),整個(gè)Web平臺(tái)取得了長(zhǎng)足的進(jìn)步,人們也開(kāi)始將JavaScript視為一門(mén)能夠創(chuàng)建復(fù)雜應(yīng)用的語(yǔ)言。許多新的API紛紛浮現(xiàn),而關(guān)于瀏覽器如何應(yīng)用這些技術(shù)的文章也大量涌現(xiàn)。
這一系列文章的 視角更進(jìn)一步,它們將關(guān)注于如何在實(shí)踐中應(yīng)用這些強(qiáng)大的技術(shù),這并不是指創(chuàng)建多么酷炫的示例和原型,而是在第一線(xiàn)進(jìn)行實(shí)際應(yīng)用。在這個(gè)(后)HTML5系 列文章中,我們不需要響亮的口號(hào),而是基于行業(yè)專(zhuān)家的實(shí)際經(jīng)驗(yàn),獲得實(shí)踐性的見(jiàn)解。我們也將討論那些更進(jìn)一步的技術(shù)(例如AngularJS),并對(duì) web標(biāo)準(zhǔn)和web開(kāi)發(fā)的未來(lái)進(jìn)行定義。
作 為一門(mén)腳本語(yǔ)言,JavaScript最初創(chuàng)建的目的是用于增強(qiáng)web頁(yè)面的表現(xiàn)能力,而現(xiàn)如今JavaScript幾乎已經(jīng)用在所有你能想到的地方了。 隨著整個(gè)業(yè)界的技術(shù)能力不斷提高,JavaScript如今已經(jīng)可以在服務(wù)端運(yùn)行,同時(shí)也能夠被編譯為原生手機(jī)應(yīng)用的代碼。當(dāng)今的JavaScript開(kāi)發(fā)者都 是整個(gè)豐富生態(tài)圈中的一份子,他們可以在幾百種IDE、工具和框架中進(jìn)行隨意選擇。由于各種選擇和資源的數(shù)量實(shí)在太多,某些開(kāi)發(fā)者也會(huì)感到不知從哪里開(kāi)始 學(xué)習(xí)。我很樂(lè)于討論并概述一下現(xiàn)代JavaScript開(kāi)發(fā)者所面臨的處境,首先我將簡(jiǎn)要的介紹一下JavaScript的歷史,隨后會(huì)涵蓋目前最流行的 一些框架、工具和IDE。
快速回顧歷史
讓 我們開(kāi)始一次快速的旅行。時(shí)間回到1995年,當(dāng)時(shí)Netscape Navigator和Internet Explorer 1.0是瀏覽器方面僅有的選擇。網(wǎng)站上充斥著各種煩人的閃爍文字以及太多的GIF圖片。要通過(guò)撥號(hào)網(wǎng)絡(luò)加載一個(gè)包含了大量豐富內(nèi)容的頁(yè)面,最多需要等待整 整兩分鐘時(shí)間。隨后出現(xiàn)了一種web語(yǔ)言,它允許這些古老的網(wǎng)站執(zhí)行客戶(hù)端的代碼。這一年正是JavaScript所誕生的年份。
創(chuàng) 建于20年之前的這些網(wǎng)站對(duì)于JavaScript的使用并不多,當(dāng)然也沒(méi)有充分發(fā)掘這門(mén)語(yǔ)言的潛力。偶爾會(huì)通過(guò)彈出對(duì)話(huà)框告訴你某些信息,或是在某個(gè)方 框中通過(guò)滾動(dòng)文字的方式顯示新聞,或是用cookie保存你的用戶(hù)名,以便當(dāng)你經(jīng)過(guò)幾個(gè)月后再來(lái)訪(fǎng)問(wèn)這個(gè)網(wǎng)站時(shí)能夠直接顯示出你的名字。職場(chǎng)中當(dāng)然也不存 在任何以JavaScript作為主要開(kāi)發(fā)語(yǔ)言的工作職位,當(dāng)時(shí)能夠在工作中真正編寫(xiě)一些JavaScript以及是非常幸運(yùn)了??傊?,當(dāng)時(shí)的網(wǎng)站對(duì)于 JavaScript的應(yīng)用就是在DOM中玩一些小花招。
如今,你基本上已經(jīng)可以在所有地方看到JavaScript的身影了。從Bootstrap到ReactJS、Angular、通用的jQuery,甚至是運(yùn)行在服務(wù)端的Node.js,JavaScript已經(jīng)成為了最重要、最流行的web語(yǔ)言之一。
框架
自 從問(wèn)世以來(lái),JavaScript的改動(dòng)的最大方面之一就是對(duì)于它的應(yīng)用方式。調(diào)用那些尷尬的document.GetElementById方法和創(chuàng)建 繁重的XmlHttpRequest對(duì)象的日子已經(jīng)一去不復(fù)返了。取而代之的方式,是通過(guò)各種幫助性的類(lèi)庫(kù)對(duì)這些基本功能進(jìn)行抽象,讓 JavaScript更易于為開(kāi)發(fā)者使用。這也正是如今JavaScript隨處可見(jiàn)的主要原因之一。
jQuery
jQuery是由John Resig在2006年推出的,它提供了一套豐富的工具集,對(duì)各種隱晦的、神秘的JavaScript命令與方法進(jìn)行了抽象與簡(jiǎn)化。展示這一工具最簡(jiǎn)單的方式莫過(guò)于代碼示例了。
使用純粹的JavaScript創(chuàng)建一個(gè)AJAX請(qǐng)求:
function loadXMLDoc { var xmlhttp; if (window.XMLHttpRequest) { // code for IE7+, Firefox, Chrome, Opera, Safari xmlhttp = new XMLHttpRequest; } else { // code for IE6, IE5 xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); } xmlhttp.onreadystatechange = function { if (xmlhttp.readyState == 4 ) { if(xmlhttp.status == 200){ alert("success"); } else if(xmlhttp.status == 400) { alert("error 400") } else { alert("something broke") } } } xmlhttp.open("GET", "test.html", true); xmlhttp.send; }
而使用jQuery創(chuàng)建AJAX請(qǐng)求:
$.ajax({ url: "test.html", statusCode: { 200: function { alert("success"); }, 400: function { alert("error 400"); } }, error: function { alert("something broke"); } });
jQuery使得復(fù)雜的JavaScript函數(shù)變得方便使用,DOM操作更是小菜一碟。從結(jié)果上說(shuō),jQuery成為了最早的一批被廣泛使用的JavaScript框架,其中對(duì)JavaScript進(jìn)行抽象的思想則成為了其它各種框架構(gòu)建的基礎(chǔ)。
AngularJS
AngularJS 通常也被稱(chēng)為“Augular”,于2009年登臺(tái)亮相。它是由Google創(chuàng)建的一種框架,目標(biāo)是為了簡(jiǎn)化單一頁(yè)面應(yīng)用(SPA)的創(chuàng)建。類(lèi)似于 jQuery,它的目標(biāo)同樣是將復(fù)雜的操作抽象成為具有高度重用性的方法。它為JavaScript提供了一種模型-視圖-控制器(MVC)的架構(gòu)。
ReactJS
ReactJS通常也被稱(chēng)為“React”,是一個(gè)剛剛在這場(chǎng)游戲中登場(chǎng)的新手。它由Facebook創(chuàng) 建,并在2013年首次發(fā)布。Facebook認(rèn)為React在處理SPA問(wèn)題上可以成為Angular的替代品,因此如果你認(rèn)為Angular和 React這兩種框架是競(jìng)爭(zhēng)對(duì)手,那你的理解就對(duì)了。不過(guò),與Angular相比,React最大的不同之處在于,它是一個(gè)更高效、具有更高性能、速度更 快的類(lèi)庫(kù)。下圖展示了使用React、Angular、Knockout(另一種類(lèi)庫(kù),在本文中不做討論),以及純粹的JavaScript在DOM中渲 染包含1000個(gè)內(nèi)容的列表,各自所需的時(shí)間:
如果你的應(yīng)用非常看重性能,那么React就是正確的選擇。
#p#
JavaScript開(kāi)發(fā)環(huán)境
對(duì)于高效的開(kāi)發(fā)來(lái)說(shuō),IDE的使用是非常重要的。IDE的全名是集成開(kāi)發(fā)環(huán)境,是一種為開(kāi)發(fā)者提供了一系列工具的應(yīng)用程序。這種工具中最重要的一部分通常來(lái)說(shuō)是一個(gè)富文本編輯器,通常會(huì)為使用者提供語(yǔ)法高亮、自動(dòng)完成和鍵盤(pán)快捷鍵,以加速各種煩人的手動(dòng)操作。
Sublime Text實(shí)際上并不是一種IDE,而是一個(gè)輕量級(jí)的、速度飛快的用于編程的文本編輯器,提供了語(yǔ)法高亮功能和直觀(guān)的鍵盤(pán)快捷鍵。它本身是跨平臺(tái)的,因此對(duì)于那些想在PC環(huán)境中使用Mac(或者反之)的開(kāi)發(fā)者來(lái)說(shuō)是理想的選擇。
Sublime Text的每個(gè)部分幾乎都是可以進(jìn)行自定義的,它還提供了多種插件,為它加入了類(lèi)似于IDE的功能,例如和Git的集成,以及代碼整理。對(duì)于 JavaScript的愛(ài)好者和新手開(kāi)發(fā)者來(lái)說(shuō),它是一個(gè)很好的選擇。當(dāng)本文發(fā)布時(shí),每個(gè)Sublime Text授權(quán)的價(jià)格為70美金。
WebStorm是由JetBrains團(tuán)隊(duì)開(kāi)發(fā)的一種智能IDE,主要專(zhuān)注于HTML、CSS和 JavaScript的開(kāi)發(fā)。它只收取象征性的授權(quán)費(fèi)用(在本文發(fā)布時(shí)為49美金),在有經(jīng)驗(yàn)的JavaScript專(zhuān)家之間,它得到了廣泛的認(rèn)可,并已 經(jīng)被視為事實(shí)上的標(biāo)準(zhǔn),這一點(diǎn)不無(wú)道理,因?yàn)樗鼉?nèi)置的代碼完成功能和審查工具可以說(shuō)是獨(dú)一無(wú)二的。WebStorm中也提供了一個(gè)豐富的 JavaScript調(diào)試器,并且與各種流行的單元測(cè)試框架進(jìn)行了集成,例如Karma測(cè)試執(zhí)行器和JSDriver,甚至還包括支持Node.js的 Mocha。
WebStorm最優(yōu)秀的特性之一莫過(guò)于它的實(shí)時(shí)編輯(Live Edit)功能了。只要在Chrome和WebStorm中同時(shí)安裝某個(gè)插件,開(kāi)發(fā)者就可以在變更代碼的同時(shí),直接在瀏覽器中看到結(jié)果。開(kāi)發(fā)者還可以對(duì)實(shí) 時(shí)編輯進(jìn)行配置,讓瀏覽器窗口中的變更高亮顯示,這極大地提升了調(diào)試與編碼的生產(chǎn)力。
總的來(lái)說(shuō),如果JavaScript是你的全職工作,那么WebStorm這個(gè)IDE可以成為一個(gè)很好的選擇。
Brackets
Brackets是一種開(kāi)源的 免費(fèi)IDE,專(zhuān)注于可視化工具。Brackets提供了一種類(lèi)似于WebStorm的實(shí)時(shí)編輯特性,讓你可以在瀏覽器窗口中直接看到代碼改變的結(jié)果。它還 支持并行式的編輯,讓你一邊進(jìn)行編碼工作,同時(shí)直接看到代碼的結(jié)果,而無(wú)需在不同的應(yīng)用程序間進(jìn)行切換,或是使用彈出窗口。Brackets中最有趣的一 個(gè)特性叫做抽取(Extract),它能夠?qū)hotoshop的PSD文件進(jìn)行分析,以獲取其中的字體、顏色和大小等信息。由于這一特性的存 在,Brackets非常適合于那些同時(shí)進(jìn)行設(shè)計(jì)工作的JavaScript開(kāi)發(fā)者。
Atom
Atom是由GitHub推 出的一款開(kāi)源的免費(fèi)富文本編輯器,非常易于上手使用,在安裝后可以直接運(yùn)行,而無(wú)需進(jìn)行任何配置文件的改動(dòng),就能夠“良好地運(yùn)行了”。Atom最有趣的一 點(diǎn)是可以對(duì)它的每一方面都進(jìn)行自定義(GitHub將其稱(chēng)為“可以隨便折騰”),它是在一個(gè)web核心的基礎(chǔ)上所創(chuàng)建的,因此用戶(hù)就可以通過(guò)編寫(xiě)標(biāo)準(zhǔn)的 HTML、CSS和JavaScript,對(duì)它的外觀(guān)進(jìn)行自定義。想要為Atom換個(gè)不同的背景和文本字體?改一下CSS就行?;蛘吣阋部梢赃x擇下載并應(yīng) 用各種為Atom所創(chuàng)建的主題。這種靈活性讓Atom能夠按照你所希望的方式進(jìn)行展現(xiàn)。對(duì)于JavaScript新手開(kāi)發(fā)者和熱衷于自定義的用戶(hù)來(lái) 說(shuō),Atom是一個(gè)優(yōu)秀的工具。
#p#
構(gòu)建與自動(dòng)化工具
現(xiàn) 代的JavaScript項(xiàng)目正傾向于變得越來(lái)越復(fù)雜,變化的部分也在不斷增多。這并不是說(shuō)這門(mén)語(yǔ)言或是對(duì)應(yīng)的工具不夠高效,而是由于當(dāng)前所創(chuàng)建的web 應(yīng)用程序的豐富性、酷炫的體驗(yàn)和復(fù)雜性所導(dǎo)致的直接后果。在大型的項(xiàng)目中工作時(shí),你必須經(jīng)常做許多重復(fù)性的工作,無(wú)論是在你打算簽入代碼、或是將代碼構(gòu)建 到生產(chǎn)環(huán)境中。這些工作可能會(huì)包括合并、壓縮、對(duì)LESS或SASS CSS文件的編譯,甚至是運(yùn)行測(cè)試。手動(dòng)完成這些工作不僅令人沮喪,效率也很低下。更好的辦法是通過(guò)某種支持這些任務(wù)的構(gòu)建工具,對(duì)這些工作進(jìn)行自動(dòng)化。
合并(Bundling)與壓縮(Minification)
你 所編寫(xiě)的大多數(shù)JavaScript和CSS都會(huì)在多個(gè)web頁(yè)面中共享。因此,你很可能會(huì)將這些內(nèi)容放到單獨(dú)的.js和.css文件中,然后在web頁(yè) 面中引用這些文件。這種方式的結(jié)果是,用戶(hù)的瀏覽器為了完全顯示你的web引用,需要分別發(fā)送一個(gè)HTTP請(qǐng)求,以獲取這些文件(或者至少需要驗(yàn)證一下這 些文件是否已經(jīng)改變了)。
HTTP請(qǐng)求的代價(jià)是很高的。除了請(qǐng)求本身的大小之外,你還將因?yàn)榫W(wǎng)絡(luò)延遲、HTTP頭和Cookie等內(nèi)容買(mǎi)單。合并與壓縮工具的設(shè)計(jì)目的就是減少、乃至完全消除這些請(qǐng)求所帶來(lái)的影響。
合并
要 改善web代碼的性能,開(kāi)發(fā)者所能做的最簡(jiǎn)單的一件事就是將代碼進(jìn)行合并。在合并流程中,多個(gè)JavaScript或CSS文件將被并入一個(gè)單一的 JavaScript或CSS文件中。感覺(jué)上就像是將多張個(gè)別的全景圖像的照片連接在一起,以完成一張繼續(xù)的單一照片。通過(guò)將JavaScript文件與 CSS文件進(jìn)行合并,我們就能夠消除很大一部分HTTP請(qǐng)求的開(kāi)銷(xiāo)。
壓縮
JavaScript 開(kāi)發(fā)者還有一種可以改善性能的方式,就是將剛剛合并的代碼進(jìn)行壓縮。壓縮過(guò)程能夠?qū)avaScript和CSS代碼以盡可能最小的形式進(jìn)行壓縮,同時(shí)保 證功能不變。對(duì)于JavaScript來(lái)說(shuō),這就意味著將變量重命名為無(wú)意義的單字符形式,并且去除所有空白和格式符。而對(duì)于CSS來(lái)說(shuō),由于頁(yè)面風(fēng)格依 賴(lài)于變量的名稱(chēng),因此通常來(lái)說(shuō)只會(huì)去除格式符與空白。壓縮能夠極大的改進(jìn)網(wǎng)絡(luò)性能,因?yàn)樗鼫p少了每個(gè)HTTP響應(yīng)的字節(jié)數(shù)。
未經(jīng)壓縮的AJAX JavaScript代碼,與上面所展示的代碼相同:
同樣的代碼經(jīng)過(guò)壓縮之后的形式:
請(qǐng)注意,我將壓縮后的輸出結(jié)果分為兩行的目的,只是為了在文章中閱讀起來(lái)更方便,而實(shí)際上經(jīng)過(guò)壓縮后的輸出通常來(lái)說(shuō)只有一行。
合并與壓縮的時(shí)機(jī)
通 常來(lái)說(shuō),合并與壓縮步驟只會(huì)在生產(chǎn)環(huán)境上執(zhí)行,這樣做的原因是為了讓你在本地或是開(kāi)發(fā)環(huán)境中可以對(duì)包含了格式符和行號(hào)的原始代碼進(jìn)行調(diào)試。而調(diào)試上面所顯 示的那種壓縮代碼會(huì)非常困難,因?yàn)樗械拇a都擠在一行中。而且壓縮后的代碼會(huì)變得完全不可讀,在你嘗試調(diào)試時(shí)會(huì)發(fā)現(xiàn)這種代碼完全無(wú)用,并讓你感到非常受 挫。
源代碼映射文件
有 些時(shí)候,代碼中的某些bug只有在生產(chǎn)環(huán)境才能重現(xiàn)。這樣一來(lái),當(dāng)你要調(diào)試某些問(wèn)題時(shí),經(jīng)過(guò)壓縮的代碼就成為了一個(gè)問(wèn)題。幸運(yùn)的是,JavaScript 支持源代碼映射文件,它能夠在壓縮后的代碼和原始代碼之間進(jìn)行“映射”。這些代碼映射文件是在壓縮階段由下文所說(shuō)的某些構(gòu)造工具所生成的。隨后你的 JavaScript調(diào)試器就能夠使用這些映射文件,為你提供清晰可讀的代碼進(jìn)行調(diào)試了。你應(yīng)當(dāng)盡可能將映射文件與實(shí)際代碼一起發(fā)布,這樣就能夠在某些功 能出錯(cuò)時(shí)進(jìn)行代碼的調(diào)試了。
代碼整理
代 碼整理工具會(huì)根據(jù)預(yù)定義的格式化規(guī)則檢查你代碼中的常見(jiàn)錯(cuò)誤和問(wèn)題,這些工具所報(bào)告的錯(cuò)誤通常都類(lèi)似于以下這些:使用了tab縮進(jìn)而不是空格、在行末遺漏 了分號(hào)、或是在沒(méi)有使用if、for或while語(yǔ)句的情況下使用了大括號(hào)。大多數(shù)IDE中都提供了代碼整理工具,而其它一些IDE也允許用戶(hù)自行安裝代 碼整理插件。
最流行的兩種JavaScript整理工具是JSHint和JSLint,JSLint是由 Doug Crockford開(kāi)發(fā)的整理框架,而JSHint則是由社區(qū)人員從JSLint中分支出來(lái)的。他們僅在各自的代碼格式化標(biāo)準(zhǔn)上有著一些區(qū)別。我的建議是 兩者都嘗試一下,然后選擇一個(gè)最適合你的代碼風(fēng)格的工具。
自動(dòng)化任務(wù):Grunt
與 它的名稱(chēng)不同,Grunt(本意為打呼嚕)絕不是一個(gè)粗糙的工具,而是一個(gè)健壯的命令行構(gòu)造工具,能夠運(yùn)行用戶(hù)所定義的各種任務(wù)。通過(guò)設(shè)置一個(gè)簡(jiǎn)單的配置 文件,你就可以讓Grunt進(jìn)行各種工作,例如編譯LESS或SASS文件、構(gòu)建并壓縮某個(gè)特定文件夾中的所有JavaScript和CSS文件、甚至是 運(yùn)行某種代碼整理工具或是測(cè)試框架。你也可以通過(guò)配置,將Grunt作為一種Git鉤子運(yùn)行,當(dāng)你往源代碼控制庫(kù)里進(jìn)行簽入時(shí),自動(dòng)地壓縮與合并你的代 碼。
Grunt支持各種命名的目標(biāo),因?yàn)槟憧梢栽诓煌沫h(huán)境中指定不同的命令,比方說(shuō)你可以將“dev”和“prod”指定為目標(biāo)。這一點(diǎn)對(duì)于某些場(chǎng)景來(lái)說(shuō)非常有用,例如在生產(chǎn)環(huán)境中將代碼進(jìn)行合并與壓縮,而在開(kāi)發(fā)環(huán)境中忽略這一步驟,以便于調(diào)試的需要。
Grunt 中一個(gè)很有用的特性叫做“grunt watch”,它能夠?qū)σ粋€(gè)目錄中的文件,或一個(gè)文件集合中的變更進(jìn)行監(jiān)控。這一特性可以整合入WebStorm和Sublime Text這樣的IDE中使用。通過(guò)使用監(jiān)控特性,你可以根據(jù)文件變更的情況觸發(fā)事件。對(duì)于LESS或SASS的編譯就是這一特性的實(shí)用作法,你可以設(shè)置 grunt以監(jiān)控你的LESS或SASS文件,當(dāng)文件產(chǎn)生變更時(shí)立即進(jìn)行編譯,編譯后生成的文件就可以直接在開(kāi)發(fā)環(huán)境中進(jìn)行使用了。你也可以讓grunt 監(jiān)控在你修改了每個(gè)文件之后都自動(dòng)地運(yùn)行某種代碼整理工具。通過(guò)grunt監(jiān)控進(jìn)行實(shí)時(shí)任務(wù)執(zhí)行,是一種加速你的生產(chǎn)力的極好的方式。
自動(dòng)化任務(wù):Gulp
Grunt 和Gulp都是用于解決構(gòu)建自動(dòng)化問(wèn)題的工具,可以說(shuō)兩者是直接的競(jìng)爭(zhēng)者。他們之間主要的差別在于,Grunt更專(zhuān)注于配置,而Gulp更專(zhuān)注于代碼。你 在Grunt文件中通過(guò)聲明式的JSON對(duì)構(gòu)建任務(wù)進(jìn)行配置,而在Gulp文件中通過(guò)編寫(xiě)JavaScript函數(shù)以實(shí)現(xiàn)相同的功能。
下面的這個(gè)Grunt配置文件會(huì)在SASS文件產(chǎn)生變更時(shí),編譯生成CSS文件:
grunt.initConfig({ sass: { dist: { files: [{ cwd: "app/styles", src: "**/*.scss", dest: "../.tmp/styles", expand: true, ext: ".css" }] } }, autoprefixer: { options: ["last 1 version"], dist: { files: [{ expand: true, cwd: ".tmp/styles", src: "{,*/}*.css", dest: "dist/styles" }] } }, watch: { styles: { files: ["app/styles/{,*/}*.scss"], tasks: ["sass:dist", "autoprefixer:dist"] } } }); grunt.registerTask("default", ["styles", "watch"]);
下面的這個(gè)Gulp配置文件同樣會(huì)在SASS文件產(chǎn)生變更時(shí),編譯生成CSS文件:
gulp.task("sass", function { gulp.src("app/styles/**/*.scss") .pipe(sass) .pipe(autoprefixer("last 1 version")) .pipe(gulp.dest("dist/styles")); }); gulp.task("default", function { gulp.run("sass"); gulp.watch("app/styles/**/*.scss", function { gulp.run("sass"); }); });總結(jié)
JavaScript自從互聯(lián)網(wǎng)的早期誕生以來(lái),已經(jīng)經(jīng)歷了巨大的改進(jìn)。如今,它已成為了交互式web應(yīng)用程序中一個(gè)突出的重要組成部分。
開(kāi)發(fā)者們從1995年起到如今也經(jīng)歷了巨大的變化,如今的開(kāi)發(fā)者們更樂(lè)于使用豐富而健壯的框架、工具和IDE,以提高工作的效率和生產(chǎn)力。
創(chuàng)建你的第一個(gè)現(xiàn)代JavaScript應(yīng)用程序或者比你自己想象中還要簡(jiǎn)單!只要選擇好一個(gè)IDE(我向初學(xué)者推薦Atom),然后安裝npm和grunt。如果你之后在哪里卡住了,Stack Overflow是非常好的資源。只要稍稍花一點(diǎn)時(shí)間學(xué)習(xí)基礎(chǔ)知識(shí),你就很快能夠上手開(kāi)發(fā)并最終發(fā)布你的第一個(gè)現(xiàn)代JavaScript應(yīng)用了。
資源關(guān)于作者
David Haney是Stack Exchange核心團(tuán)隊(duì)的工程師經(jīng)理, StackOverflow和ServerFault這些問(wèn)答網(wǎng)站都是基于Stack Exchange創(chuàng)建的。他的日常工作包括幫助開(kāi)發(fā)者解決問(wèn)題,以及改善流程。他之前曾是Fanatics的電子商務(wù)平臺(tái)的首席開(kāi)發(fā)者,基于這個(gè)平臺(tái)搭建 的網(wǎng)站數(shù)量超過(guò)1萬(wàn),其中包括NFL的官方在線(xiàn)商店NFLShop,以及NBA的官方商店。
David也是Dache的作者,這是一個(gè)開(kāi)源的分布式緩存框架。他在業(yè)務(wù)時(shí)間主要用于喝啤酒,以及參與社區(qū)用戶(hù)小組和各種編程活動(dòng),而且經(jīng)常是邊說(shuō)邊喝。
這一系列文章的 視角更進(jìn)一步,它們將關(guān)注于如何在實(shí)踐中應(yīng)用這些強(qiáng)大的技術(shù),這并不是指創(chuàng)建多么酷炫的示例和原型,而是在第一線(xiàn)進(jìn)行實(shí)際應(yīng)用。在這個(gè)(后)HTML5系 列文章中,我們不需要響亮的口號(hào),而是基于行業(yè)專(zhuān)家的實(shí)際經(jīng)驗(yàn),獲得實(shí)踐性的見(jiàn)解。我們也將討論那些更進(jìn)一步的技術(shù)(例如AngularJS),并對(duì) web標(biāo)準(zhǔn)和web開(kāi)發(fā)的未來(lái)進(jìn)行定義。