如何在Node.js中正确使用D3?

我一直试图在Node.js中调用D3。 我首先尝试从D3的网站用脚本标记导入d3.v2.js,然后阅读这个线程:

我想从Cakefile运行d3

在D3的作者build议应该'npm install d3'…我这样做,我可以在节点控制台中成功地调用它:

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

但是,当试图从app.js中用'node app.js'调用它时,我得到:

 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 

我意识到在其他地方,D3的作者已经明确指出,应该要求canvas:

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

如:

 var Canvas = require("canvas"); 

但即使如此,(即使在app.js的require语句中特别要求使用index.js而不是d3.v2.js),我无法在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 

在Node中使用D3的正确方法是使用NPM来安装d3,然后require它。 您可以使用npm install d3或使用package.json文件,然后使用npm install

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

一旦在node_modules目录中有了d3,就可以通过require来加载:

 var d3 = require("d3"); 

就是这样。

关于你的其他问题:canvas不需要使用D3。 您链接的节点canvas示例需要canvas,因为它呈现给canvas。 TypeError(不能读取未定义的属性'BSON')似乎与你使用mongoose / monogdb而不是D3有关。

尝试build立在JS-Dom上的d3-node 。 有D3的助手。

要使用ES6的import而不是require

 import * as d3 from 'd3'; 

这对任何经验丰富的babel / ES6用户来说都是显而易见的,我知道这是一个老问题,但是我来这里试图弄清楚这一点。 希望这对某人有帮助。

更多关于importrequire在这里find。