Как разбить мой 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/обеспечить вызовы.
Ответ 2
Вы также можете установить выходной путь, например:
- module_output_path_prefix./public/js/
См. также:
Использование опции -module в Closure Compiler для создания нескольких выходных файлов