Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用闭包编译器时,导出库方法的最佳方法是什么?_Javascript_Google Closure Compiler - Fatal编程技术网

Javascript 使用闭包编译器时,导出库方法的最佳方法是什么?

Javascript 使用闭包编译器时,导出库方法的最佳方法是什么?,javascript,google-closure-compiler,Javascript,Google Closure Compiler,闭包编译器文档明确指出:“不要使用外部程序而不是导出”。由于Externs非常方便使用,我遇到了一个问题: function Lib(){ //some initialization } Lib.prototype = { invoke : function(str){ //this function is called from outside to invoke some of Lib's events } } 将闭包编译器与高级优化一起使用时,函数调用将从

闭包编译器文档明确指出:“不要使用外部程序而不是导出”。由于Externs非常方便使用,我遇到了一个问题:

function Lib(){ 
  //some initialization  
}
Lib.prototype = {
  invoke : function(str){
     //this function is called from outside to invoke some of Lib's events
  }  
}
将闭包编译器与高级优化一起使用时,函数调用将从源代码中删除。这可以通过两种方式防止: 在原型定义后添加行:

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){};
这样,闭包编译器就不能从输出代码中删除invoke函数,因为它是在构造函数中自己分配的,也不能重命名它,因为它是在externs文件中定义的。
所以witch方法更好?

如果您一致使用JSDoc,您可以使用:

并使用
--generate\u exports
标志调用编译器


这要求您要么从Google闭包库中包含,要么将
goog.exportSymbol
goog.exportProperty
复制到您的代码库中。

我个人喜欢在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
  }  
}

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

这可以在没有
@export
标记的情况下完成:
Lib.prototype['invoke']=function(str){}使用
export
标记仍将重命名该方法,并且短名称在内部使用。这似乎是一种更干净的方法,可以充分利用编译器的潜力,并且更具描述性。同意,但是您建议的使用
export
标记的方法涉及
goog
命名空间,因此该库不能单独使用。正如我所说,您可以将这两种方法添加到您的代码库中(复制和粘贴)。样式指南中也介绍了这一点。除此之外,编译后的库始终可以独立使用,因为所有依赖项都添加到一个文件中。
// 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
  }  
}