Хорошие советы и рекомендации для "упорядочения" вашего Javascript и jQuery

Очевидно, что у вас есть основные методы Minify и Packer...

Но я задавался вопросом, есть ли какие-нибудь небольшие методы Javascript для меньшего кода (например, те альтернативные, если в них есть выражения с ? и : и т.д.).

THEN, как только у меня будет хороший обтекаемый код (...), я буду его миниатюрировать/упаковать.

Ответ 1

Очень хороший способ помочь minifiers - передать переменные в функцию self invoking:

(function(window, document, $, undefined) {
      // all of your application logic goes in here
}(window, window.document, jQuery));

A minifier создаст ярлыки для аргументов, например a, b, c, d.

(function(a, b, c, d) {
}(window, window.document, jQuery));

Теперь window, document и jQuery (если он используется) и undefined value доступны довольно часто. Это поможет еще больше уменьшить размер файла.

Несколько ярких ярлыков Javascript описаны в этой статье.

Например, используйте ~~ вместо Math.floor().

var floored = Math.floor(55.2115);  // = 55

Забастовкa >

var floored = ~~(55.2115);  // = 55

Еще одна очень аккуратная вещь: почти все переводчики Javascript конвертируют числа для вас. Например, мы хотим иметь setTimeout, который срабатывает через 3 минуты. Вместо того, чтобы делать это как

setTimeout(function() {
}, 180000);

или 60 * 3 * 1000, мы можем просто вызвать:

setTimeout(function() {
}, 18e4);

Что, вероятно, имеет гораздо больше смысла, на гораздо больших количествах, но в любом случае: -)

Ответ 2

Мне нравится

for(var i = arr.length;i--;)

Он не сохраняет такой код, но имеет два преимущества:

  • доступ .length только один раз
  • "быстрее", чем традиционный цикл for

Но он работает только в том случае, если порядок обработки массива не имеет значения.


Я думаю, что, наверное, все знают, как установить значения по умолчанию, используя логический OR:

function(must, option) {
    option = option || "defaultValue";
}

Если option не задано, значение undefined равно false. JavaScript возвращает значение переменной, которая выполняет выражение (или значение последнего, если выражения не выполнены, я думаю). Конечно, это зависит от того, какие значения могут иметь значения option, т.е. Это не будет работать, если одно возможное значение false.


Быстрый способ конвертировать числовые строки в числа - это добавить +. Нет необходимости использовать, например. parseInt:

var n = +"123";
// instead of `var n = parseInt("123", 10)`

Ответ 3

Ничего не стоит хлопот - с помощью minification и gzip, сохраняя один символ здесь и два, безусловно, ненужная микрооптимизация. Вы можете сэкономить несколько байт, да, может быть, даже сто или две, но за счет вашего времени разработки, когда вы могли бы сделать что-то потрясающее.

Ответ 4

Я бы просто написал код в понятной для чтения форме, затем использовал закрытие Google или подобное, чтобы оптимизировать и сжать его.

http://code.google.com/closure/

Цитата с сайта Closure:

Компилятор Closure компилирует JavaScript в компактный высокопроизводительный код. компилятор удаляет мертвый код и перезаписывает и сводит к минимуму то, что осталось, чтобы оно загружалось и работает быстро. Он также проверяет синтаксис, ссылки на переменные и типы и предупреждает об общих ошибках JavaScript.

Ответ 5

if (conditional && conditional) {
    doSomething();
}

может стать:

conditional && conditional && doSomething();

Ответ 6

Это замечательная идея. Но я думаю, что более важно, чтобы код был читабельным, понятным и поддерживаемым, чем оптимизированный для размера. Вся уменьшенная версия jQuery 1.5 имеет размер только 85 КБ. Это меньше, чем многие изображения на многих веб-сайтах.

Многие люди пишут код вроде:

$('a#click_me').bind('click', function(){
    $(this).children('img').hide();
    ... etc...
    $(this).parent().addClass('xyz');
});
$('a#click_me').css('width',  '10px');
$('a#click_me').css('height', '10px');

вместо:

$('a#clickme').css({width: '10px', height: '10px'}).click(function(){
    var $this = $(this), href=this.href;
    $('img', this).hide();
    ... etc ...
    $this.parent().addclass('xyz');
});

то есть. используйте карты ({a: b, c: d}), где это возможно (например, в css() выше).

Используйте цепочку $(selector).method1().method2().

Использовать, например. $('img', this), а не $this.children('img');

Не используйте один и тот же селектор, сохраняйте результат в переменной (например, $this).

При необходимости используйте элемент JavaScript, а не jQuery, например,

href = this.href;   rather than   href = $(this).attr('href');