我使用了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,例如重命名?
答案 0 :(得分:4)
如果您正在使用对象文字并且不想再添加任何类型信息,则可以'quote'
属性名称。这会导致它们的值被直接使用,并防止它们被用作推断类型的一部分(正如您所见,可以对其进行优化/替换)。
// namespace controls and constants
var olc = {
'lon' : 2.0,
'lat' : 25.0,
'rota' : 0,
'zoom' : 2, // as default
'debug': 'force'
};
此优化是在每个目标/项目级别执行,而不是按功能执行,因此zoom
和debug
未被替换的原因可能与他们的位置/方式有关其他属性名称在程序的其他地方使用。 你不应该依赖于此,它可能会无法预测地改变。如果你需要zoom
保持书面形式,你必须像lat
和{{1}那样引用/保护它}}
Closure类型系统非常有用,并且像这样避免它将阻止它能够使用这些值检测到一些潜在的错误。相反,您可以在Closure的系统中为对象/值提供一个类型,它将进行错误检查,但不知道是否重命名。
令人遗憾的是,有很多方法可以做到这一点,其中许多方法都依赖于Closure Compiler设置的微妙组合。 (文档可能会告诉您使用lon
,但即使那些在某些情况下也不起作用。)这是我经常使用的解决方案,因为它在大多数设置下都能正常工作,并且在概念上很容易理解:使用您需要保留的属性定义外部接口,并将其应用于您的对象。
您可以在“externs文件”中定义此接口类型,如果您使用命令行,则可以使用 请注意,不再引用属性名称。我们现在希望Closure理解它们,而不是忽略它们。 为什么这样做? externs文件告诉Closure“这个@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
// 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"中的任何内容包含在默认情况下。我需要更多地研究为什么zoom
和debug
没有被重命名,但它可能是其中一个类别。
有几种方法可以防止在闭包编译器中重命名(并且搜索该短语可能会带来更多建议)。一种快速的方法是将属性名称放在引号中,如下所示:
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。
的文档