2012-10-31 13 views
20

Ich habe Probleme bei der Integration von d3 in eine Require/Backbone-Anwendung. Mein main.js enthält so etwas wie:wie zu integrieren d3 mit require.js

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

Und mein Rückgrat Ansicht so etwas wie (in Coffeescript)

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

Console log sagt d3 null ist. Gibt es eine einfache Möglichkeit, d3 in diese Art von Anwendung zu integrieren?

Antwort

50

d3 ruft define() nicht auf, um ein Modul zu deklarieren, daher ist der lokale d3 Verweis auf die Backbone-Ansicht nicht das, was Sie wollen. Verwenden Sie entweder die globale Variable von d3 gemacht:

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

Oder die shim config verwenden, um eine Ausfuhr Wert für d3 zu erklären:

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

Das requirejs wird sagen, das globale d3 als Modulwert für d3 verwenden .

+18

Wichtiger Hinweis für alle kommen auf dies nach Januar 2014 - d3 funktioniert nicht mehr mit requirejs shim, um ein globales Objekt zu exportieren. Sie müssen es explizit anfordern oder die globale Referenz festlegen. Erklärung hier - https://github.com/mbstock/d3/issues/1693 – iabw

0

Ich bin mir nicht sicher warum, aber das funktioniert. Ich bin mir nicht sicher, ob es die richtige Art ist, ein Modul zu laden.

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

Seit d3.v3 nun selbst registriert als AMD-Modul, wenn eine kompatible Bibliothek vorhanden ist, müssen Sie diese Abhilfe verwenden (von 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

'_' scheint wie eine wirklich schlechte Wahl der Variablennamen. Sie fragen nur nach Konflikten mit underscore.js. – blatt

+2

@blatt nicht mein Code, aber _ ist eine lokale Variable und wird nirgendwo sonst in diesem Callback verwendet, so dass es keine Auswirkungen auf alle globalen _ hat. Außerdem gibt es keinen Grund, diesen Callback zu modifizieren. Aus Gründen der Lesbarkeit stimme ich zu, _ ist wahrscheinlich eine schlechte Wahl. – webXL