将依赖外部库的UMD模块与browserify捆绑在一起

我正在实现一个应该在NodeJS和浏览器(AMD /非AMD)env中工作的模块。

它的简化版本如下所示:

var Backbone = require('backbone'); module.exports = Backbone.Model.extend({...}); 

但我不明白如何使它适用于所有的envs。

  • 如果我使用全局骨干( require ),它不会在NodeJS环境中工作
  • 如果我使用require和从包中排除主干(使用--exclude backbone ) – 它将不能在浏览器非AMD(错误:无法find模块backbone

是否有可能产生的UMD模块将会:

  • 在浏览器(AMD)/ NodeJS环境中使用require('backbone')
  • 浏览器中的window.Backbone (非AMD)?

umd软件包有一个适用于非AMD,AMD或CommonJS环境的jQuery插件模式。 这个例子是jquery,但你可以适应你自己的不是jQuery的命名空间模块。

https://github.com/umdjs/umd/blob/master/jqueryPluginCommonjs.js

我过去处理过的一种方法是使用require('namespace')为插件构build独立的包,但是使用跟上面链接的模式代替实际模块的存根。

 bundle .require('./namespace-stub', {expose: 'namespace'}) .require('plugin', {entry: true}); 

其中namespace-stub.js是上面链接的模式之后的一个小模块,而不是用名称空间(来自AMD,CommonJS或全局variables)调用函数,而只是将其导出。

换句话说,你可以用一个模块代替实际上只是查找的主库包来为插件构build独立的包,并从发生的任何地方发现真正的库。