Може ли минификатор да направи това? (и добра идея ли е?)

Имам JavaScript приложение, което генерира значително количество DOM елементи. Това означава, че често използвам document.createElement("tagname") в моя скрипт.

Мисля да използвам тази проста функция:

function c(e) {return document.createElement(e);}

Ще продължа да пиша кода си в JavaScript (или може би CoffeScript) и ще използвам пълния метод document.createElement в кода за четливост. Но бих очаквал, че когато „компилирам“ или минимизирам кода, всички екземпляри на document.createElement се заменят с функцията c.

Бих направил същото за други методи: document.getElementById и т.н. Надявам се, че мога да съкратя кода си с 10 до 20% с тази техника.

Има ли минификатори или компилатори, които могат да направят това? И има ли смисъл на първо място?


person Christophe    schedule 29.11.2011    source източник
comment
На какви ползи се надявате?   -  person Ash Burlaczenko    schedule 30.11.2011
comment
Ако не друго, винаги можете да направите това сами като стъпка преди минимизиране. Не би трябвало да е твърде трудно за писане.   -  person cdeszaq    schedule 30.11.2011
comment
Копирате ли вашите файлове в gzip? Обзалагам се, че това няма да има голяма разлика в дългосрочен план.   -  person RightSaidFred    schedule 30.11.2011
comment
Защо просто не използвате c = document.createElement? РЕДАКТИРАНЕ: Не, това са грешки. createElement трябва да се извика от обекта на документа. Най-близкото, до което можете да стигнете, е c = document.createElement.bind(document)   -  person Eric    schedule 30.11.2011
comment
@Ash: ползата е по-малък js файл (печалба от 10 до 20%, както казах във въпроса).   -  person Christophe    schedule 30.11.2011
comment
Създаване също може DOM елементи? Започнете да използвате JavaScript шаблони: ejohn.org/blog/javascript-micro-templating   -  person peterp    schedule 30.11.2011
comment
Обикновено така или иначе архивирате кода си .. минимизирането IMHO е за проекти, при които всеки един байт има значение.   -  person tereško    schedule 30.11.2011


Отговори (5)


Не мисля, че ще спечелиш толкова много. Некомпресираният js файл може да е доста по-малък, но компресията трябва да се справи с такъв повтарящ се низ. Така че очаквам печалбата от компресиран (http gzip компресия) javascript файл да бъде доста малка.

person CodesInChaos    schedule 29.11.2011
comment
Вярвам, че размерът на gzipped с функциите за псевдоним всъщност ще бъде по-голям, тъй като самите функции за псевдоним се броят към допълнителни байтове... - person Stephen Chung; 01.12.2011

Просто извиквам функцията create(e) вместо c(e). По този начин получавате най-доброто от двата свята, четливост и не е нужно да пишете толкова много.

person Bjørn Kjos-Hanssen    schedule 29.11.2011

Повечето минификатори няма да предефинират функциите на DOM библиотеката с по-кратки версии. Въпреки това, виждате този модел, направен на ръка в много библиотеки, за да намалите и/или опростите кода. Така че няма нищо лошо да направите това сами. Просто се уверете, че го правите вътре в затваряне....

Разгледайте опциите за uglifier и вижте какво може да направи за вас например:

{
  :mangle => true, # Mangle variables names
  :toplevel => false, # Mangle top-level variable names
  :except => [], # Variable names to be excluded from mangling
  :max_line_length => 32 * 1024, # Maximum line length
  :squeeze => true, # Squeeze code resulting in smaller, but less-readable code
  :seqs => true, # Reduce consecutive statements in blocks into single statement
  :dead_code => true, # Remove dead code (e.g. after return)
  :lift_vars => false, # Lift all var declarations at the start of the scope
  :unsafe => false, # Optimizations known to be unsafe in some situations
  :copyright => true, # Show copyright message
  :ascii_only => false, # Encode non-ASCII characters as Unicode code points
  :inline_script => false, # Escape </script
  :quote_keys => false, # Quote keys in object literals
  :beautify => false, # Ouput indented code
  :beautify_options => {
    :indent_level => 4,
    :indent_start => 0,
    :space_colon => false
  }
}
person maxl0rd    schedule 29.11.2011

Има смисъл, но минификатор, който прави това автоматично, трябва да е умен за няколко неща:

  1. Частта от кода, която е факторизирана в нова функция, повтаря ли се достатъчно пъти, за да направи този рефакторинг по-икономичен?
  2. Потенциално влошаване на производителността от опаковане на код в допълнителни функции: Особено когато това е код, който се използва много често в критичен във времето сценарий (профайлърът може да разбере това, минификаторът вероятно не може). Може би минификаторът може да постави ограничение на броя на заместванията в дълбоко вложени извиквания на функции и т.н.

Вероятно е по-добре да направите това ръчно.

person Ates Goral    schedule 29.11.2011
comment
Има ли удар в производителността, ако просто направя преименуване, както предлага Ерик: c=document.createElement? - person Christophe; 30.11.2011

Изцяло зависи от минификатора. Повечето не правят това. Например кодът:

window['a'] = document.createElement('div');
window['b'] = document.createElement('div');
window['c'] = document.createElement('div');

В разширен режим на Google Closure Compiler:

window.a=document.createElement("div");window.b=document.createElement("div");window.c=document.createElement("div");

На YUI Compressor:

window.a=document.createElement("div");window.b=document.createElement("div");window.c=document.createElement("div");

На jscompress.com:

window["a"]=document.createElement("div");window["b"]=document.createElement("div");window["c"]=document.createElement("div")

Предполагам, че компилаторите не са склонни да използват псевдоними на DOM методи в случай на странни странични ефекти, а също така повтарящите се низове в js така или иначе ще бъдат компресирани добре от gzip.

person Simon Sarris    schedule 29.11.2011