Предварительная минимизация условного включения в Javascript: существует ли такой инструмент? - PullRequest
1 голос
/ 08 июня 2011

Все минификаторы JS, которые я могу найти, работают с помощью комбинации устранения пробелов, переименования переменных и регулярного сжатия. Однако можно было бы сократить гораздо больше, если бы минимизатору было известно о том, какая функциональность в модуле требуется для проекта, для которого он минимизируется.

Допустим, проект использует underscore.js , но использует только экспортированные функции _.isEmpty и _.isArray. Глядя на источник , минимизатор может просто включать _.isEmpty, _.isArray, _.isString и _.hasOwnProperty.

Выполнение этого, вероятно, потребовало бы разметки источника модуля, чтобы сказать, что к чему, и для выражения внутримодульных зависимостей, например ::

//{{ "_.isEmpty" depends "_.isArray", "_.isString", "_.hasOwnProperty"
_.isEmpty = function(obj) {
  if (_.isArray(obj) || _.isString(obj)) return obj.length === 0;
  for (var key in obj) if (hasOwnProperty.call(obj, key)) return false;
  return true;
};
//}}

Затем можно запустить minify underscore.js ["_.isEmpty", "_.isArray"], чтобы вырезать все, что не требуется. В качестве альтернативы, вы можете включить те же теги в свой код, чтобы выразить эти обязательные части underscore.js, затем связать свой код с подчеркиванием и условно скомпилировать результат. В обоих случаях вы можете запустить стандартный минификатор в конце.

Как описано, это даже не специфично для JS, поэтому что-то должно где-то существовать. Возможно, более умное условное включение может проанализировать код для обнаружения зависимостей, но это трудная проблема.


Я ищу "минификатор" JS, который обрезает мертвый код, чему помогают аннотации зависимостей. Существует ли такая вещь?

1 Ответ

2 голосов
/ 08 июня 2011

Компилятор Google Closure * Функция "расширенной компиляции" делает то, что вы хотите - он анализирует ваш JavaScript-код и автоматически удаляет его мертвый код ( попробуйте онлайн ). Недостатком является то, что вам , возможно, придется внести изменения в ваш код , чтобы он работал, хотя.

...