jsdoc不能正确loggingnodejs模块

我试图让JSDOC(3)正确地logging我的NodeJS模块。 虽然简单的模块工作,我找不到方法来logging一个稍微复杂的模块。

我的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 (按这个顺序):在这种情况下,类是被识别的 ,但是只有构造函数被logging下来了 ,它的方法是logging为属于父模块

我尝试过成千上万种不同的组合,

  • 使用this.method=function() {...} (如ClassToExportOne所示this.method=function() {...}定义内部类方法,或者使用@lends {ClassToExportTwo.prototype}返回一个对象(如ClassToExportTwo所示)
  • 在每个类的头文件中使用@module MyModule.ClassToExportOne
  • 定义module.exports vs exports.xxxx
  • 声明内部类@private ,声明所有@private但出口
  • @module声明移动到第一次导出之前(整个混乱,然后一些东西被提升为“全局”,即使它在主闭包里面)
  • 如果在导出声明之前添加@exports <modulename> ,则会logging这些方法(与类方法混合使用)

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

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

以下作品适用于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; }()); 

以及创build模型实例的示例:

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

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

关键似乎是在@exports <modulename>.<classname>之前使用@exports <modulename>.<classname> ,通过这种方式,类在“classes”下出现在索引中, 如果方法是用 this.method=function() {...}

我仍然想find一种方法来完成这项工作,如果可能的话,对于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 } })()