0

我正在尝试为几乎可以在任何地方使用的库(MomentJS)编写一个插件。我打算将它与 RequireJS 一起使用,所以它必须是 AMD 友好的,但我也想继续让那些通过浏览器或 Node.js 中的脚本标签加载它的人使用它。

闲逛之后,我把这个拍在了一起:

(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 回答