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

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

所以:

npm install d3

接着

var d3 = require("d3");

工作正常。

现在的问题是,我需要“d3select多”模块。

我也通过npm安装它

npm install d3-selection-multi

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

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

我改变了我的需要,这将是有标准的D3包(工作已经上面),并添加D3select多。

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

那不行。 所以我通过打印出结果对象来testing它:

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显然也不Object.assign d3-standard-bundle添加任何东西。 但为什么它是空的? 我错过了什么?

从你的问题来看,确定你所遇到的情况有点困难,因为你确信这个工作没有成功,所以我正在猜测它是这样的:

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

让我们从头开始。

Object.assign将一个或多个源对象的可枚举属性复制到单个目标对象。 这对创build对象的浅拷贝非常有用 – 例如,允许您操作目标对象,而无需操作源对象 – 或者使用源对象中的属性组合新对象。

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

正如你所观察到的那样, d3-selection-multi导出一个空的对象。 因此,您尝试使用Object.assign导致创build一个空对象,将d3枚举属性复制到该空对象,以及将空d3-selection-multi对象的可枚举属性(无) – 复制到最初的空对象。

实际上, d3-selection-multi做法是直接从d3-selectiond3-transition修改selectiontransition原型。

你应该能够通过以下简单的例子来validation这一点:

 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但仍然有问题,那么我们需要看到确切的实现代码以及控制台输出。