我正在实现一个模块,该模块应该在NodeJS和Browser(AMD/non-AMD)环境中工作。
它的简化版本看起来是这样的:
var Backbone = require('backbone');
module.exports = Backbone.Model.extend({...});
但我不知道如何让它适用于所有环境。
- 如果我使用全局主干(没有
require
),它将无法在NodeJS环境中工作 - 如果我使用require并从捆绑包中排除主干(使用
--exclude backbone
),它将无法在非AMD浏览器中工作(错误:找不到模块backbone
)
是否可以生成UMD模块,该模块将:
- 在浏览器(AMD)/NodeJS环境中使用
require('backbone')
- 浏览器中的
window.Backbone
(非AMD)
umd包有一个用于jQuery插件的模式,这些插件可以在非AMD、AMD或CommonJS环境中工作。例子是jquery,但是您可以将它调整为您自己的命名空间模块,而不是jquery。
https://github.com/umdjs/umd/blob/master/jqueryPluginCommonjs.js
我过去处理过的一种方法是使用require('namespace')
为插件构建独立的捆绑包,但使用遵循上面链接的模式的存根来代替真正的模块。
bundle
.require('./namespace-stub', {expose: 'namespace'})
.require('plugin', {entry: true});
其中namespace-stub.js
是一个遵循上面链接的模式的小模块,但它可以直接导出它,而不是调用带有名称空间的函数(取自AMD、CommonJS或globals)
换言之,您通过用一个模块代替主库包来构建插件的独立捆绑包,主库包实际上只是从任何可用的地方寻找并发现真正的库。