ES6导入别名SOME导出不是ALL

时间:2018-03-12 16:55:19

标签: javascript import ecmascript-6

我想这样做:

import { var1, var2, var3 } as Vars from './file';

因为我不想要所有文件,我可以用它来完成:

import * as Vars from './file';

ES6不支持任何原因吗?

编辑:有任何解决方法吗? Bundler优化比方便更重要。

2 个答案:

答案 0 :(得分:1)

假设您的主要目标是

  

因为我不想要所有文件

而不是你特别想要一个具有键子集的对象,那么

import * as Vars from "foo";

应该可以正常工作。

import * as Vars from "foo";
Vars.var1();

使Webpack明确var1是唯一用作

的导入
import { var1 } from "foo";
var1();

那样。

发生故障的主要地方是你做了Webpack无法遵循的事情,就像你做的那样

doThingWithImports(Vars);

然后Webpack无法分辨哪些导入doThingWithImports可能正在使用,并且必须加载它们。如果你不得不这样做

Vars[arg]()

因为它无法知道arg是什么。

  

ES6不支持任何原因吗?

树木摇晃行为根本不是规范的一部分。如果

import { var1, var2, var3 } as Vars from './file';

是受支持的语法,它意味着“使用此子字段创建对象”,但就规范而言,您仍然包含./file内引用的每个依赖项。

这意味着在一天结束时,给定的捆绑包可以执行的优化对您来说很重要。鉴于此,

的行为
import * as VarsAll from './file';
const Vars = { var1: VarsAll.var1, var2: VarsAll.var2, var3: VarsAll.var3 };

会完全相同。在这一点上,委员会更有可能采用一些语法来从对象中挑选属性到新对象,而不是仅为导入添加特殊情况语法。

这种类型的语法偶尔会出现,例如https://esdiscuss.org/topic/extended-dot-notation-pick-notation-proposal,但它尚未流行。

答案 1 :(得分:0)

ES模块使用可以静态分析的严格语法。如果您使用the reference中未列出的import语法,则可以确定它不受支持。

{ var1, var2, var3 } as Vars通常没有多大意义,因为var1等已经导入并且可以按原样使用; Vars命名空间只会为缩小的代码添加额外的字节。

如果一直需要模块的子集并提供好处(未使用的命名导入可以树摇动),则可以添加中间file-subset模块:

export { var1, var2, var3 } from './file';

然后可以使用它而不是file

import * as Vars from './file-subset';