如何有选择地导入ES2015模块函数,但要使用命名空间

How to import ES2015 modules functions selectively, but with namespacing?

本文关键字:命名空间 函数 模块 选择地 导入 ES2015      更新时间:2023-09-26

我开始使用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不能将未使用的函数从bundle中摇出。

我的梦想是这样的:

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

,但是这种特性/语法似乎在规范中不存在。我如何有选择地针对模块的各个部分,并在导入期间保留命名空间?

您需要一个重新导出模块:

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

import * as d3 from './d3';

这种特性/语法在规范

中似乎不存在。

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

但是Rollup不能将未使用的函数从bundle中摇出

这可能是Rollup的错误,但实际上它能够静态地分析代码中名称空间对象的用法,并找出使用了哪些属性。如果对象被用于非点状成员访问,则此优化可能需要退出,但通常情况下这是完全可能的。如果它没有像预期的那样工作,您可能需要提交一个错误报告(另请参阅故障排除)。