带有导出对象的 JSDoc CommonJS 传递到 IIFE

JSDoc CommonJS with exports object passed into IIFE

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

的版本

我在 CommonJS 模块中使用 IIFE,以便能够与 CommonJS 一起工作,如果 module.exports 对象不存在,则回退到将接口分配给 window 对象。我如何正确记录这一点,以便将传入的导出对象视为 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
);

虽然 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;
}"

Update 2015-08-13 05:10 +0000
Moved window exportation inside the IIFE to avoid extra exports var laying around in html script.