Сжатие нескольких файлов JavaScript в отдельные файлы

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

У меня есть проект с общими скриптами (jQuery и некоторыми другими) и конкретными страницами. jQuery Mobile позволяет кэшировать общие сценарии во время сеанса, загружая все, что находится в <head>, только один раз. Конкретные сценарии извлекаются только в том случае, если страница загружена, пока вы помещаете <script> в <div data-role="page">.

Я нахожу это замечательным, потому что он оптимизирует сценарии, которые загружаются при просмотре страниц моего приложения, и гарантирует, что браузер всегда имеет минимальный javascript в памяти.

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

Пока нашел два решения, которые меня не очень устраивают:

  • используя простой скрипт минификации, который не меняет имена функций и переменных: он удваивает размер файлов по сравнению с расширенной версией
  • сгруппировать все сценарии в один и сжать его, а затем поместить в <head>: вы потеряете возможность загружать только те сценарии, которые вам могут понадобиться, и в браузере загружены ненужные функции

(Я исключаю ручное изменение имен функций, очевидно;))

Я ищу компрессор, который мог бы сделать одно из этих:

  • сжимайте все файлы вместе, но выводите их в отдельные файлы, чтобы сохранить модульность
  • если это невозможно, сжимайте файлы независимо расширенным способом, но с тегами, которые могут помешать минификатору переименовывать ссылки на внешние функции или переменные (например, jQuery)

Он существует?


person Mad Echet    schedule 28.03.2012    source источник


Ответы (1)


После более подробного ознакомления со всем этим Google Closure Compiler может сделать это (и многое другое).

Путь - определить externs для:

Очевидно, что если вы сжимаете самодельные скрипты, которые загружаются отдельно, вам следует экспортировать переменные, которые вы хотите использовать в другом месте, используя следующую технику (подробно описано в документации Closure Compiler):

/**
 * A function you want to be able to call from elsewhere after compressing
 * @param {string} a
 */
function exportedFunction(a) {alert(a);}

window['exportedFunction'] = exportedFunction;

Затем вы можете сжимать нужные файлы пакетно или по отдельности. Это такой мощный инструмент, что я не могу поверить, что не использовал его раньше.

person Mad Echet    schedule 27.04.2012