我想这样做:
import { var1, var2, var3 } as Vars from './file';
因为我不想要所有文件,我可以用它来完成:
import * as Vars from './file';
ES6不支持任何原因吗?
编辑:有任何解决方法吗? Bundler优化比方便更重要。
答案 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';