Подтвердить что ты не робот

Как интегрировать d3 с require.js

У меня возникают проблемы с попыткой интегрировать d3 в приложение require/basebone. Мой 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 имеет значение null. Есть ли простой способ интегрировать d3 в этот тип приложения?

4b9b3361

Ответ 1

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.

Ответ 2

Так как 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) { /* .... */ });

Ответ 3

Я не уверен, почему, но это работает. Я не уверен, что это правильный способ загрузки модуля.

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