轉(zhuǎn)帖|行業(yè)資訊|編輯:郝浩|2016-09-14 10:18:53.000|閱讀 210 次
概述:學(xué)習(xí)JavaScript是困難的。它發(fā)展的如此之快,以至于在任何一個特定的時刻,你都不清楚自己是否“做錯了”。有些時候,感覺像是壞的部分超過了好的部分。然而,討論這些并沒有意義,JavaScript正在征服世界,所以,我們也只能這么做了。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
學(xué)習(xí)JavaScript是困難的。它發(fā)展的如此之快,以至于在任何一個特定的時刻,你都不清楚自己是否“做錯了”。有些時候,感覺像是壞的部分超過了好的部分。然而,討論這些并沒有意義,JavaScript正在征服世界,所以,我們也只能這么做了。
下面是我的一些建議:
“額,只有那么幾行而已…”,是的,我的意思是所有的 JS 都應(yīng)該放在 .js 文件中。為什么呢?因為這有助于可讀性,節(jié)省帶寬。行內(nèi) JavaScript 在每次頁面加載時都會重新下載,相反的,單獨(dú)的 .js 文件則會被緩存起來。正如你所看到的,這個規(guī)則有助于支持如下一長串的其他規(guī)則。這就是為什么它的規(guī)則# 1。
我看到過很多程序員喜歡動態(tài)的使用JavaScript。他們喜歡像使用服務(wù)器端語言如C#, Ruby, Java那樣來動態(tài)的使用JavaScript。千萬不要這么做。你失去了代碼著色、語法高亮顯示和智能感知的支持。記住,JavaScript 應(yīng)該屬于一個 .js 文件(見規(guī)則 #1)。
然而,使用JSON引入動態(tài)行為。我把這稱為JavaScript配置對象模式。具體方法如下:把JSON注入到你程序的頭部,并根據(jù)業(yè)務(wù)邏輯的需要利用這些數(shù)據(jù)。你可能會想:“嘿,這違背了規(guī)則 #1”。我把 JSON 看作是數(shù)據(jù),而不是代碼,所以我破例,為了支持靜態(tài)的、單獨(dú)的JavaScript文件。
StackOverflow 使用的這種模式,Google 也是。你可以看下他們的代碼:
正如你看到的,StackOverflow 注入了一些個人的設(shè)置,如 isNoticesTabEnabled。這個簡單的JSON代碼片段為你使用靜態(tài)JavaScript文件自定義行為提供了必要的數(shù)據(jù)支持。為了實現(xiàn)這一點(diǎn),需要序列號服務(wù)器端類為JSON,然后放置在 中。然后你可以在靜態(tài)的JavaScript文件中根據(jù)需要參考這個數(shù)據(jù)結(jié)構(gòu),能夠使用它,是因為它被注入到 中。
壓縮可以減小文件體積,從而提升頁面加載速度。記住,性能也是一項功能。因為,為了壓縮,你需要把 JS 放到一個單獨(dú)的文件中(見規(guī)則 #1)。壓縮JS曾經(jīng)很麻煩,但現(xiàn)在完全是簡單自動化的。有一打的方式可以做到,而Gulp 和 gulp-uglify 是一種低摩擦和自動化的辦法。
如果你把< script > 標(biāo)簽放在 < head > 中,它會阻礙頁面渲染。位于 < head > 中的腳本必須在頁面顯示前加載,因此把 < script > 放在底部的 < /body > 前面可以先顯示頁面,而不用等 JS 文件下載完畢。這有助于提升感知性能。如果你的JavaScript必須位于 < head > 中,可以考慮使用 jQuery 的 $(document).ready 這樣你的腳本可以等到 DOM 加載完畢后再執(zhí)行。
Linting 遵循代碼風(fēng)格、發(fā)現(xiàn)錯別字、有助于避免錯誤。有很多這樣的工具,我建議使用 ESLint。你可以使用 Gulp 的 gulp-eslint 來運(yùn)行它。Gulp 可以查看你所有的 JS 文件,并在你每次保存的時候運(yùn)行 linter。另外,你需要把你的 JS 代碼放在單獨(dú)的 .js 文件中才能運(yùn)行 linter 。
在過去的幾年中,我們知道了測試的重要性。但它在很大程度上忽略了在JavaScript,直到最近才被重視。現(xiàn)在典型的JavaScript應(yīng)用需要測試的部分遠(yuǎn)比你實際手動測試到的要多。使用JavaScript處理這么多的邏輯,關(guān)鍵的是具有自動測試。
您可以通過工具,如 Selenium 自動化集成測試。然而,集成測試往往是脆弱的,所以我建議專注于自動化單元測試。自動化單元測試有多種選擇。如果你是新手, 我建議你使用Jasmine,而如果你想要終極配置,可以使用Mocha with Chai。
前些年我們了解了全局變量的風(fēng)險,值得慶幸的是,現(xiàn)在有很多的方法來封裝JS:
ES6模塊是未來。好消息是,雖然在瀏覽器中還不能很好的支持,但你可以用 Babel 來使用它。
如果你不想 transpile, CommonJS可能是你最佳的選擇。由于 Node 使用的 CommonJS 模式,所以你可以使用npm 來下載數(shù)千個包。CommonJS 不能在瀏覽器中運(yùn)行,所以你可能需要 Browserify,Webpack, or JSPM.
8. JS 依賴應(yīng)當(dāng)明確
這條規(guī)則與上述規(guī)則緊密相關(guān)。一旦你開始封裝JavaScript,您需要一個簡單的方法來引用其他模塊。這就是常說的現(xiàn)代模塊系統(tǒng)CommonJS和ES6模塊的好處。你只需要在文件頂部指定依賴,就像 Java 或 C# 那樣一句聲明:
//CommonJS var react = require('react'); //ES6 Modules import React from 'React'
最新版本的JavaScript,EcmaScript 2015(被大家熟知的名字是ES6) 官方版本在 6月份發(fā)布了。瀏覽器還不能很好的支持它的很多特性,但這并無關(guān)緊要。你可以用 Babel 來體驗它的新特性。Babel 把 ES6 transpile 到 ES5,如果你能忍受這么做,你現(xiàn)在就可以享受 ES6 的新特性。JavaScript預(yù)計一年發(fā)布一次的新版本了,所以你可能一直需要transpiling 。
或者你喜歡強(qiáng)類型?那么你可以考慮 TypeScript。
我們已經(jīng)談到了 linting、壓縮、transpilation 和測試。但如何才能讓這一切自動發(fā)生?很簡單:使用自動構(gòu)建。Gulp 就是這樣一個結(jié)合了所有功能的工具。不過你也可以選擇 Grunt 和 Webpack。或者如果你是一個高手,你也可以使用 npm 來構(gòu)建。問題的關(guān)鍵是,不要指望人記得手動運(yùn)行這些東西的,自動化是一個非常棒的選擇。
拿一些現(xiàn)成的東西來用。想保持輕量級?試試Backbone 或 Knockout。 或者 jQuery就夠了。想要更多更全功能的?試試 Angular, Ember,,或者 React with Flux。
關(guān)鍵是:
不要試圖從頭開始。站在巨人的肩膀上。
不管你選擇哪個框架,都應(yīng)該分開你的關(guān)注,這就是下一點(diǎn)..
把 JS代碼放到一個文件中的習(xí)慣很容易養(yǎng)成,或者盲目跟從你的框架的意見。當(dāng)你移動到客戶端的時候,不要忘記你在服務(wù)器端學(xué)到的經(jīng)驗教訓(xùn)。
這里并不僅僅意味著就像你在Angular 和 Knockout等 MVC 框架中那樣分離模型、視圖、控制器。編寫JavaScript的時候應(yīng)該像服務(wù)器端開發(fā)者那樣思考問題。把你的業(yè)務(wù)邏輯和數(shù)據(jù)訪問分離出來。
這意味著AJAX調(diào)用都應(yīng)該在一個地方。創(chuàng)建一個集中的客戶端“數(shù)據(jù)訪問層”。業(yè)務(wù)邏輯模塊應(yīng)包含純JavaScript的。這使得邏輯易于重用,易于測試,升級也不受影響。
本文轉(zhuǎn)載自
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@fc6vip.cn