如何将d3与require.js集成

时间:2012-10-31 12:13:00

标签: d3.js requirejs

我在尝试将d3集成到require / backbone应用程序时遇到问题。我的main.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集成到这种类型的应用程序中?

3 个答案:

答案 0 :(得分: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的模块值。

答案 1 :(得分: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) { /* .... */ });

答案 2 :(得分:0)

我不确定为什么但这有效。我不确定这是否是加载模块的正确方法。

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