0

我有一个问题,闭包编译器重命名一个全局变量,例如 x.sa.xa,但是在所有引用该全局变量的函数中,编译器将它重命名为 H.sa.xa 之类的其他东西

当我查看 HTML 页面时,我得到一个 JavaScript TypeError: H.sa.xa is undefined。

// 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);
};

由于某种原因,闭包编译器引用H .sa.xa.RECENT_ITEMS 而不是x .sa.xa.RECENT_ITEMS

编译器这样做的任何原因?

4

3 回答 3

0

让我猜猜你在做什么:在高级模式下独立编译每个文件。如果是这样,这不是高级模式的工作方式。在高级模式下,如果要在编译作业之间共享变量和属性,则需要导出它们。

于 2013-03-25T16:52:29.843 回答
0

我可以解释您的问题的唯一方法是正在发生两件事之一:

  1. Closure Compiler 的混淆和最小化代码存在问题,或者
  2. 您看到的错误来自于在 Closure Compiler 编译的代码之外运行的 JavaScript,该代码直接引用了已编译的变量。

如果是前者,您应该隔离导致变量错位的情况并将其作为错误提交给 Google。我们所有使用 Closure Compiler 的人都会非常感激它。

相反,如果我怀疑是后者,那么您很可能不会导出您希望在编译代码之外使用的全局变量。最简单的方法是调用goog.exportSymbol()函数以使全局变量在闭包编译器组装的代码之外可用。例如,如果您希望sandwich.meat.Ham从非编译代码以编译模式访问属性,您可以执行以下操作:

goog.exportSymbol('sandwich.meat.Ham', sandwich.meat.Ham);

然后你可能有一些代码存在于你的编译代码之外,这些代码引用了导出的变量:

function() {
    var meat = new sandwich.meat.Ham();
}
于 2013-03-25T00:23:03.123 回答
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命名空间,这一事实也表明更多的东西在起作用。一些建议:

  • 如果您希望使用模块模式,请将提供/要求语句放在模块之外
  • 不要使用诸如此类的东西手动创建名称空间,var nam = nam || {}因为提供已经为您执行此操作
  • 正如其他人所提到的,两个文件都包含nam.jsConfig并且nam.util.cookie应该包含在单个编译中
  • 确保您goog.require('nam.jsConfig')在文件中带有nam.util.cookie.readMyCookie, 以确保满足依赖项要求

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

于 2013-04-06T09:00:51.217 回答