Google Closure Compiler умеет собирать javascript не в виде одного большого файла, а в виде нескольких модулей.
Так что все страницы могут грузить только один модуль, а дополнительная функциональность - загружаться лишь там, где она нужна.
Для такой сборки используется флаг компилятора --module.
Например:
java -jar compiler.jar --js src1.js --js src2.js --js src3.js --module first:2 --module second:1:first
Создаст модули: first.js и second.js.
Первый модуль, который назван "first", создан из объединенного и оптимизированного кода двух файлов: src1.js и src2.js (первые два параметра --js).
Второй модуль, который назван "second", создан из src3.js - это следующий аргумент --js после включенных в первый модуль. Второй модуль зависит от первого.
Флаг --module second:1:first как раз и означает, что модуль second будет создан из одного файла после вошедших в предыдущий модуль (first) и зависит от модуля first.
Пусть у нас есть следующие файлы.
main.js - основная библиотека
my = {}
my.main = function() {
alert('main')
}
hello.js - первый модуль
my.hello = function() {
my.main()
alert('hello')
}
bye.js - второй модуль
my.bye = function() {
my.main()
alert('bye')
}
hello и bye зависят от main.
Следующая команда соберет три модуля: first.js - основой модуль из main.js, second и third - из hello.js и bye.js соответственно.
java -jar compiler.jar --js main.js --js hello.js --js bye.js --module first:1 --module second:1:first --module third:1:first --compilation_level ADVANCED_OPTIMIZATIONS
Результат:
my={};my.a=function(){alert("main")};
my.c=function(){my.a();alert("hello")};
my.b=function(){my.a();alert("bye")};
Этот пример демонстрирует самую важную фичу модулей, ради которой они и задумывались - сохранение связности переменованных переменных.
В частности - обратим внимание, функция my.main (main.js) была переименована в my.a, и именно в таком виде она вызывается в модулях second.js и third.js.
Разумеется, вы можете использовать много файлов для каждого из модулей.
Перечислять файлы --js нужно в том же порядке, в котором они зависят друг от друга.
Директива --module обрабатывается, буквально, так:
first из первого файла в списке.second, зависящий от first.third, зависящий от first.При этом зависимость одного модуля от другого означает, что все символы будут переименованы синхронно. Это особенно важно при продвинутой оптимизации.
Есть одно ограничение - разные модули не могут содержать одни и те же файлы. То есть, не получится сделать два модуля, первый из которых включает в себя A.js и B.js, а второй - снова (нельзя) A.js и C.js.
Если вы используете goog.provide/require - компилятор при сборке обработает их и проверит все зависимости.
Как правило, такая сборка осуществляется утилитой calcdeps и описана в статье Система сборки и зависимостей Google Closure Library.
Флаг --module - основной, но есть еще несколько дополнительных.
./--module_wrapper "/* copyright 2009-2010 */ %s"
Сборка модулей очень полезна, если некоторые из ваших страниц используют большое количество специфического javascript.
Например, у меня это страницы со сложными интерфейсами, такими что грузить их везде - совсем-совсем некошер. Думаю, что-то такое есть и у вас. Google Closure Compiler позволяет решить эту проблему.
Быстрых всем страничек 