Requirejs、d3和nvd3集成
我面临着与和集成的问题,我使用require找到了一个简单的解决方案。使用垫片,我可以导出变量,还可以定义依赖项: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
d3: { exports: 'd3' },
nvd3: {
exports: 'nv',
deps: ['d3']
},
通过这种方式,我只需使用bower安装d3和其他软件包,并将它们包含在require中,而且非常快速和干净
尽管如此,我还是面临以下问题:全局d3变量和局部变量(注入所需模块的变量)之间可能存在一些冲突。这是一个与转换和选择相关的d3/require/nvd3集成问题。我不完全理解这个问题,但我已经可以考虑一下了
- jquery在require中也存在同样的问题,它们提供了noconflict方法来解决这个问题
- 许多库都有这种行为,它们导出一个全局符号,但据我所知,对于一般问题,requirejs没有现成的解决方案
- 如果我将所有对
的全局引用重命名为另一个名称,则问题已得到修复。我在注入模块中仍然有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.nestedrequire
-您可以在构建部件时交换灵活性。RequireJS配置适用于整个应用程序。如果您只使用nesteddefine/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可以工作。谢谢