我正在尝试为一个几乎无处不在的库(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和脚本加载将分享运行定义函数。但传递给它的“全局”永远不会被使用。)
虽然上述工作正常,但我认为已经已经解决了这个问题。我似乎无法找到任何可以遵循的例子。
任何人都知道更好的做法吗?
答案 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');
}
};
}));