Requirejs、d3和nvd3集成

Requirejs、d3和nvd3集成,requirejs,d3,nvd3,javascript,module,d3.js,Requirejs,D3,Nvd3,Javascript,Module,D3.js,我面临着与和集成的问题,我使用require找到了一个简单的解决方案。使用垫片,我可以导出变量,还可以定义依赖项: d3: { exports: 'd3' }, nvd3: { exports: 'nv', deps: ['d3'] }, 通过这种方式,我只需使用bower安装d3和其他软件包,并将它们包含在require中,而且非常快速和干净 尽管如此,我还是面临以下问题:全局d3变量和局部变量(注入所需模块的变量)之间可能存在一些冲突。这是一个与转换和选择相关的d3/require

我面临着与和集成的问题,我使用require找到了一个简单的解决方案。使用垫片,我可以导出变量,还可以定义依赖项:

d3: { exports: 'd3' },
nvd3: {
  exports: 'nv',
  deps: ['d3']
},
通过这种方式,我只需使用bower安装d3和其他软件包,并将它们包含在require中,而且非常快速和干净

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

  • jquery在require中也存在同样的问题,它们提供了noconflict方法来解决这个问题
  • 许多库都有这种行为,它们导出一个全局符号,但据我所知,对于一般问题,requirejs没有现成的解决方案
  • 如果我将所有对
    d3
    的全局引用重命名为另一个名称,则问题已得到修复。我在注入模块中仍然有
    d3
    ,但它不再冲突
就我所见,所有d3功能都是这样工作的,但其中一个nvd3图表的转换已中断,可能是因为选择或调度程序被覆盖。它需要对d3的内部结构有深入的理解,才能准确地发现错误,但可能一个简单但正确的全局符号处理将清除所有类似问题

也许,由于requirejs处理垫片依赖关系的方式,全局d3符号将公开给nvd3。无论如何,相同的符号对于需要的模块不可用,并且如果被注入(包括在模块依赖项中),将以某种方式被覆盖

我还尝试将d3封装在一个模块中,并正确地返回一个局部d3变量,但问题似乎仍然存在

我也问了一些关于d3和模块的文章



我在这里添加了一个测试用例:

首先,您可以绕过
shim
您不需要它来为纯JS返回任何东西。只需使用globals

第二,虽然
shim
在声明脚本的依赖项方面是半有用的,但您也可以显式地执行它们:

require(['path/to/d3.min'], function(){
    // nesting to insure d3 loads before nvd3
    require(
        [
            'path/to/mylogic' // <- AMD module
            ,'path/to/nvd3.min' // <- actually a plain JS file
        ]
        , function(mylogic /*, we ignore what nvd3 returns */){
            window.nv // is available for you
        }
    )
})
require(['path/to/d3.min',function()){
//嵌套以确保nvd3之前的d3负载
要求(
[
'path/to/mylogic'/看看我在中做了什么(使用“依赖”requirejs插件),然后在其他需要导出到全局变量的文件中我做了什么:

define(['d3'], function (d3) { // Code here ... }); 定义(['d3'],函数(d3){ //代码在这里。。。 });
Dependent插件非常好,允许您通过Dependent!插件[Dependency1,Dependency2]设置分层加载(“插件”在“Dependency1”和“Dependency2”之后加载)已加载。

问题似乎不是您的RequireJS配置,而是您使用的是d3.v3而不是d3.v2。我在您的测试用例中降级了d3,转换工作正常。(弹出窗口仍然偏侧,我认为它们不应该偏侧,但这似乎不是您目前关心的问题。)据我所知,nvd3在d3.v3中存在一些问题,这可能是其中之一。另外,请注意ddotsenko的JSFIDLE中的d3版本。这可以解释为什么在您使用自己的d3.v3库实现它时,他的解决方案不起作用。

我在全局函数方面遇到一些问题。是否可能隐藏了正常的全局函数,这是必要的要将它们访问到
窗口
?可能这只是基本的javascript知识,我希望
d3
在全局范围内,但所需的模块无法访问它。您的答案很有趣。最有趣的部分是嵌套技巧。为什么这比
垫片
依赖项工作得更好?不是有意的吗d正是为了这个目的?所以我希望他们在
require
源代码中使用相同的逻辑,或者使用更好的逻辑。为什么要尝试烘焙自己的解决方案呢?
shim
vs.nested
require
-您可以在构建部件时交换灵活性。RequireJS配置适用于整个应用程序。如果您只使用nested
define/require
调用,特别是当它们使用相关资源时,您可以在任何AMD设置中重用该组件,而无需更改配置。最后,这只是一个品味问题,但我的品味告诉我不要将配置转换为大数据树。谢谢,您的回答确实很有用,但我需要一些帮助e谁对nvd3和d3有一些直接的经验,因为我需要更好地了解哪里出了问题。我的意思是,即使我导入他们的符号,只要垫片配置正确,这也不会导致任何冲突。无论如何,让我们等待,也许你的答案将是我试图实现你的解决方案的最佳答案(
ddotsenko
上述测试用例库上的分支),但它没有解决问题我感谢你的努力,但小提琴并没有解决这个问题。这是nvd3动画的问题,github存储库显示了如何重现错误谢谢,但出于这个目的,我更喜欢ddotsenko方法或垫片,因为它们不允许在每次使用时指定依赖项重新定义一个模块!tryed(
require(“depend!nvd3[d3]”;
),但没有解决您必须下载并包含depend插件的问题。另请参见您应该在define like so:define(['depend!nvd3[d3]')、函数(nvd3)中包含这些内容{是的,就是这样,我在存储库上也收到了一个pull请求,确认了你所说的,github项目上有一个问题(关闭了!?)。关于ddotsenko fiddle,它实际上也适用于d3.v3,因为它只是表明我们能够导入对象,而不是nvd3可以工作。谢谢