我面临着将requirejs与d3和nvd3集成的问题,我找到了一个使用 require shim的简单解决方案。使用 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 小组讨论中寻求帮助,该小组讨论了一些关于 d3 和模块的先前帖子。
我在这里添加了一个测试用例:https ://github.com/danse/requirenvd3