我在尝试将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集成到这种类型的应用程序中?
答案 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');
});