【问题标题】:JSDoc CommonJS with exports object passed into IIFE带有导出对象的 JSDoc CommonJS 传递到 IIFE
【发布时间】:2015-10-18 05:37:36
【问题描述】:

更新:@speibus 帮助我得出结论,这可能是 JSDoc 本身的问题。我在他们的 GitHub 上将我的发现添加到 this open issue。 @spenibus 找到了解决方案,但它需要稍微改动的 IIFE 版本

我在 CommonJS 模块中使用 IIFE 以便能够与 CommonJS 一起工作,并且如果 module.exports 不存在,则回退到将接口分配给窗口对象。如何正确记录这一点,以便将传入的导出对象视为 module.exports?

/**
 * This is a description
 * @module someModule
 */
(function (exports) {

    /**
     * Returns true if something.
     * @param {String} type
     * @returns {boolean}
     * @static
     */
    var isSomething = function isSomething(type){
        return true;
    };

    exports.isSomething = isSomething;

})(
    //if exports exists, this is a node.js environment so attach public interface to the `exports` object
    //otherwise, fallback to attaching public interface to the `window` object
    (typeof exports === 'undefined') ?
         window
        : exports
);

【问题讨论】:

  • 什么不起作用?有什么错误吗?因为这段代码有一些语法问题,但逻辑似乎很好。
  • @spenibus 没有错误,但它无法将通过三元运算符传入 IIFE 的“导出”对象识别为公共接口。生成的文档在 HTML 页面顶部只有“someModule This is a description”,但没有其他内容,HTML 中没有提到公共“isSomething”方法,也没有任何其他公共接口方法/对象附加到“出口”

标签: javascript jsdoc jsdoc3


【解决方案1】:

虽然JSDoc issue 456 似乎相关,但我们还没有到任何地方。

我查看了Use JSDoc: @alias,虽然很有希望,但它并没有提供相同的 JSDoc 输出。

然后我尝试了一些简单的方法,让我在脑海中播放 FF7 的胜利主题,也就是成功了:

/**
 * This is a description
 * @module someModule
 */

(function() {

    // export to window when not used as a module
    if(typeof exports === 'undefined') {
        var exports = window;
    }

    /**
     * Returns true if something.
     * @param {String} type
     * @returns {boolean}
     * @static
     */
    exports.isSomething = function(type){
        return true;
    };
})();

在项目目录上使用jsdoc ./ 会产生与我没有使用 IIFE 相同的输出。基本思想是始终拥有一个名为 exports 的对象并简单地修改它所引用的内容。

Nodejs 测试

var mm = require('./module.js');

console.log('--Testing nodejs--');
console.log(mm);

输出:

--Testing nodejs--
{ isSomething: [Function] }

HTML脚本测试

<script src="module.js"></script>
<script>
    console.log('--html script test--');
    console.log(isSomething.toString());
</script>

输出:

"--html script test--"
"function (type){
    return true;
}"

更新 2015-08-13 05:10 +0000
移动了 IIFE 中的窗口导出,以避免在 html 脚本中出现额外的 exports var。

【讨论】:

  • 忽略语法错误,这是我复制代码并删除任何项目特定内容时的错误(公司不喜欢共享他们的代码)。我将其归结为以下内容(加上@module 声明),除了模块名称/描述之外,它仍然没有生成任何内容。 FWIW,我正在使用 JSDoc 3.3.0-alpha5 和 DocStrap 主题通过“gulp-jsdoc”gulp 任务 (function (exports) { exports.isSomething = function(type){ return true; }; }( typeof exports = == 'undefined'? 窗口:出口));
  • 你刚才提供的代码还是有括号不匹配的语法问题。
  • 哎呀,你是对的。好吧,我对其进行了更改,因此该文件仅包含@module 标记和此代码,但仍然无法正常工作。 (function (exports) { exports.isSomething = function(type){ return true; }; })( typeof exports === 'undefined'? window: exports);
  • 你怎么称呼isSomething
  • 这是一个静态方法,所以类似于 var someModule = require('someModule'); someModule.isSomething('foo')
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-06
  • 2014-05-30
  • 1970-01-01
  • 2020-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多