2

我正在尝试使用两个库:

  • D3(一个 Javascript 图形库)
  • NVD3(特定于图形的 D3 扩展)

我也在尝试使用 Require Optimizer,这就是事情变得艰难的地方。D3 与 AMD 兼容,因此如果它检测到您正在使用 Require 它将定义一个模块而不是导出全局d3变量。NVD3 不支持 AMD,但 Require 有针对这种情况的“垫片”。

但是,如果我“填充”NVD3 并为该填充提供 D3 的依赖项,则它不起作用,因为 NVD3 期望有一个全局d3变量,而 D3 在 Require 环境中不会生成该变量。因此,为了解决这个问题,我制作了一个新模块(d3Shim),它只需要 D3,然后将其注册为全局变量:

define(['d3'], function(d3) {
    return window.d3 = d3;
});

我让 NVD3 依赖于 d3Shim,然后一切正常……在正常的 Require-land 中。当我尝试使用 require-optimizer 将所有内容合并到一个文件中时,我发现 NVD3 又开始崩溃了,因为缺少d3变量。

事实证明,优化器会为 shims 执行此操作:

*shimmed code here*
define(*shim path*, [], function(){});

因此,无论我有什么依赖关系,NVD3 代码都会在 d3shim 模块发挥其魔力之前运行。

我的问题是,有什么方法可以将这两个库与 Require Optimizer 一起使用,而无需更改任何一个文件?如有必要,我总是可以编辑 NVD3 的代码以使其成为 AMD 模块,但出于显而易见的原因,编辑 3rd 方库是一种不好的做法,所以我更喜欢非编辑解决方案。

4

0 回答 0