如何在closure-compiler中排除对象重命名

时间:2017-05-06 13:02:09

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

我使用了closure-util,并且想要重命名一个对象来改变html中的内容 在我的第一步中,我想与openlayers 3 | 4一起编译我的模块 我不熟悉externs,export或api,所以我需要帮助声明关闭编译器。

代码段.html(未编译)

  olc.lon=7.11875;olc.lat=51.15345;olc.zoom=12;
将编译main.js中的

片段声明

var olc = {      // namespace controls and constants
  lon         :  2.0,lat: 25.0,rota: 0,zoom: 2, // as default
  debug       :  'force'
};
window['olc'] = olc;

编译后现在 - olc.lon更名为olc.B,
- olc.lat更名为olc.uj,
- olc.rota更名为olc.mf,
- olc.zoom没有重命名,我不知道为什么不和 - olc.debug未重命名。

是否存在缩放等受保护的字词? 我如何保护olc.lon,例如重命名?

2 个答案:

答案 0 :(得分:4)

避免关闭类型系统

如果您正在使用对象文字并且不想再添加任何类型信息,则可以'quote'属性名称。这会导致它们的值被直接使用,并防止它们被用作推断类型的一部分(正如您所见,可以对其进行优化/替换)。

// namespace controls and constants
var olc = {
  'lon'  : 2.0,
  'lat'  : 25.0,
  'rota' : 0,
  'zoom' : 2, // as default
  'debug': 'force'
};

此优化是在每个目标/项目级别执行,而不是按功能执行,因此zoomdebug未被替换的原因可能与他们的位置/方式有关其他属性名称在程序的其他地方使用。 你不应该依赖于此,它可能会无法预测地改变。如果你需要zoom保持书面形式,你必须像lat和{{1}那样引用/保护它}}

使用Closure Type System

Closure类型系统非常有用,并且像这样避免它将阻止它能够使用这些值检测到一些潜在的错误。相反,您可以在Closure的系统中为对象/值提供一个类型,它将进行错误检查,但不知道是否重命名。

令人遗憾的是,有很多方法可以做到这一点,其中许多方法都依赖于Closure Compiler设置的微妙组合。 (文档可能会告诉您使用lon,但即使那些在某些情况下也不起作用。)这是我经常使用的解决方案,因为它在大多数设置下都能正常工作,并且在概念上很容易理解:使用您需要保留的属性定义外部接口,并将其应用于您的对象。

您可以在“externs文件”中定义此接口类型,如果您使用命令行,则可以使用@exports标记将其包含在构建中(请参阅"Declaring Externs" in the documentation)。 / p> 的 --externs

/externs.js
/** @interface */ function ControlsAndConstants() {} /** @type {number} */ ControlsAndConstants.prototype.lat; /** @type {number} */ ControlsAndConstants.prototype.lon; /** @type {number} */ ControlsAndConstants.prototype.rota; /** @type {number} */ ControlsAndConstants.prototype.zoom; /** @type {*} */ ControlsAndConstants.prototype.debug;
/main.js

请注意,不再引用属性名称。我们现在希望Closure理解它们,而不是忽略它们。

为什么这样做? externs文件告诉Closure“这个// namespace controls and constants var olc = /** @type {ControlsAndConstants} */ ({ lon : 2.0, lat : 25.0, rota : 0, zoom : 2, // as default debug: 'force' }); window['olc'] = olc; 接口已经存在并且正在被你不编译的代码使用。因为你无法优化该代码来重命名属性,你需要自己使用相同的属性名称兼容性。”很简单!

答案 1 :(得分:1)

是的,有受保护的单词,包括任何现有的全局变量(表示window对象的任何属性)和JavaScript关键字,可能还有更多。标准" externs"中的任何内容包含在默认情况下。我需要更多地研究为什么zoomdebug没有被重命名,但它可能是其中一个类别。

有几种方法可以防止在闭包编译器中重命名(并且搜索该短语可能会带来更多建议)。一种快速的方法是将属性名称放在引号中,如下所示:

var olc = {
  'lon': 2.0,
  'lat': 25.0,
  'rota': 0,
  zoom: 2,
  debug:'force'
};
window['olc'] = olc;

example of the online closure compiler on the above code

你也可以定义自己的" externs"防止重命名属性。请参阅有关Advanced Compilation and Externs

的文档