我面临整合的问题要求 /questions/tagged/requirejs with d3 /questions/tagged/d3 and nvd3 /questions/tagged/nvd3,我找到了一个使用 require 的简单解决方案shim http://requirejs.org/docs/api.html#config-shim。使用垫片我可以导出变量,还可以定义依赖项:
d3: { exports: 'd3' },
nvd3: {
exports: 'nv',
deps: ['d3']
},
这样,我只需使用 Bower 安装 d3 和其他软件包,并将它们包含在 require 中,这确实非常快速和干净。
尽管如此,我遇到了以下问题:全局 d3 变量和本地变量(注入到所需模块中的变量)之间可能存在一些冲突。这是一个与转换和选择相关的 d3 / require / nvd3 集成问题。我不完全理解这个问题,但我已经可以做出一些考虑。
- jquery 和 require 也有同样的问题,他们提供了 noconflict 方法来修复它
- 许多库都有这种行为,它们导出全局符号,但据我所知,requirejs 没有针对一般问题的现成修复
- 如果我将所有全局引用重命名为,问题就解决了
d3
进入 d3 源以另一个名称。我还有d3
在注入的模块中,但不再冲突
据我所知,所有 d3 功能都以这种方式工作,但其中一个 nvd3 图表的转换可能被破坏,因为选择或调度程序被覆盖。它需要对 d3 内部结构有深入的了解才能准确地发现错误,但对全局符号的简单而正确的处理可能会清除类似问题的全部记录。
可能由于 requirejs 处理 shim 依赖关系的方式,全局 d3 符号暴露给 nvd3。无论如何,相同的符号不可用于需要的模块,并且如果注入(包含在模块依赖项中),则会以某种方式被覆盖。
我还尝试将 d3 包装在模块中并正确返回本地 d3 变量,但看起来问题仍然存在。
我也在上面询问了有关此问题的帮助这次d3小组讨论 https://groups.google.com/d/topic/d3-js/PSPKF8V0D00/discussion其中包含一些之前关于 d3 和模块的帖子。
我在这里添加了一个测试用例:https://github.com/danse/requirenvd3 https://github.com/danse/requirenvd3