我正在实现一个可以在NodeJS和浏览器(AMD /非AMD)环境中工作的模块。
它的简化版本看起来像是:
var Backbone = require('backbone');
module.exports = Backbone.Model.extend({...});
但我不知道如何让它适用于所有环境。
require
),它将无法在NodeJS环境中使用--exclude backbone
) - 它将无法在浏览器非AMD中运行(错误:找不到模块backbone
)是否可以生成UMD模块:
require('backbone')
window.Backbone
(非AMD)?答案 0 :(得分:0)
umd软件包具有适用于非AMD,AMD或CommonJS环境的jQuery插件模式。例子是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或全局变量),而是可以导出它。
换句话说,你通过替换一个模块代替实际上只是寻找的主库包来构建插件的独立包,并从碰巧可用的任何地方发现真实的库。