我正在创建我的第一个用于开源分发的 AngularJS 模块。我想以一种易于其他人消费的方式包装它。
UMD 项目提供了一种用于导出与 AMD、CommonJS(或至少是 Node)和浏览器全局兼容的 JavaScript 模块的模式:
(function (root, factory) {
if (typeof define === 'function' && define.amd) {
define(['b'], factory); // AMD
} else if (typeof exports === 'object') {
module.exports = factory(require('b')); // Node
} else {
root.returnExports = factory(root.b); // browser global (root is window)
}
}(this, function (b) {
// use b in some fashion
return {}; // return a value to define the module export
}));
但是,由于 AngularJS 有自己的内部模块系统,注册模块只需调用angular
对象上的方法即可,即angular.module()
. 因此,UMD 模块不需要导出任何东西;它只需要要求并采取行动angular
。就前面的示例而言,我认为这看起来像这样:
(function (root, factory) {
if (typeof define === 'function' && define.amd) {
factory(require(['b'])); // AMD
} else if (typeof exports === 'object') {
factory(require('b')); // Node
} else {
factory(root.b); // browser global (root is window)
}
}(this, function (b) {
// use b in some fashion
}));
或者,具体到我的情况:
(function (root, factory) {
if (typeof define === 'function' && define.amd) {
factory(require(['angular'])); // AMD
} else if (typeof exports === 'object') {
factory(require('angular')); // Node
} else {
factory(root.angular); // browser global (root is window)
}
}(this, function (angular) {
angular.module( ... );
}));
这没什么大不了的,还是违背了UMD的精神?我问是因为我找不到任何不导出任何东西的 UMD 模式。