Блог Конфуция
О минифае 09.02.2009

Предварительное сжатие яваскрипта хорошо по двум причинам: во-первых, файл теряет в весе, а во-вторых, пожатый файл проще парсить и исполнять яваскриптовому движку. Конечно, если минифаить «неэффективный» код, то пожмется он незначительно, да и парсить его остается так же сложно.

Чтобы избежать всех этих неэффективностей, можно выработать такой стиль программирования, при котором код и жмется хорошо, и исполняется быстро ;)

Можно начать с кеширования значений, которые часто используются в функции, но их получение из внешнего мира затратно. Здесь налицо выгода при сжатии: минифаер поймет, что переменная локальная и сожмет ее имя в один символ. Интерпретатор при исполнении такого кода будет точно знать, что используется локальная копия далекого объекта. А локальная копия гораздо быстрее ветвистых поисков в объектах и массивах. Например,


var name = this.conf.name, defs = this.defs
this.save(defs[name] || (defs[name] = {}))
немного лучше чем

this.save(this.defs[this.conf.name] || (this.defs[this.conf.name] = {}))
Первое пожмется в

var n=this.conf.name,d=this.defs;this.save(d[n]||(d[n]={}))
а второе в

this.save(this.defs[this.conf.name]||(this.defs[this.conf.name]={}))
то есть не пожмется вообще. Можно еще this закешировать, и будет еще на два байта меньше:

var t=this,n=t.conf.name,d=t.defs;t.save(d[n]||(d[n]={}))
но это мы предоставим гзипу — он автоматический :)

Кеширование переменных гораздо лучше копипаста, встречающегося на вольных просторах интернета. Типа этого:


this.conf.name.first = "Vasya"
this.conf.name.second = "Poupkine"
преобразуется в

var name = this.conf.name
name.first = "Vasya"
name.second = "Poupkine"
и, соответственно, сжимается в

var n=this.conf.name;n.first="Vasya";n.second="Poupkine"

Подобные оптимизации совсем не обязательны и могут отвлекать от процесса творческого программирования. Но если привыкнуть к ним и начать думать как оптимизатор кода (в яваскрипте же его нет), то писать такой код можно уже без напряжения. Если ваш код будет использоваться часто и интенсивно, но изменен будет нескоро, то такая оптимизация как раз для вас. Можно, конечно, подождать многопроходного компилятора с оптимизатором и кроссбраузерного байткода, да когда они еще будут-то…

Теги:
  • клиент
  • javascript
  • minify
Очень жду ваших комментариев на почту или на гитхаб.