【问题标题】:Google Closure Namespace Clash谷歌闭包命名空间冲突
【发布时间】:2015-05-20 01:46:58
【问题描述】:

我有一个使用 Google Closure 编译的 JavaScript 模块。该模块需要包含在一个网页中,该网页还包含一些第三方无关代码。

问题是两段代码都使用命名空间“com”,所以:com.companyone.x.y.z 和 com.companytwo.x.y.z

似乎闭包编译器会自动生成代码来创建名称空间,如下所示:

var com = {mycompany: {}};

因此会覆盖之前使用过 com 命名空间的任何其他内容。

如果我要手动编写,我会先检查命名空间是否存在,如下所示:

var com=com||{};
com.mycompany=com.mycompany||{}; 

作为临时解决方案,我正在考虑将“var com={”自动替换为“var com=com||{”,但这似乎很麻烦。

有没有办法确保闭包编译器不会擦除覆盖现有的 com 命名空间?

【问题讨论】:

  • 你在使用编译器的 AMD/CommonJS 支持吗?
  • 您需要发布代码以便我们重现该问题。就目前而言,您没有提供足够的信息。这不仅包括 Javascript,还包括您正在使用的编译标志。

标签: javascript google-closure-compiler google-closure


【解决方案1】:

一个好的做法是隔离您的定义以尽可能少地干扰其他定义。

--output_wrapper    (function(){%output%})()

这将为变量创建一个新的词法范围。例如:

var com = 'example';
(function() {
     var com = {mycompany: {}};
})();

作用域内的com 不会影响作用域外的com

如果您需要引用全局变量——比如全局com,请使用goog.global

 goog.global.com

如果您需要将变量“导出”到全局范围,可以使用goog.exportSymbol。这将保留已定义的命名空间。


虽然我实际上不确定编译器会生成您发布的代码的情况;举个例子会很有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-20
    • 2016-08-11
    • 1970-01-01
    • 2013-01-26
    • 2010-11-15
    • 2012-12-18
    • 2012-02-06
    相关资源
    最近更新 更多