¿Cómo usar D3 en Node.js correctamente?

He estado intentando invocar D3 dentro de Node.js. Primero intenté importar d3.v2.js desde el sitio web de D3 con la etiqueta de script, pero luego leí este hilo:

Quiero ejecutar d3 desde un Cakefile

Donde el autor de D3 aconseja que se debe ‘npm instalar d3’ … Hice esto y puedo invocarlo con éxito en la consola del nodo

dpc@ananda:$ node > var d3 = require("d3"); undefined > d3.version; '2.8.1' 

Sin embargo, al intentar invocarlo desde app.js con ‘node app.js’, obtengo:

 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 

Me doy cuenta de que en otras partes, el autor de D3 ha especificado claramente que uno debe requerir el canvas:

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

como:

 var Canvas = require("canvas"); 

pero incluso entonces, (e incluso si se requiere específicamente index.js en lugar de d3.v2.js en una statement requerida en app.js), no puedo hacer que lo siguiente funcione dentro de una plantilla de Jade:

 - 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 

La forma correcta de usar D3 dentro de Node es usar NPM para instalar d3 y luego require . Puede npm install d3 o usar un archivo package.json , seguido de npm install :

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

Una vez que tenga d3 en su directorio node_modules, cárguelo a través de require :

 var d3 = require("d3"); 

Y eso es.

Con respecto a sus otros problemas: Canvas no está obligado a usar D3. El ejemplo de nodo-canvas que ha vinculado requiere canvas porque se representa en un canvas. El error TypeError (no se puede leer la propiedad ‘BSON’ de indefinido) parece estar relacionado con su uso de mongoose / monogdb, no D3.

Para usar con la import de ES6 en lugar de require :

 import * as d3 from 'd3'; 

Esto es quizás obvio para cualquier usuario de babel / ES6 con experiencia, y sé que esta es una pregunta antigua, pero vine aquí en un bash de resolver esto. Espero que esto sea de ayuda para alguien.

Más sobre la import frente a la require se encuentra aquí.

Prueba d3-node , construido en JS-Dom. Tiene ayudantes para D3.

No puedo ver por qué lo requieren. Espero que d3 funcione en el lado del cliente después de pasar los datos a través de un socket.