Как интегрировать 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 в этот тип приложения?
Ответы
Ответ 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');
});