使插件CJS,AMD和脚本标签友好的最佳做法是CJS / AMD /脚本标签准备好了吗?

时间:2013-02-22 04:18:17

标签: javascript requirejs amd commonjs

我正在尝试为一个几乎无处不在的库(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和脚本加载将分享运行定义函数。但传递给它的“全局”永远不会被使用。)

虽然上述工作正常,但我认为已经已经解决了这个问题。我似乎无法找到任何可以遵循的例子。

任何人都知道更好的做法吗?

1 个答案:

答案 0 :(得分:1)

搜索后,我找到了一些good info here来帮助解决问题。为了我的目的,仍然需要按摩它,但它似乎是解决方案。

(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');
        }
    };
}));