Как разбить мой javascript на модули с помощью Google Closure Compiler?

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

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

Я искал об этом и обнаружил, что могу использовать goog.provide/good.require, чтобы контролировать зависимости между различными js файлами. Проблема в том, что он добавляет код в мои js, которые мне просто не нужны или не нужны, например:

goog.provide("mainFile")

добавит следующее:

var mainFile = {};

в скомпилированный js файл, чего я не хочу. Мы вообще не используем библиотеку закрытия google, все, что я хочу использовать, это компилятор.

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


Изменить

Цель состоит в том, чтобы иметь возможность создавать модули, такие как ответ в этом потоке: Использование опции -module в Closure Compiler для создания нескольких выходных файлов

И поэтому я хочу добавить к этому возможность контролировать, какие файлы переходят в какой модуль, а также иметь контроль над их порядком. Пока я не использую подстановочные знаки, но я планирую сделать это в будущем (если это возможно).

просто "cat file1.js file2.js > combination.js && compile..." отлично, но в нашем случае это немного сложнее, и нам придется написать программу /script что делает это на основе некоторой логики. Если мы сможем каким-то образом сообщить компилятору, что порядок файлов в расширенном состоянии может просто сэкономить время реализации такой программы.

Спасибо.

Ответы

Ответ 1

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

Каждое использование флага -module описывает выходной файл и его зависимости. Каждый флаг модуля следует за следующим синтаксисом:

--js inputfile.js
--module name:num_files:dependency

Результирующий выходной файл будет name.js и включает файлы, указанные предыдущим флагом -js.

Опция зависимости - это то, что вас больше всего интересует. Оно указывает, что такое родительский модуль. Параметры модуля должны описывать допустимое дерево зависимостей (у вас должен быть базовый модуль).

Вот пример:

--js commonfunctions.js
--module common:1
--js page1functions.js
--js page1events.js
--module page1:2:common
--js page2function.js
--module page2:1:common
--js page1addons.js
--module page1addons:1:page1

В этом случае вы сообщаете компилятору, что модули page1 и page2 зависят от общего модуля и что модуль page1addons зависит от модуля page1.

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

Ничто из этого не требует закрывающей библиотеки или использования goog.require/обеспечивает вызовы и не добавляет никакого кода к вашему выводу. Если вы хотите, чтобы компилятор автоматически определял зависимости или мог управлять этими зависимостями, вам понадобится goog.require/обеспечить вызовы.