2012-06-06 2 views
2

У меня есть проблема, так как 3 дня теперь с закрытием Google, поскольку зависимость производится в неправильном порядке, я получил это:Google Closure: Dependencies ошибка

main.js

(function() { 
goog.provide('MYENGINE.Core'); 
goog.require('MYENGINE.engines.GraphicEngine'); 
goog.require('MYENGINE.engines.PhysicEngine'); 
goog.require('MYENGINE.engines.AudioEngine'); 
goog.require('MYENGINE.engines.GameEngine'); 

/********************************* 
* @constructor 
* 
**********************************/ 
ENGINE.Core = function() 
{ 

}; 

})(); 

И этот код (с именами):

(function() { 
goog.provide('MYENGINE.engines.GraphicEngine'); 

/********************************* 
* @constructor 
* 
**********************************/ 
MYENGINE.engines.GraphicEngine = function() 
{ 

}; 

})(); 

Я не знаю, почему, но когда я compilate это, «MYENGINE.engines.GraphicEngine» появляется первым перед тем MYENGINE.Core. Так что, когда я запустить страницу, я получил ошибку: * неперехваченного ReferenceError: MYENGINE не определен *

Я использую этот код для compilate проекта:

../extlib/closure/closure/bin/build/closurebuilder.py \ 
--root=../extlib/closure/ \ 
--root=../src \ 
--namespace="MYENGINE.Core" \ 
--output_mode=compiled \ 
--compiler_jar=compiler.jar \ 
> MYENGINE_min.js 

В моем " MYENGINE_min.js ", я могу найти создание GraphicEngine до основного или начального пространства имен (MYENGINE), я забыл что-то сделать?

Большое спасибо за помощь!

ответ

1

Закрытие конструировано таким образом, что вам не нужно обертывать каждый модуль анонимной функцией. Ваша ошибка должна исчезнуть, если вы удалите анонимные обертки функций. Например, main.js становится:

goog.provide('MYENGINE.Core'); 

goog.require('MYENGINE.engines.GraphicEngine'); 
goog.require('MYENGINE.engines.PhysicEngine'); 
goog.require('MYENGINE.engines.AudioEngine'); 
goog.require('MYENGINE.engines.GameEngine'); 

/** 
* @constructor 
*/ 
MYENGINE.Core = function() 
{ 

}; 

Вы также спросили:

I don't know why, but when i compile this, "MYENGINE.engines.GraphicEngine" appears first before MYENGINE.Core.

В MYENGINE.Core линия:

goog.require('MYENGINE.engines.GraphicEngine'); 

указывает, что MYENGINE.Core зависит от MYENGINE.engines.GraphicEngine. Поэтому MYENGINE.engines.GraphicEngine должен сначала отображаться так, чтобы он был определен при вызове из MYENGINE.Core. Например, Closure base.js обычно является первым источником в листинге, созданным Closure Builder, поскольку все остальные источники библиотеки Closure зависят от base.js для загрузки библиотеки.

Если вы хотите, чтобы обернуть скомпилированный JavaScript в анонимной функции дополнительного страхования от конфликтов имен, то Closure Compiler предоставляет следующий флаг:

 
--output_wrapper Interpolate output into this string at the place denoted 
        by the marker token %output%. 

Использование Closure Builder, выход обертка будет указанным на командная строка следующим образом:

--compiler_flags="--output_wrapper=(function(){%output%})();" 

Кроме того, настройка уровня предупреждения компилятора в подробном помогут ловить дополнительные ошибки во время компиляции:

--compiler_flags="--warning_level=VERBOSE" 

Новая команда сборки будет:

 
../extlib/closure/closure/bin/build/closurebuilder.py \ 
--root=../extlib/closure/ \ 
--root=../src \ 
--namespace="MYENGINE.Core" \ 
--output_mode=compiled \ 
--compiler_jar=compiler.jar \ 
--compiler_flags="--output_wrapper=(function(){%output%})();" \ 
--compiler_flags="--warning_level=VERBOSE" \ 
> MYENGINE_min.js 
+0

Большое спасибо, что лучше без анонимных функций оберток: D. – Dono

0

вы можете использовать GOOG.область применения

goog.scope(function(){ 
 
    //code here 
 
});

Смежные вопросы