討論jQuery和javascript效能的文章並不罕見。然而,我計劃根據他人對jQuery總結的一些速度方面的技巧和一些建議,來教你提升你的JSLite和javascript程式碼。好的程式碼會帶來速度的提升。快速渲染和回應意味著更好的使用者體驗。
首先,在腦中牢牢記住JSLite就是javascript。這意味著我們應該採取相同的編碼慣例,風格指南和最佳實踐。
首先,如果你是一個javascript新手,沒有用過jQuery我建議您閱讀最好先閱讀官方文檔的語法介紹,這是一篇高質量的javascript教程,表示您已經會jQuery用過一段時間了。
當你準備使用JSLite,我強烈建議你遵循下面這些指南:
快取變數
DOM遍歷是昂貴的,所以盡量將會重複使用的元素快取。
// 糟糕
h = $('#element').height();
$('#element').css('height',h-20);
// 建議
$element = $('#element');
h = $element.height();
$element.css('height',h-20);
避免全域變數
JSLite與javascript一樣,一般來說,最好確保你的變數在函數作用域內。
// 糟糕
$element = $('#element');
h = $element.height();
$element.css('height',h-20);
// 建議
var $element = $('#element');
var h = $element.height();
$element.css('height',h-20);
使用匈牙利命名法
在變數前面加上$前綴,方便辨識出JSLite物件。
// 糟糕
var first = $('#first');
var second = $('#second');
var value = $first.val();
// 建議 - 在JSLite物件前面加上$前綴
var $first = $('#first');
var $second = $('#second'),
var value = $first.val();
使用 var 鏈(單 var 模式)
將多條var語句合併為一條語句,我建議將未賦值的變數放到後面。
var $first = $('#first'),
$second = $('#second'),
value = $first.val(),
k = 3,
cookiestring = 'SOMECOOKIESPLEASE',
i,
j,
myArray = {};
請使用 on
在新版JSLite中,較短的 on("click") 用來取代類似 click() 這樣的函數。在先前的版本中 on() 就是 bind() 。 on()附加事件處理程序的首選方法。然而,出於一致性考慮,你可以簡單的全部使用 on() 方法。
// 糟糕
$first.click(function(){
$first.css('border','1px solid red');
$first.css('color','blue');
});
$first.hover(function(){
$first.css('border','1px solid red');
})
// 建議
$first.on('click',function(){
$first.css('border','1px solid red');
$first.css('color','blue');
})
$first.on('hover',function(){
$first.css('border','1px solid red');
})
精簡javascript
一般來說,最好盡可能合併函數。
// 糟糕
$first.click(function(){
$first.css('border','1px solid red');
$first.css('color','blue');
});
// 建議
$first.on('click',function(){
$first.css({
'border':'1px solid red',
'color':'blue'
});
});
鍊式操作
JSLite實作方法的鍊式操作是非常容易的。下面利用這一點。
// 糟糕
$second.html(value);
$second.on('click',function(){
alert('hello everybody');
});
$second.fadeIn('slow');
$second.animate({height:'120px'},500);
// 建議
$second.html(value);
$second.on('click',function(){
alert('hello everybody');
}).fadeIn('slow').animate({height:'120px'},500);
維持程式碼的可讀性
伴隨著精簡程式碼和使用鍊式的同時,可能帶來程式碼的難以閱讀。加入縮緊和換行能起到很好的效果。
// 糟糕
$second.html(value);
$second.on('click',function(){
alert('hello everybody');
}).fadeIn('slow').animate({height:'120px'},500);
// 建議
$second.html(value);
$second
.on('click',function(){ alert('hello everybody');})
.fadeIn('slow')
.animate({height:'120px'},500);
選擇短路求值
短路求值是一個從左到右求值的表達式,用 &&(邏輯與)或 || (邏輯或)運算子。
// 糟糕
function initVar($myVar) {
if(!$myVar) {
$myVar = $('#selector');
}
}
// 建議
function initVar($myVar) {
$myVar = $myVar || $('#selector');
}
選擇捷徑
精簡程式碼的其中一種方式是利用程式設計捷徑。
// 糟糕
if(collection.length > 0){..}
// 建議
if(collection.length){..}
繁重的操作中分離元素
如果你打算對DOM元素做大量操作(連續設定多個屬性或css樣式),建議先分離元素然後在新增。
// 糟糕
var
$container = $("#container"),
$containerLi = $("#container li"),
$element = null;
$element = $containerLi.first();
//... 許多複雜的操作
// better
var
$container = $("#container"),
$containerLi = $container.find("li"),
$element = null;
$element = $containerLi.first().detach();
//... 許多複雜的操作
$container.append($element);
熟記技巧
你可能對使用JSLite中的方法缺少經驗,一定要查看的文檔,可能會有一個更好或更快的方法來使用它。
// 糟糕
$('#id').data(key,value);
// 建議 (高效率)
$.data('#id',key,value);
サブクエリを使用してキャッシュされた親要素
前述したように、DOM トラバーサルはコストのかかる操作です。一般的なアプローチは、親要素をキャッシュし、子要素を選択するときにこれらのキャッシュされた要素を再利用することです。
// おっと
var
$container = $('#container'),
$containerLi = $('#container li'),
$containerLiSpan = $('#コンテナリスパン');
// 提案 (効率的)
var
$container = $('#container '),
$containerLi = $container.find('li'),
$containerLiSpan= $containerLi.find('span');
ユニバーサルセレクターを避ける
ユニバーサル セレクターを子孫セレクターに入れると、パフォーマンスが著しく低下します。
// おっと
$('.container > *');
// 提案
$('.container').children();
暗黙的なユニバーサルセレクターを避ける
ユニバーサル セレクターは暗黙的である場合があり、見つけるのが困難です。
// おっと
$('.someclass :radio');
// 提案
$('.someclass input:radio');
最適化セレクター
たとえば、ID セレクターは一意である必要があるため、セレクターを追加する必要はありません。
// おっと
$('div#myid');
$('div#footer a.myLink');
// 提案
$('#myid');
$('#footer .myLink');
複数の ID セレクターを避ける
ここで強調したいのは、ID セレクターは一意である必要があり、追加のセレクターを追加する必要はなく、複数の子孫 ID セレクターも必要ないということです。
$('#外側 #内側');
// 提案
$('#inner');
最新バージョンを使用してください
新しいバージョンは通常、より優れており、より軽量で、より効率的で、より多くのメソッドを備え、jQuery メソッドをより包括的にカバーしています。明らかに、サポートしたいコードの互換性を考慮する必要があります。たとえば、プロジェクトは HTML5/CSS3 の適切なサポートに基づいて実行されますか?
必要に応じて JSLite と JavaScript ネイティブ コードを組み合わせる
上で述べたように、JSLite は JavaScript です。つまり、JSLite で実行できることはすべて、ネイティブ コードでも実行できます。ネイティブ コードは、JSLite ほど読みにくく保守しにくい可能性があり、コードが長くなる可能性があります。しかし、それはより効率的であることも意味します (通常、基礎となるコードに近づくほど可読性が低くなり、パフォーマンスが向上します。たとえば、アセンブリには当然より強力な人材が必要です)。ネイティブ コードよりも小さく、軽く、効率的なフレームワークは存在しないことに留意してください (注: テスト リンクはもう有効ではありません。テスト コードはオンラインで検索できます)。
最後のアドバイス
最後に、JSLite のパフォーマンスの向上とその他の優れた提案を目的として、この記事を記録します。このトピックをさらに深く掘り下げたい場合は、非常に楽しいことがわかります。 JSLite は必須ではなく、単なるオプションであることに注意してください。なぜそれを使いたいのか考えてみましょう。 DOM操作?アヤックス?ステンシル? CSSアニメーション?それともセレクター? jQuery のヘビー開発者ですか?