Любой способ использовать goog.require в разработке с соглашением по конфигурации?
Есть ли способ использовать Google Closure goog.require
управлять зависимостями JS, без необходимости явно регистрировать каждое пространство имен в файле dependencies.js?
Мне нравится идея компилятора для производства, но для разработки я бы хотел, чтобы какой-то конвенциональный перевод пространства имен в папку / путь JS был таким, чтобы что-то вроде goog.require('myapp.module')
автоматически импортирует myapp/module.js
в режиме разработки (если он еще не импортирован), а в производственном процессе все это скомпилировано в один файл.
Кажется, я помню старые версии dojo.require
работал таким образом. Любая идея, если Google Closure может сделать то же самое?
3 ответа
Есть ли способ использовать Google Closure
goog.require
управлять зависимостями JS, без необходимости явно регистрировать каждое пространство имен в файле dependencies.js?
Краткий ответ: нет. В некомпилированном коде JavaScript, goog.require()
опирается на граф зависимостей, сгенерированный вызовами goog.addDependency(relativePath, provides, requires).
Из документации DepsWriter:
Но как Closure Library узнает, какие файлы предоставляют какие пространства имен? В библиотеку Closure включен файл зависимостей по умолчанию с именем deps.js. Этот файл содержит одну строку для каждого файла JavaScript в библиотеке, каждый из которых указывает местоположение файла (относительно base.js), пространства имен, которые он предоставляет, и пространство имен, которое ему требуется.
В режиме отладки
goog.require()
выражение проверяет, было ли указано пространство имен require, и, если да, извлекает файлы, которые его предоставляют, и все его зависимости.Однако Closure Library поставляется только с файлом зависимостей для пространств имен в библиотеке. Если вы планируете написать свои собственные пространства имен (и вы, вероятно, будете), вы можете использовать
depswriter.py
создать файл зависимостей для создаваемых вами пространств имен.
При этом вы можете использовать инструмент, такой как plovr, который предоставляет режим "RAW" для объединения ваших источников JavaScript без компиляции. Это исключает необходимость создания файла deps, но также означает, что при отладке кода в браузере более сложно определить исходный файл, содержащий код.
В инструментах закрытия есть скрипт на python calcdeps.py, который генерирует именно то, что вам нужно.
Начало работы с goog.provide / goog.require:
Организуйте свои файлы в структуру каталогов, чтобы соответствовать пространству (именам), которое вы хотите. т.е. если вы объявляете пространство имен grantys.awesome.lib.Math, ваша структура каталогов должна выглядеть примерно как grantys/awesome/lib/Math.js.
В каждом файле, который вы добавляете в качестве зависимости, первый вызов функции javascript должен быть goog.provide ('grantys.awesome.lib.Math'). Чтобы зависеть от другого файла или файлов, объявите требование с помощью goog.require ('grantys.awesome.lib.Constants'). * это важно, goog.provide - это то, что использует calcdeps.py, чтобы выяснить, что может предоставить каждый файл - без компиляции это дает абсолютно нулевую гарантию того, что пространство имен, которое вы предоставляете, является тем, что вы создаете в этом файле.
Запустите calcdeps.py с правильными аргументами (пути для поиска файлов, которые могут содержать или не содержать goog.provide('some.library'), имя файла для записи и т. Д.). Это создаст файл, содержащий любые операторы goog.addDependency, которые вы в противном случае написали бы вручную. Также обратите внимание, что файл deps, который генерирует calcdeps, использует относительные пути, как видно из каталога, в который вы записываете выходной файл (не всегда из каталога, из которого вы запускаете команду)
Пример вывода файла calcdeps.py:
goog.addDependency("../site/ui/MurphyBed.js", ['site.ui.MurphyBed', 'site.ui.MurphyBed.State', 'site.ui.MurphyBed.EventType', 'site.ui.MurphyBed.Error'], ['goog.dom', 'goog.object', 'goog.events', 'goog.events.EventTarget', 'site.fx.easing', 'goog.fx.dom', 'goog.fx.AnimationSerialQueue']);
goog.addDependency("../site/ui/SliderButton.js", ['site.ui.SliderButton'], ['goog.ui.CustomButton', 'site.ui.SliderButtonRenderer', 'goog.fx.dom', 'site.fx.easing']);
В ваш html включите скрипт google base.js. Это объявляет объект Goog. После тега сценария base.js добавьте тег, который ссылается на ваш сгенерированный файл deps.js, который вы создали с помощью calcdeps.py выше.
Загрузите свои зависимости, используя goog.require ('grantys.awesome.lib.Math').
Примечание. Если вы измените зависимость, вы должны повторно запустить calcdeps.py. Мое собственное решение заключалось в том, чтобы обернуть его в сценарий оболочки с правильными аргументами, поэтому, когда я делаю изменение, которое требует повторного сканирования файлов, я просто запускаю./calcdeps.sh
base.js
файл определяет функцию goog.require()
, Вызов функции goog.require('goog.dom')
загружает файл JavaScript, который определяет функции в goog.dom
namespace вместе с любыми другими файлами из библиотеки Closure, которые нужны этим функциям.