代码之家  ›  专栏  ›  技术社区  ›  Drew2

ES6导入别名部分导出并非全部

  •  2
  • Drew2  · 技术社区  · 7 年前

    我想这样做:

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

    因为我不需要所有的文件,我可以通过以下方式完成:

    import * as Vars from './file';
    

    ES6中不支持此操作的任何原因?

    编辑: 有什么解决办法吗?捆绑机优化比方便更重要。

    2 回复  |  直到 7 年前
        1
  •  2
  •   loganfsmyth    7 年前

    假设你的主要目标是

    因为我不想要所有的文件

    而不是您特别想要一个具有关键帧子集的对象,然后

    import * as Vars from "foo";
    

    应该很好。

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

    让我们同样清楚地认识到 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 例如,它还没有流行起来。

        2
  •  0
  •   Estus Flask    7 年前

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

    { var1, var2, var3 } as Vars 通常没有什么意义,因为 var1 等已导入并可按原样使用; Vars 名称空间只是向缩小的代码添加额外的字节。

    如果始终需要某个模块的子集并提供了好处(未使用的命名导入可能会受到严重影响),则中间 file-subset 可添加模块:

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

    然后可以使用它代替 file :

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