我通过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添加任何内容。但为什么它是空的?我错过了吗?
答案 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会直接从selection
和transition
修改d3-selection
和d3-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().styles
和attrs
但仍有问题,我们需要查看确切的实施代码以及控制台输出。