2015-06-09 68 views
4

我试图让JSDOC(3)正确记录我的NodeJS模块。虽然简单的模块工作,但我找不到方法来记录一个稍微复杂的模块。jsdoc没有正确记录nodejs模块

我的NodeJS模块具有以下结构:

/** @module MyModule */ 
(function() { 


    function functionToExportOne {...} 

    function functionToExportTwo {...} 

    /** 
     * @module MyModule.ClassToExportOne 
     * @constructor 
     */ 
    function ClassToExportOne { 

      this.classMethodOne=function() { ... } 
      this.classMethodTwo=function() { ... } 

    } 

    /** @constructor */ 
    function ClassToExportTwo { 

      function classMethodOne() { ... } 
      function classMethodTwo() { ... } 

      return /** @lends {ClassToExportTwo.prototype} */ { 

       methodOne:classMethodOne, 
       methodTwo:classMethodTwo 
      } 
    } 
    /** @exports MyModule */ <--- late addition, see comments 
    module.exports={ 
     functionOne:functionToExportOne, 
     functionTwo:functionToExportTwo, 
     classOne:ClassToExportOne, 
     classTwo:ClassToExportTwo 
    } 
})() 

嗯,正如你看到的,模块出口这两种方法和类的构造函数。没什么很奇怪的。

问题是,JSDOC

  • 总是无法识别内部类,
  • 错误第一内部类的方法如(外)模块的方法,
  • 总是跳过真实导出模块方法。
  • 最近我一直是在ClassToExportOne,当我使用@module MyModule.<className>随后@constructor(按照这个顺序):在这种情况下,类是公认,但只有构造函数记录,其方法是记录为归属于母公司模块

我已经试过数千种不同的组合没有成功:定义与this.method=function() {...}内部类方法

  • (如德在ClassToExportOne picted)中或在每个类
  • 限定module.exports VS exports.xxxx
  • 宣告内部类@private的报头中使用@module MyModule.ClassToExportOne返回使用与@lends {ClassToExportTwo.prototype}方法的对象(如在ClassToExportTwo描绘)
  • ,宣告一切@private但出口
  • 移动@module声明之前的第一个出口(总乱七八糟的话,一些东西被晋升为“全球性”,即使它是最主要的闭包!!)
  • 如果我添加@exports <modulename>只是在出口申报之前,方法被记录(与类方法混合)

我已经尝试了所有建议http://usejsdoc.org/howto-commonjs-modules.html没有成功。

我敢肯定我错过了什么,但找不到什么。

回答

1

我讨厌回答我自己的问题,但多了一些尝试和错误,我得到了相当满意的结果。请随时评论,如果这是一个正确的做法,但事实是文件现在正确生成:)

关键似乎是使用@exports <modulename>.<classname>之前@constructor,这样的类出现在索引下的“类”和它的方法正确记录如果方法与声明this.method=function() {...}

我还是想找到一种方法,使这项工作,如果可能的话,在ClassToExportTwo所描绘的情况下,有时是很方便对于我来说这样定义一个类,特别是对于调用私有方法的长类,所以我可以避免在类内部完全使用“this”(优化)。

那么这里是为我工作的模板:

/** @module MyModule */ 
(function() { 


    function functionToExportOne {...} 

    function functionToExportTwo {...} 

    /** works !! 
     * @exports MyModule.ClassToExportOne 
     * @constructor 
     */ 
    function ClassToExportOne { 

      function innerMethod() { ... } 

      // this works: assigning methods to this 

      this.classMethodOne=function() { ... } 
      this.classMethodTwo=function() { ... } 

    } 

    /** does not work 
     * @exports MyModule.ClassToExportTwo 
     * @constructor 
     */   
    function ClassToExportTwo { 

      function classMethodOne() { ... } 
      function classMethodTwo() { ... } 

      // this DOES NOT WORK !! Methods get mixed with parent module 
      return { 

       methodOne:classMethodOne, 
       methodTwo:classMethodTwo 
      } 
    } 

    // no more @exports here as it duplicates definitions in the docs 
    module.exports={ 
     /** blah blah function description */ 
     functionOne:functionToExportOne, 
     /** blah blah function description */ 
     functionTwo:functionToExportTwo, 
     /** blah blah function description */ 
     classOne:ClassToExportOne, 
     /** blah blah function description */ 
     classTwo:ClassToExportTwo 
    } 
})() 
+0

这正是我所需要的。谢谢。当父类位于自己的模块中时,我无法让JSDOC正确地为我的子类生成文档。 –

4

对我jsdoc 3.3.3以下工作:

/** 
* Example model. 
* 
* @module model/example 
*/ 
module.exports = (function() { 
    /** 
    * Constructor function. 
    * 
    * @exports model/example.Example 
    * @constructor 
    * @param {string} id 
    */ 
    var example = function Example(id) { 
     this.id = id; 
    }; 

    /** 
    * Returns the ID. 
    * 
    * @memberof model/example.Example 
    * @returns {string} the id 
    */ 
    example.prototype.getId = function() { 
     return this.id; 
    }; 

    return example; 
}()); 

和实例创建模型的实例:

var example = new Example("ID"); 
console.log(example.getId());