Все минификаторы 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, который обрезает мертвый код, чему помогают аннотации зависимостей. Существует ли такая вещь?