我有一个问题,Closure Compiler重命名一个像x.sa.xa这样的全局变量,但是在引用该全局变量的所有函数中,编译器将其重命名为其他类似H.sa.xa
当我查看HTML页面时,我收到一个JavaScript TypeError:H.sa.xa未定义。
// Top-level namespace for all the code
var nam = nam || {};
(function($, nam) {
goog.provide('nam.jsConfig');
nam.jsConfig.cookies = {"RECENT_ITEMS": "recentitems"};
})($, nam);
(function($, nam) {
goog.provide('nam.util.cookie');
nam.util.cookie.readMyCookie = function () {
var ritems_cookie = nam.util.cookie.JSONCookie.get(nam.jsConfig.cookies['RECENT_ITEMS']);
};
})($, nam);
Closure Compiled Code:
x.sa = {};
x.sa.xa = {RECENT_ITEMS:"recentitems"};
H.a = {};
H.a.cookie = {};
H.a.Tm = function() {
var a = H.a.cookie.ja.get(H.sa.xa.RECENT_ITEMS);
};
出于某种原因,Closure Compiler引用 H .sa.xa.RECENT_ITEMS而不是 x .sa.xa.RECENT_ITEMS
编译器这样做的原因是什么?
答案 0 :(得分:0)
我能解释你问题的唯一方法就是发生两件事之一:
如果是前者,则应该隔离导致变量错位的案例和submit it as a bug to Google。我们所有使用Closure Compiler的人都会非常感激。
相反,如果我怀疑它是后者,那么您很可能不会导出您希望在编译代码之外使用的全局变量。最简单的方法是调用goog.exportSymbol()
函数,使全局变量在Closure Compiler汇编的代码之外可用。例如,如果您希望从未编译的代码中以编译模式访问属性sandwich.meat.Ham
,则可以执行以下操作:
goog.exportSymbol('sandwich.meat.Ham', sandwich.meat.Ham);
然后,您可以在编译代码之外存在一些引用导出变量的代码:
function() {
var meat = new sandwich.meat.Ham();
}
答案 1 :(得分:0)
让我猜猜你在做什么:在ADVANCED模式下独立编译每个文件。如果是这样,这不是ADVANCED模式的工作原理。在高级模式下,如果要在编译作业之间共享变量和属性,则需要将其导出。
答案 2 :(得分:0)
您提供的代码示例中存在更多重要问题。一个人
goog.provide('nam.util.cookie');
变成了
H.a = {};
H.a.cookie = {};
后来这段代码:
nam.util.cookie.readMyCookie = function () {...
变成了
H.a.Tm = function() {...
人们期望它应该是
H.a.cookie.Tm = function() {...
此外,您使用nam
作为未编译代码的两半的基本命名空间并且分别变为单独的x
和H
命名空间的事实也表明更多的是在发挥作用。一些建议:
var nam = nam || {}
之类的内容手动创建名称空间,因为“已经为您提供了nam.jsConfig
和nam.util.cookie
的文件都应包含在单个编辑中goog.require('nam.jsConfig')
文件中包含nam.util.cookie.readMyCookie
,以确保符合相关要求FWIW,我们在包含数百个文件的广泛应用程序中使用闭包,包含这样的相互依赖性。我非常怀疑问题不在于工具,而在于它们的使用方式。