使用Closure Compiler时,导出库方法的最佳方法是什么?

时间:2012-02-02 11:57:04

标签: javascript google-closure-compiler

Closure Compiler文档明确指出:“不要使用Externs而不是Exports”。因为Externs非常方便使用,所以我遇到了一个问题:

function Lib(){ 
  //some initialization  
}
Lib.prototype = {
  invoke : function(str){
     //this function is called from outside to invoke some of Lib's events
  }  
}

使用带有 ADVANCED_OPTIMIZATIONS 的Closure Compiler时,将从源中删除函数调用。可以通过两种方式防止这种情况: 在原型定义后添加行:

Lib.prototype['invoke'] = Lib.prototype.invoke;

但是这会在输出代码的末尾添加一个丑陋的代码:

Lib.prototype.invoke = Lib.prototype.g;

我设法通过将这一行添加到构造函数来摆脱这个:

this.invoke = this.invoke;

这行到externs文件:

/**
* @param {String} str
*/ 
Lib.prototype.invoke = function(str){};

这样,Closure Compiler不能从输出代码中删除invoke函数,因为它是在构造函数中自己分配的,而且它也不能重命名它,因为它是在externs文件中定义的。 那么女巫方法更好吗?

2 个答案:

答案 0 :(得分:3)

如果您始终使用JSDoc,则可以使用@export tag

/**
* @param {String} str
* @export
*/ 
Lib.prototype.invoke = function(str){
     //this function is called from outside to invoke some of Lib's events
};

并使用--generate_exports标志调用编译器。

这要求您包含Google Closure库中的base.js,或者将goog.exportSymbolgoog.exportProperty复制到您的代码库。

答案 1 :(得分:3)

就个人而言,我喜欢在externs文件中定义接口,并让我的内部类实现它们。

// Externs

/** @interface */
function IInvoke {};
IInvoke.prototype.invoke;

/** 
 *  @constructor
 *  @implements {IInvoke}
 */
function Lib(){ 
  //some initialization  
}
Lib.prototype = {
  invoke : function(str){
     //this function is called from outside to invoke some of Lib's events
  }  
}

您仍然导出构造函数本身,但不导出接口方法。