5

更新: @spenibus のおかげで、これは JSDoc 自体の問題である可能性があるという結論に達しました。GitHub のこの未解決の問題に調査結果を追加しました。@spenibus は解決策を見つけましたが、IIFE のわずかに変更されたバージョンが必要です

CommonJS モジュールで IIFE を使用して、CommonJS を操作し、module.exports が存在しない場合はウィンドウ オブジェクトにインターフェイスを割り当てるようにフォールバックできるようにしています。渡された 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
);
4

1 に答える 1

3

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 内に移動しexportsて、html スクリプトに余分な変数が配置されるのを回避しました。

于 2015-08-10T17:48:36.697 に答える