2012-10-31 57 views
20

我在尝试将d3集成到require/backbone应用程序时遇到问题。我main.js包含如下:如何将d3与require.js集成

require.config({ 
    paths: { 
    d3: 'libs/d3/d3.v2.min' 
    backbone: ... 
    ... 
    } 
}); 

而我的看法骨干喜欢的东西(在CoffeeScript中)

define ['backbone','d3',...], (Backbone,d3,...) -> 
    MyView = Backbone.View.extend 
    initialize:() -> 
     d3.somefunction 

控制台日志说D3是空的。有没有简单的方法将d3集成到这种类型的应用程序中?

回答

50

d3没有调用define()声明一个模块,所以本地的d3对骨干视图的引用不会是你想要的。无论是使用由D3做出的全局变量:

define(['backbone', 'd3'], function (backbone, ignore) { 
    //Use global d3 
    console.log(d3); 
}); 

或者使用shim config为D3申报出口值:

requirejs.config({ 
    shim: { 
     d3: { 
      exports: 'd3' 
     } 
    } 
}); 

会告诉requirejs使用全局D3为D3模值。

+18

重要提示用于在有人来在2014年1月之后 - d3不再与requirejs shim一起使用来导出全局对象。您需要明确要求它或设置全局引用。这里解释 - https://github.com/mbostock/d3/issues/1693 – iabw

0

我不知道为什么,但这个工程。我不确定是否是加载模块的正确方法。

require(['libs/jquery', 'libs/d3'], function($, ignore) { 
    d3 = require('libs/d3'); 
}); 
4

由于d3.v3现在自己注册为如果兼容的库是目前AMD的模块,你需要使用此解决方案(从http://pastebin.com/d5ZDXzL2):

requirejs.config({ 
    paths: { 
     d3: "scripts/d3.v3", 
     nvd3: "scripts/nv.d3" 
    }, 
    shim: { 
     nvd3: { 
      exports: 'nv', 
      deps: ['d3.global'] 
     } 
    } 
}); 
// workaround for nvd3 using global d3 
define("d3.global", ["d3"], function(_) { 
    d3 = _; 
}); 

define('myModule', ['nvd3'], function(nc) { /* .... */ }); 
+0

'_'似乎是一个非常糟糕的变量名称选择。你只是要求与underscore.js发生冲突。 – blatt

+2

@blatt不是我的代码,但是_是一个局部变量,并且没有在定义回调的其他地方使用,所以它对任何全局_都没有影响。此外,确实没有理由修改该定义的回调。为了便于阅读,我同意,_可能是一个不好的选择。 – webXL