Requirejs,d3和nvd3集成

dan*_*nza 6 javascript module requirejs d3.js

我正面临将集成的问题,我找到了一个使用require的垫片的简单解决方案.使用shim我可以导出变量,我也可以定义依赖项:

d3: { exports: 'd3' },
nvd3: {
  exports: 'nv',
  deps: ['d3']
},
Run Code Online (Sandbox Code Playgroud)

通过这种方式,我只需使用bower安装d3和其他软件包,并将它们包含在require中,它非常快速而且干净.

尽管如此,我遇到了以下问题:全局d3变量和本地变量(在需求模块中注入的变量)之间可能存在一些冲突.这是与转换和选择相关的d3/require/nvd3集成问题.我不完全理解这个问题,但我已经可以考虑一下了.

  • jquery与require有同样的问题,它们提供了noconflict方法来修复它
  • 许多库都有这种行为,它们会导出一个全局符号,但据我所知,对于一般问题,requirejs没有现成的修复方法
  • 如果我将所有全局引用重命名d3为d3源到另一个名称,问题就解决了.我仍然d3在注入的模块中,但它不再相互冲突

据我所知,所有d3功能都以这种方式工作,但其中一个nvd3图表的转换可能因为选择或调度程序被覆盖而中断.它需要深入理解d3内部以准确发现错误,但可能对全局符号进行简单而正确的处理将清除类似问题的全部记录.

可能由于requirejs处理填充依赖关系的方式,全局d3符号暴露给nvd3.无论如何,相同的符号不适用于要求模块,如果注入(包括在模块依赖项中),将以某种方式覆盖.

我还尝试将d3包装在模块中并正确返回本地d3变量,但看起来问题仍然存在.

我还在这个关于d3和模块的d3小组讨论中请求了关于此的帮助.


我在这里添加了一个测试用例:https://github.com/danse/requirenvd3

nev*_*fox 1

问题似乎不是您的 RequireJS 配置,而是您使用的是 d3.v3 而不是 d3.v2。我在你的测试用例中降级了 d3,并且转换工作得很好。(弹出窗口仍然全部在一边,我认为它们不应该如此,但这似乎不是您目前关心的。)据我所知,nvd3 对 d3.v3 有一些问题,这可能就是其中之一。另外,请注意 ddotsenko 的 jsFiddle 中 d3 的版本。这可以解释为什么当您使用自己的 d3.v3 库实现他的解决方案时它不起作用。