【问题标题】:Utilizing docstrings使用文档字符串
【发布时间】:2015-12-10 15:24:59
【问题描述】:

这是一个新手问题,但我没有设法在谷歌上搜索到任何合理简洁但对这个主题有启发性的内容。我有 Sublime Text 编辑器和一个出色的插件 DocBlockr https://github.com/spadgos/sublime-jsdocs ,这让正确的评论变得轻而易举。在我完成了cmets之后我应该做什么?至少,我希望能够在 REPL 中调用注释。还有哪些明智的文档可用?对于中等脚本,我想要一些轻量级和简单的东西。

编辑:

var helper = exports.helper = (function() {

...

  /**
   * Reduces a sequence of names to initials.
   * @param  {String} name  Space Delimited sequence of names.
   * @param  {String} sep   A period separating the initials.
   * @param  {String} trail A period ending the initials.
   * @param  {String} hyph  A hypen separating double names.
   * @return {String}       Properly formatted initials.
   */
  function makeInits(name, sep, trail, hyph) {
    function splitBySpace(nm) {
      return nm.trim().split(/\s+/).map(function(x) {return x[0]}).join(sep).toUpperCase();
    }
    return name.split(hyph).map(splitBySpace).join(hyph) + trail;
  }
  /**
   * Reduces a sequence of names to initials.
   * @param  {String} name Space delimited sequence of names.
   * @return {String}      Properly formatted initials.
   */
  function makeInitials(name) {
    return makeInits(name, '.', '.', '-');
  }

...

})();

$ jsdoc src.js 没有错误,但只会生成虚拟头。

【问题讨论】:

    标签: javascript node.js docstring


    【解决方案1】:

    当你写这篇文章时

    function bar (foo) {
        return foo + foo;
    }
    

    如果您将光标放在function 正上方的行中,并在按下“Enter”时输入/**,您将获得:

    /**
     * [bar description]
     * @param  {[type]} foo [description]
     * @return {[type]}     [description]
     */
    function bar (foo) {
        return foo + foo;
    }
    

    有很多类似的快捷方式。

    例如,如果您将光标放在@param {[type]} foo [description] 之后,按« Enter » 将创建一个新的* 行,写@ 将建议您(在智能感知中)所有JSDoc cmets 和验证创建一整行。

    当您的文件被正确记录后,只需使用jsdoc CLI 创建您的文档。

    文档:http://usejsdoc.org/

    编辑:我刚刚意识到对您的问题的回答在您的https://github.com/spadgos/sublime-jsdocs 链接中,所以也许您想知道如何生成文档......

    安装 Node.js 并使用 CLI 命令

    npm install jsdoc -g
    

    那么,假设你想要文档的文件名是foo.js,运行以下命令:

    jsdoc foo.js
    

    这将在out 目录中创建一个文档。

    生成文档的所有 CLI 文档都在这里:http://usejsdoc.org/about-commandline.html

    【讨论】:

    • 我确实试过这个。 “站点”无声地生成。页面在标题下是空的。在我的 JavaScript 源代码中有两个实验性注释的函数。这些函数在“模块”内部,即在代表模块主体的匿名函数中是本地的。
    • 这可能是因为您没有使用@memberOf 属性来引用模块下的该函数,所以@memberof module:MyModuleName~ 可以完成这项工作。如果需要,编辑您的帖子以提供未正确显示在文档中的代码。
    • 希望是这样的。我试过@memberOf module:helper~,但无济于事。事实上,我的模块是匿名的,所以我并不感到惊讶。
    【解决方案2】:

    在全球范围内

    要允许 JSDoc 模板生成您的文档,您必须在函数名称中添加 @function 属性。您的两个函数将出现在模板的全局部分。

    jsdoc your-exemple.js
    

    但是,由于您的函数的作用域是匿名函数(但暂时没有模块),因此您确实添加了 @private 函数以告知该函数不是真正的全局函数,而只是在其作用域内可访问。但是,因为默认情况下 JSDoc 生成器模板忽略私有函数,所以添加 --private 选项。

    jsdoc your-exemple.js --private
    

    所以你的代码看起来像这样。

    (function () {
        "use strict";
    
        // ...
    
        /**
         * Reduces a sequence of names to initials.
         * @function makeInits
         * @private
         * @param  {String} name  Space Delimited sequence of names.
         * @param  {String} sep   A period separating the initials.
         * @param  {String} trail A period ending the initials.
         * @param  {String} hyph  A hypen separating double names.
         * @return {String}       Properly formatted initials.
         */
        function makeInits(name, sep, trail, hyph) {
            function splitBySpace(nm) {
                return nm.trim().split(/\s+/).map(function (x) { return x[0]; }).join(sep).toUpperCase();
            }
            return name.split(hyph).map(splitBySpace).join(hyph) + trail;
        }
    
        /**
         * Reduces a sequence of names to initials.
         * @function makeInitials
         * @private
         * @param  {String} name Space delimited sequence of names.
         * @return {String}      Properly formatted initials.
         */
        function makeInitials(name) {
            return makeInits(name, '.', '.', '-');
        }
    
        // ...
    
    }());
    

    进入课堂

    如果将匿名闭包的内容暴露给变量var Helper,它可能是一个类。因此,您的代码将不是 Global 内容的一部分,而是 Class 的一部分,@class 后跟类名。而且由于您将向类模块提供函数,因此您无需将函数声明为私有。

    但您确实解释了您之前的函数是该类的一部分,因此您必须使用 @memberOf 和属性的完整路径。

    • 如果是静态成员(通过返回公开),则以 . 结尾。
    • 如果是可实例化的方法(通过 this 公开),则以 # 结尾。
    • 如果它是一个根本没有公开的私有函数(和@private),则以~ 结束。

    所以

    /**
     * Helper Class
     * @Class Helper
     */
    var Helper = (function () {
        "use strict";
    
        // ...
    
        /**
         * Split by Space
         * @function privateExemple
         * @private
         * @memberOf Helper~
         * @return {String}     ...
         */
        function privateExemple() {
            return "";
        }
    
        /**
         * Reduces a sequence of names to initials.
         * @function makeInits
         * @memberOf Helper.
         * @param  {String} name  Space Delimited sequence of names.
         * @param  {String} sep   A period separating the initials.
         * @param  {String} trail A period ending the initials.
         * @param  {String} hyph  A hypen separating double names.
         * @return {String}       Properly formatted initials.
         */
        function makeInits(name, sep, trail, hyph) {
            function splitBySpace(nm, sep) {
                return nm.trim().split(/\s+/).map(function (x) { return x[0]; }).join(sep).toUpperCase();
            }
            return name.split(hyph).map(splitBySpace).join(hyph) + trail;
        }
    
        /**
         * Reduces a sequence of names to initials.
         * @method makeInitials
         * @memberOf Helper#
         * @param  {String} name Space delimited sequence of names.
         * @return {String}      Properly formatted initials.
         */
        this.makeInitials = function makeInitials(name) {
            return makeInits(name, '.', '.', '-');
        }
    
        // ...
    
        return {
            makeInits: makeInits
        };
    }());
    

    进入 Molule

    但是,在您的情况下,您使用exports,这意味着您的文件是一个模块。所以你必须用@module 和名字来描述它。因此,您之前评论的所有内容都将不是 Global 的一部分,而是现在您的模块的一部分。而且因为您将在 Helper 模块后面提供您的函数,所以您无需将函数声明为私有。

    /**
     * Helper Module
     * @module Helper
     */
    exports.helper = (function () {
        "use strict";
    
        // ...
    
        /**
         * Reduces a sequence of names to initials.
         * @function makeInits
         * @memberOf module:helper.
         * @param  {String} name  Space Delimited sequence of names.
         * @param  {String} sep   A period separating the initials.
         * @param  {String} trail A period ending the initials.
         * @param  {String} hyph  A hypen separating double names.
         * @return {String}       Properly formatted initials.
         */
        function makeInits(name, sep, trail, hyph) {
            function splitBySpace(nm) {
                return nm.trim().split(/\s+/).map(function (x) { return x[0]; }).join(sep).toUpperCase();
            }
            return name.split(hyph).map(splitBySpace).join(hyph) + trail;
        }
    
        /**
         * Reduces a sequence of names to initials.
         * @function makeInitials
         * @private
         * @memberOf module:helper~
         * @param  {String} name Space delimited sequence of names.
         * @return {String}      Properly formatted initials.
         */
        function makeInitials(name) {
            return makeInits(name, '.', '.', '-');
        }
    
        // ...
    
        return {
            makeInitials: makeInitials
        };
    }());
    

    模块和类

    但是,因为您通过var Helper 公开为一个类,通过exports 作为一个模块公开,您可以以两种方式记录。

    /**
     * Helper Class
     * @class Helper
     * @memberOf module:helper~
     * @see  {@link module:helper|Module}
     */
    var Helper = (function () {
        "use strict";
    
        // ...
    
        /**
         * Reduces a sequence of names to initials.
         * @function makeInits
         * @memberOf module:helper.
         * @param  {String} name  Space Delimited sequence of names.
         * @param  {String} sep   A period separating the initials.
         * @param  {String} trail A period ending the initials.
         * @param  {String} hyph  A hypen separating double names.
         * @return {String}       Properly formatted initials.
         */
        function makeInits(name, sep, trail, hyph) {
            function splitBySpace(nm) {
                return nm.trim().split(/\s+/).map(function (x) { return x[0]; }).join(sep).toUpperCase();
            }
            return name.split(hyph).map(splitBySpace).join(hyph) + trail;
        }
    
        /**
         * Reduces a sequence of names to initials.
         * @function makeInitials
         * @private
         * @memberOf module:helper~
         * @param  {String} name Space delimited sequence of names.
         * @return {String}      Properly formatted initials.
         */
        function makeInitials(name) {
            return makeInits(name, '.', '.', '-');
        }
    
        // ...
    
        return {
            makeInitials: makeInitials
        };
    }());
    
    /**
     * helper Module
     * @module helper
     */
    exports.helper = Helper;
    

    命名空间或类?

    类和命名空间之间的区别只是类通过this 公开一些对象/函数,并且是不可实例化的。如果没有附加任何内容,您可能有一个命名空间,因此只需将 @class 替换为 @namespace,该代码将被放置到适当的命名空间部分。

    你还要检查你的 Class 是否不是 Mixin(只是在 Class 上使用,但从不直接使用)或接口(定义但未实现),如果它是其他类的 @extend。

    等等

    查看文档:http://usejsdoc.org/index.html

    【讨论】:

    • 感谢您的详细回答,Haeresis!不幸的是,在我弯曲的手中没有任何作用。类是题外话(不可实例化),它要么是模块,要么是命名空间。顺便说一句,每个文件可以有多个模块吗?还是多个命名空间?作为最后的手段,我冒昧地为您提供整个项目的参考(这只是一个教育草图)github.com/Tyrn/js-procr。我的意图(合理的封装)应该是不言而喻的。
    • 所以,我已经下载了你的 GitHub 项目。我在 root 中打开一个 CLI 命令并运行以下命令 jsdoc procr/pcn.js 并出现以下错误:ERROR. Unable to parse xxx Line 291: Illegal return statement 所以到 291 行有一个 return 在全局范围内。这是不允许的。删除此行并重新运行命令。这次会工作。要生成文档而不关心文件中的错误,请遵循以下答案:stackoverflow.com/questions/12890682/…
    • (1) 我从未见过这个错误。 (2) if-return 语句是必要的:脚本不应该在导入单元测试时运行。这就像 Python 的成语if __name__ == '__main__': run()。我将不得不花一些时间来尝试消化您的建议。再次感谢!
    • 只是这样做if(require.main === module) { main.copyAlbum(); } 不能解决您的问题吗?如果您在jslint.com 中测试var require = {}, module = {}; if (require.main !== module) { return null; },您将获得Unexpected 'return' at top level. 否则,在我之前的链接中,您可以根据需要无需修改代码即可获得解决方案。
    • 去掉了return语句。它看起来更好,但某些屏幕截图让我期待更多:)。
    【解决方案3】:

    在您的页面中:https://github.com/Tyrn/js-procr/blob/master/procr/pcn.js

    你有以下行:

    if (require.main !== module) return false;
    

    这会产生以下错误:ERROR. Unable to parse xxx Line 291: Illegal return statement

    这是因为在全局范围内不允许使用 return,所以请改用这个:

    if (require.main === module) {
        main.copyAlbum();
    }
    

    您的所有文档都将像魅力一样制作。

    实际上,我不知道为什么您的 jsdoc 命令在您的环境中没有产生错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-28
      • 2016-12-27
      • 1970-01-01
      • 2021-12-25
      • 2019-03-09
      • 2011-07-24
      相关资源
      最近更新 更多