2012-03-30 18 views
30

Ich habe versucht, D3 innerhalb Node.js aufzurufen. Ich versuchte zunächst d3.v2.js von D3 Webseite mit dem Script-Tag zu importieren, aber dann diesen Thread gelesen:Wie benutze ich D3 in Node.js richtig?

I want to run d3 from a Cakefile

Wo D3 des Autors rät man sollte ‚npm ​​d3 installieren‘ ... Ich tat dies, , und ich kann es in Knoten Konsole erfolgreich aufrufen:

[email protected]:$ node 
> var d3 = require("d3"); 
undefined 
> d3.version; 
'2.8.1' 

wenn es jedoch aus app.js aufzurufen versuchen, mit 'Knoten app.js', die ich erhalten:

node.js:201 
    throw e; // process.nextTick error, or 'error' event on first tick 
     ^
TypeError: Cannot read property 'BSON' of undefined 
at  /Users/dpc/Dropbox/sync/Business/MindfulSound/Development/nad.am/nadam/node_modules/mongoose/node_modules/mongodb/lib/mongodb/index.js:45:44 

I erkennen, dass an anderer Stelle, D3 des Autors hat eindeutig festgelegt, dass man die Leinwand benötigen sollte:

https://github.com/mbostock/d3/blob/master/examples/node-canvas/us-counties.js

als:

var Canvas = require("canvas"); 

aber selbst dann (und auch wenn speziell erfordern index.js statt d3 .v2.js in einer Erklärung bedürfen in app.js), kann ich nicht bekommen die unten in einem Jade-Vorlage zu arbeiten:

- script('/javascripts/d3.v2.js') 
h1 Dashboard 
    section.css-table 
    section.two-column 
     section.cell 
     hr.grey 
     h2 Statistics 
     #mainGraph 
      script(type="text/javascript") 
       var Canvas = require("canvas"); 
       var w = 400, 
        h = 400, 
        r = Math.min(w, h)/2, 
        data = d3.range(10).map(Math.random).sort(d3.descending), 
        color = d3.scale.category20(), 
        arc = d3.svg.arc().outerRadius(r), 
        donut = d3.layout.pie(); 
       var vis = d3.select("body").append("svg") 
        .data([data]) 
        .attr("width", w) 
        .attr("height", h); 
       var arcs = vis.selectAll("g.arc") 
        .data(donut) 
        .enter().append("g") 
        .attr("class", "arc") 
        .attr("transform", "translate(" + r + "," + r + ")"); 
       var paths = arcs.append("path") 
        .attr("fill", function(d, i) { return color(i); }); 
       paths.transition() 
        .ease("bounce") 
        .duration(2000) 
        .attrTween("d", tweenPie); 
       paths.transition() 
        .ease("elastic") 
        .delay(function(d, i) { return 2000 + i * 50; }) 
        .duration(750) 
        .attrTween("d", tweenDonut); 

       function tweenPie(b) { 
       b.innerRadius = 0; 
       var i = d3.interpolate({startAngle: 0, endAngle: 0}, b); 
       return function(t) { 
        return arc(i(t)); 
       }; 
       } 

       function tweenDonut(b) { 
       b.innerRadius = r * .6; 
       var i = d3.interpolate({innerRadius: 0}, b); 
       return function(t) { 
        return arc(i(t)); 
       }; 

     section.cell 
     hr.grey 
     h2 Achievements 

Antwort

60

der richtige Weg, D3 zu verwenden innerhalb von Knoten t o Verwenden Sie NPM, um d3 und dann zu require es zu installieren. Sie können entweder npm install d3 oder eine package.json-Datei verwenden, gefolgt von npm install:

{ 
    "name": "my-awesome-package", 
    "version": "0.0.1", 
    "dependencies": { 
    "d3": "3" 
    } 
} 

Sobald Sie d3 in Ihrem node_modules Verzeichnis haben, es laden über erfordern:

var d3 = require("d3"); 

Und das ist es.

In Bezug auf Ihre anderen Probleme: Canvas ist nicht erforderlich, um D3 zu verwenden. Das von Ihnen verknüpfte node-canvas-Beispiel erfordert canvas, da es auf einer Arbeitsfläche gerendert wird. Der TypeError (Eigenschaft 'BSON' von undefined nicht lesen) scheint mit Ihrer Verwendung von mongoose/monogdb und nicht mit D3 in Zusammenhang zu stehen.

+0

Vielen Dank für Ihre Antwort gefunden! Es ist ziemlich seltsam: d3 ist tatsächlich in node_modules, da ich es mit 'npm install d3' installiert habe ... aber 'var d3 = require ("d3");' in app.js gibt mir das BSON-Fehler ... entfernen Sie diese Zeile, BSON-Fehler gegangen. Und das ist mit einem einfacheren Beispiel von d3 zu verwenden, von der SVG-Kreiszeichnung hier: http: // christopheviau.com/d3_tutorial/ – pland

+0

Für den Datensatz, herausgefunden, dass es Probleme bei der Verwendung von Globals zwischen Mungo und d3 gab, so dass Aufruf von d3 zuerst mit var d3 = erfordern ("d3"); bevor ich Mungo benötigte, löste ich das BSON-Fehlerproblem. – pland

+0

Dies wurde in BSON v0.1.5 (und mongodb v2.0.0, das von der korrekten BSON-Version abhängt) behoben. –

1

Versuchen Sie d3-node, auf JS-Dom gebaut. Hat Helfer für D3.

1

Um mit ES6 der Verwendung import statt require:

import * as d3 from 'd3'; 

Dies ist vielleicht offensichtlich einen erfahrener babel/ES6-Benutzer, und ich weiß, das ist eine alte Frage, aber ich kam hier in einem Versuch, finde es heraus. Ich hoffe, das ist hilfreich für jemanden.

Mehr auf import vs. require ist here.