Closure编译器混合变量名称

时间:2013-03-24 15:39:41

标签: google-closure-compiler google-closure

我有一个问题,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

编译器这样做的原因是什么?

3 个答案:

答案 0 :(得分:0)

我能解释你问题的唯一方法就是发生两件事之一:

  1. Closure Compiler混淆和最小化代码存在问题,或者
  2. 您看到的错误来自于在Closure Compiler编译的代码之外运行的JavaScript,它直接引用了编译变量。
  3. 如果是前者,则应该隔离导致变量错位的案例和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作为未编译代码的两半的基本命名空间并且分别变为单独的xH命名空间的事实也表明更多的是在发挥作用。一些建议:

  • 如果您希望使用module模式,请将provide / require语句放在模块之外
  • 请勿使用var nam = nam || {}之类的内容手动创建名称空间,因为“已经为您提供了
  • 正如其他人所提到的,包含nam.jsConfignam.util.cookie的文件都应包含在单个编辑中
  • 确保goog.require('nam.jsConfig')文件中包含nam.util.cookie.readMyCookie,以确保符合相关要求

FWIW,我们在包含数百个文件的广泛应用程序中使用闭包,包含这样的相互依赖性。我非常怀疑问题不在于工具,而在于它们的使用方式。