将依赖外部库的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独立的包,并从发生的任何地方发现真正的库。