【问题标题】:What is the best way to export library method, when using Closure Compiler?使用 Closure Compiler 时,导出库方法的最佳方法是什么?
【发布时间】:2012-02-02 11:57:03
【问题描述】:

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

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;

这行到外部文件:

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

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

【问题讨论】:

    标签: javascript google-closure-compiler


    【解决方案1】:

    如果你一直使用 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 复制到您的代码库中。

    【讨论】:

    • 这可以在没有@export 标签的情况下完成:Lib.prototype['invoke'] = function(str){};
    • 使用export 标记仍将重命名该方法,并且在内部使用短名称。它似乎是一种更简洁的方法,可以充分利用编译器的全部潜力,并且更具描述性。
    • 同意,但是您建议的带有export 标签的方法涉及goog 命名空间,因此该库不能单独使用。
    • 正如我所说,您可以将这两种方法添加到您的代码库中(复制和粘贴)。样式指南中也对此进行了描述。除此之外,compiled 库始终可以单独使用,因为所有依赖项都添加到 one 文件中。
    【解决方案2】:

    就个人而言,我喜欢在 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
      }  
    }
    

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

    【讨论】:

      猜你喜欢
      • 2013-04-21
      • 1970-01-01
      • 2023-01-19
      • 2022-10-20
      • 1970-01-01
      • 2011-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多