要求“d3-select-multi”作为节点模块不工作

时间:2017-11-07 14:52:36

标签: node.js d3.js npm module

我通过npm安装了d3并直接在我的脚本中使用它(出于某种原因)

所以:

npm install d3

然后

var d3 = require("d3");

工作正常。

现在的问题是,我需要“d3-selection-multi”模块。

我也是通过npm

安装的

npm install d3-selection-multi

在我阅读的d3-Doku中你可能需要不同的模块:

var d3 = Object.assign({}, require("d3-format"), require("d3-geo"), require("d3-geo-projection"));

我改变了我的需要,这将是标准-d3-bundle(已在上面工作)并添加d3-selection-multi。

var d3 = Object.assign({}, require("d3"), require("d3-selection-multi"));

然而,这不起作用。 所以我通过打印出结果对象来测试它:

console.log(d3)

结果是正确的:

{version: "4.11.0", bisect: ƒ, bisectRight: ƒ, bisectLeft: ƒ, ascending: ƒ, …}

但是“d3-selection-multi”模块不存在。我可以看到,因为它不会将d3.selectAll().styles识别为函数。

我尝试了以下内容: 而不是

var d3 = Object.assign({}, require("d3"), require("d3-selection-multi"));

我只需要d3-selection-multi来查看它是否有效:

var d3 = require("d3-selection-multi");

console.log(d3)的结果是 { }一个空对象。

因此,如果此对象不包含任何内容,Object.assign显然也不会向d3-standard-bundle添加任何内容。但为什么它是空的?我错过了吗?

1 个答案:

答案 0 :(得分:0)

从您的问题来看,确切地确定您所遇到的情况有点难以确信您已经无法正常工作,所以我正在努力猜测这是:

  

但" d3-selection-multi" -module不存在。我可以看到,因为它没有将d3.selectAll()。样式识别为函数。

让我们从头开始。

Object.assign将一个或多个源对象的可枚举属性复制到单个目标对象。这对于创建对象的浅副本非常有用 - 例如,允许您在不必操纵源对象的情况下操作目标对象 - 或者使用源对象的属性组合新对象。

const foo = { a: 1 };
const bar = { b: 2 };
const baz = Object.assign({}, foo, bar);

console.log(baz.a);
// 1
正如您所观察到的,

d3-selection-multi导出一个空对象。因此,您尝试使用Object.assign导致创建一个空对象,将d3可枚举属性复制到该空对象,以及复制空d3-selection-multi对象' s可枚举的属性 - 没有 - 到那个初始的空对象。

实际上,

What d3-selection-multi does会直接从selectiontransition修改d3-selectiond3-transition原型。

您应该可以通过以下简单示例来验证这一点:

const d3 = require('d3');
require('d3-selection-multi');

console.log(d3.selectAll().styles);
console.log(d3.selectAll().attrs);
// [Function: selection_styles]
// [Function: selection_attrs]

如上所述,您应该在原始方法下看到相同的结果:

const d3 = Object.assign({}, require('d3'), require('d3-selection-multi'));

如果您确实能够以这种方式访问​​d3.selectAll().stylesattrs但仍有问题,我们需要查看确切的实施代码以及控制台输出。