如何有选择地导入ES2015模块功能,但是使用命名空间?

时间:2016-09-25 17:48:22

标签: javascript d3.js module ecmascript-6 rollupjs

我开始使用Rollup和D3版本4,它是用ES2015模块编写的。我使用传统的D3命名空间“d3”编写了一些代码。现在我想使用Rollup创建一个自定义包。我想使用树摇动,因为我可能只使用了d3中大约一半的功能,我希望尽可能保持光线。

我很清楚我可以有选择地导入函数,例如:

import {scaleLinear} from "d3-scale";
import {
      event,
      select,
      selectAll
} from "d3-selection";

这将非常冗长,因为d3的一半是很多功能。我可以忍受这一点。更大的问题是它还需要在没有命名空间的情况下完全重写我的所有函数标识符。我不太关心它,因为我更喜欢命名库代码。

我知道我可以导入所有模块:

import * as d3 from "d3";

保留d3对象命名空间,这对我的代码组织有用。但是,Rollup无法将未使用的功能从树丛中甩掉。

我梦寐以求的是:

import {
      event,
      select,
      selectAll
} as d3 from "d3-selection";

但规范中似乎没有这种功能/语法。如何有选择地定位模块的各个部分,并在导入期间保留命名空间?

2 个答案:

答案 0 :(得分:4)

您需要重新导出模块:

export {
      event,
      select,
      selectAll
} from "d3-selection";
import * as d3 from './d3';

答案 1 :(得分:0)

  

规范中似乎不存在那种特征/语法

不,这确实是不可能的。根据规范,一旦包含一个模块,就会对整个模块进行评估和包含,因此不需要部分包含。命名空间对象始终允许访问模块的所有属性。

  

但是Rollup无法将未使用的功能从树丛中甩掉。

那将是Rollup的错,但实际上它能够静态分析命名空间对象的用法代码,并找出使用的属性。如果对象用于不是虚线成员访问的任何东西,则此优化可能需要挽救,但通常它很可能。如果它没有按预期工作,您可能想要提交错误报告(另请参阅troubleshooting)。