2010-10-27 49 views
1

我喜欢Google Closure编译器如何优化代码中的符号。但是,我还没有找到一种好的方法来定义将配置对象作为参数的公共导出函数。考虑下面的代码片段:使用Google Closure定义配置对象的最佳方式

goog.provide('foo'); 
goog.require('goog.dom'); 

/** @typedef {{ 
*    id : string, 
*    clazz : string 
*   }} 
*/ 
foo.config; 

/** 
* Does some neat stuff 
* @param {foo.config} config 
*/  
foo.myFoo = function(config) { 
    var el = goog.dom.getElement(config.id); 
    goog.dom.classes.add(el, config.clazz); 
} 
goog.exportSymbol('foo.myFoo', foo.myFoo); 

现在假设我们加载这个脚本,并要拨打myFoo如下:

<script type="text/javascript"> 
foo.myFoo({ 
    id: 'unique-id', 
    clazz: 'pretty' 
}); 
</script> 

如果编译,这将失败,因为ID和clazz中性能进行了压缩。

有谁知道使用Google Closure编译器实现和导出配置对象的优雅方法吗?

回答

1

我的建议是简单地注释参数为{Object}和引用键,如下图所示:

foo.myFoo({ 
    'id': 'unique-id', 
    'clazz': 'pretty' 
}); 

... 

/** 
* Does some neat stuff 
* @param {Object} config 
*/  
foo.myFoo = function(config) { 
    var el = goog.dom.getElement(config['id']); 
    goog.dom.classes.add(el, config['clazz']); 
} 
+0

谢谢!我试图解决同样的问题,这工作。但我不确定我是否明白为什么编译器在使用点表示法时会混淆属性名称,但在使用方括号表示法时不会。我知道方括号表示法允许使用变量,但编译器是否也会混淆这些变量? – 2010-11-05 01:59:38

+0

为什么要将参数更改为“对象”?他的类型定义很好,他只需要声明一个extern或者使用字符串文字:config ['id']'而不是'config.id'。删除正确的类型定义意味着如果他从编译的代码中调用了该函数,他就不会有任何类型检查。打败点,不是? – EMMERICH 2011-03-01 09:07:14

+0

我对注解的理解是它用于人类,使其更像一条更优雅的评论线。更重要的是,如果该方法使用不当,它可以让谷歌抛出错误。 – 2011-05-24 19:58:42

1

关于错位和原材料的属性名称

你得的任何冲突:

  • “extern”属性名称(以便它们不会被重命名)
  • 使用“括号内的符号”访问propertiies

关于配置对象

按照关闭编译文档,目前你不能做到这一点。你必须将param标记为Object。

可以定义类型,但由于类型需要所有属性存在它不会帮助你,但你可能只在配置对象设置一些参数。

Closure Compiler文档建议您将该参数标记为Object,但记录注释中的字段。