使用没有导出的UMD是否合理,只是增加一个依赖?

Bun*_*gle 5 javascript amd commonjs angularjs umd

我正在创建我的第一个用于开源分发的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
}));
Run Code Online (Sandbox Code Playgroud)

但是,由于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
}));
Run Code Online (Sandbox Code Playgroud)

或者,具体到我的情况:

(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( ... );
}));
Run Code Online (Sandbox Code Playgroud)

这没什么大不了的,还是违背了UMD的精神?我问,因为我找不到任何不导出任何东西的UMD模式.

Mik*_*ans 1

作为一个角度插件,最好提供一个导出构建器的模块,这样人们就可以对“角度的含义”负责。例如,假设我正在使用 Angular 的自定义调试版本,但想使用您的代码:现在我不能,因为您决定为我需要 Angular。这似乎是个好主意,但事实并非如此:

var myangular = require('debug-angular/ext/symbolised');
var yourmodule = require('yourmodule');
yourmodule.register(myangular);
Run Code Online (Sandbox Code Playgroud)

现在我知道,作为开发人员,您的代码将使用我的Angular,而不是现在加载两个不同版本的 Angular,以及由此产生的所有搞笑的版本不匹配错误。

所以一个更好的 umd 工厂应该是这样的:

(function (root, factory) {
  if (typeof define !== 'undefined' && define.amd) {
    define(['angular'] , function (angular) {
      factory(angular);
    });
  } else if (typeof module !== 'undefined' && module.exports) {
    module.exports = {
      register: function(angular) {
        factory(angular);
      }
    };
  } else {
    factory(root.angular); // browser global (root is window)
  }
}(this, function (angular) {
  angular.module( ... );
}));
Run Code Online (Sandbox Code Playgroud)