0

ほとんどどこでも使用できるライブラリ(MomentJS)のプラグインを作成しようとしています。RequireJSでの使用を計画しているので、AMDに対応している必要がありますが、ブラウザーまたはNodeでスクリプトタグを介してロードするユーザーも使用できるようにしたいと思います。

突っついた後、私はこれを一緒に叩きました:

(function() {
    var hasModule = typeof module !== "undefined"  && module.exports;

    var MY_LIB_DEF = function (moment, global) {
        if(typeof moment == "undefined") {
            throw "Can't find moment";
        }

        var MY_LIB = {
            //
            //DEFINE PLUGIN
            //
        };

        if(hasModule) {
            module.exports = LIB
        } else if(global) {
            global.LIB = LIB;
        } else {
            return LIB;
        }
    };

    if(hasModule) {
        moment = require('moment');
    }

    if (typeof define === "function" && define.amd) {
        define(["moment"], MY_LIB_DEF);
    } else {
        MY_LIB_DEF(moment, this);
    }
})();

MY_LIB_DEFの下部で、CJSにエクスポートするのか、ウィンドウにアタッチするのか、AMDに戻るのかを判断するのは、開始する方法の選択と同様に少し不格好なようです(CJSとスクリプトのロードは定義の実行を共有します)関数。ただし、渡された「グローバル」は使用されません)。

上記は機能しますが、この問題はすでに解決されているはずだと思います。従うべき例が見つからないようです。

このためのより良い実践を知っている人はいますか?

4

1 に答える 1

1

周りを検索した後、問題を解決するのに役立ついくつかの良い情報をここで見つけました。それでも私の目的のために少しマッサージしなければなりませんでしたが、それは解決策のようです。

(function(root, definition) {
    "use strict";
    var moment;

    if (typeof module !== 'undefined' && module.exports) {
        moment = require('moment');
        module.exports = definition(moment);
    } else if (typeof define === 'function' && define.amd){
        define(['moment'], definition);
    } else {
        root['MY_LIB'] = definition(root.moment);
    }
}(this, function(moment) {
    if(typeof moment === "undefined") {
        throw "Can't find moment";
    }
    return {
        foo: function() {
            console.log('bar');
        }
    };
}));
于 2013-02-23T01:59:22.367 に答える