我正在尝试为几乎可以在任何地方使用的库(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 和脚本加载将共享定义的运行函数。但是传递给它的“全局”永远不会被使用)。
虽然上述方法有效,但我认为这个问题必须已经解决。我似乎找不到任何可以效仿的例子。
有人知道更好的做法吗?