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文件中定义的。 那么女巫方法更好吗?
答案 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.exportSymbol
和goog.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
}
}
您仍然导出构造函数本身,但不导出接口方法。