@use JSDoc

AMD モジュール

概要

JSDoc 3 では、非同期モジュール定義 (AMD) API を使用するモジュールをドキュメント化できます。この API は、RequireJS などのライブラリで実装されています。このページでは、モジュールで使用しているコーディング規則に基づき、JSDoc 用の AMD モジュールをドキュメント化する方法を説明します。

CommonJS モジュールまたは Node.js モジュールのドキュメント化については、CommonJS モジュール で説明を参照してください。

モジュール ID

AMD モジュールをドキュメント化するときに、require() 関数に渡される識別子をドキュメント化するために、@exports タグ または @module タグ を使用します。たとえば、ユーザーが require('my/shirt', /* callback */) を呼び出してモジュールをロードする場合、タグ @exports my/shirt または @module my/shirt を含む JSDoc コメントを作成します。以下の例は、これらのどちらのタグを使用するかを判断する際に役立ちます。

値なしで @exports タグまたは @module タグを使用すると、JSDoc はファイルパスに基づいて正しいモジュール ID を推測しようとします。

別の JSDoc コメントからモジュールを参照するために JSDoc ネームパス を使用するときは、プレフィックス module: を追加する必要があります。たとえば、my/pants モジュールのドキュメントと my/shirt モジュールへのリンクを作成する場合、@see タグ を使用して my/pants を次のようにドキュメント化できます

/**
 * Pants module.
 * @module my/pants
 * @see module:my/shirt
 */

同様に、モジュールの各メンバーのネームパスは module: で始まり、その後にモジュール名が続きます。たとえば、my/pants モジュールが Jeans コンストラクターをエクスポートし、Jeanshem というインスタンスメソッドがある場合、インスタンスメソッドのロングネームは module:my/pants.Jeans#hem です。

オブジェクトリテラルを返す関数

AMD モジュールをオブジェクトリテラルを返す関数として定義する場合、@exports タグ を使用してモジュールの名前をドキュメント化します。JSDoc は、オブジェクトのプロパティがモジュールのメンバーであることを自動的に検出します。

オブジェクトリテラルを返す関数
define('my/shirt', function() {
   /**
    * A module representing a shirt.
    * @exports my/shirt
    */
    var shirt = {
        /** The module's `color` property. */
        color: 'black',

        /**
         * Create a new Turtleneck.
         * @class
         * @param {string} size - The size (`XS`, `S`, `M`, `L`, `XL`, or `XXL`).
         */
        Turtleneck: function(size) {
            /** The class's `size` property. */
            this.size = size;
        }
    };

    return shirt;
});

別の関数を返す関数

モジュールをコンストラクターなどの別の関数がエクスポートする関数として定義する場合、@module タグ を使用したスタンドアロンコメントを使用してモジュールをドキュメント化できます。その後、@alias タグ を使用して、関数がモジュールと同じロングネームを使用することを JSDoc に伝えることができます。

コンストラクターを返す関数
/**
 * A module representing a jacket.
 * @module my/jacket
 */
define('my/jacket', function() {
    /**
     * Create a new jacket.
     * @class
     * @alias module:my/jacket
     */
    var Jacket = function() {
        // ...
    };

    /** Zip up the jacket. */
    Jacket.prototype.zip = function() {
        // ...
    };

    return Jacket;
});

戻り値のステートメントで宣言されたモジュール

関数の return ステートメントにモジュールオブジェクトを宣言する場合、@module タグ を使用したスタンドアロンコメントを使用してモジュールをドキュメント化できます。その後、@alias タグ を追加して、モジュールオブジェクトがモジュールと同じロングネームを持つことを JSDoc に伝えることができます。

戻り値のステートメントで宣言されたモジュール
/**
 * Module representing a shirt.
 * @module my/shirt
 */

define('my/shirt', function() {
    // Do setup work here.

    return /** @alias module:my/shirt */ {
        /** Color. */
        color: 'black',
        /** Size. */
        size: 'unisize'
    };
});

関数に渡されるモジュールオブジェクト

モジュールオブジェクトがモジュールを定義する関数に渡される場合、関数パラメータに @exports タグ を追加してモジュールをドキュメント化できます。このパターンは JSDoc 3.3.0 以降でサポートされています。

関数に渡されるモジュールオブジェクト
define('my/jacket', function(
    /**
     * Utility functions for jackets.
     * @exports my/jacket
     */
    module) {

    /**
     * Zip up a jacket.
     * @param {Jacket} jacket - The jacket to zip up.
     */
    module.zip = function(jacket) {
        // ...
    };
});

1 つのファイルに定義された複数のモジュール

1 つの JavaScript ファイルに複数の AMD モジュールを定義する場合、@exports タグ を使用して各モジュールオブジェクトをドキュメント化します。

1 つのファイルで定義された複数の AMD モジュール
// one module
define('html/utils', function() {
    /**
     * Utility functions to ease working with DOM elements.
     * @exports html/utils
     */
    var utils = {
        /**
         * Get the value of a property on an element.
         * @param {HTMLElement} element - The element.
         * @param {string} propertyName - The name of the property.
         * @return {*} The value of the property.
         */
        getStyleProperty: function(element, propertyName) { }
    };

    /**
     * Determine if an element is in the document head.
     * @param {HTMLElement} element - The element.
     * @return {boolean} Set to `true` if the element is in the document head,
     * `false` otherwise.
     */
    utils.isInHead = function(element) { }

    return utils;
    }
);

// another module
define('tag', function() {
    /** @exports tag */
    var tag = {
        /**
         * Create a new Tag.
         * @class
         * @param {string} tagName - The name of the tag.
         */
        Tag: function(tagName) {
            // ...
        }
    };

    return tag;
});