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

Bundle UMD module that depends on external library with browserify

本文关键字:browserfy 在一起 模块 UMD 依赖 外部      更新时间:2023-09-26

我正在实现一个模块,该模块应该在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)

换言之,您通过用一个模块代替主库包来构建插件的独立捆绑包,主库包实际上只是从任何可用的地方寻找并发现真正的库。