在javascript es6中使用... spread语法命名为exports

时间:2017-04-08 21:37:39

标签: javascript ecmascript-6 babel ecmascript-next spread-syntax

我试图从库中导入所有内容作为哈希,修改它,并重新导出修改后的哈希,而不知道库中的所有命名导出。例如:

import * as reactBootstrap from 'react-bootstrap';

wrappedReactBootstrap = doFunnyThingsTo(reactBootstrap);

export {
  ...wrappedReactBootstrap
};

// or
export wrappedReactBootstrap;

我对https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/export的理解是规范不允许以下内容。有人可以证实吗?

显然,循环是不可能的,因为导出和导入语句必须是顶级的。

1 个答案:

答案 0 :(得分:21)

对象休息传播为stage 3 proposal,而不是任何规范的一部分(可能会包含在ES2018中)。

更重要的是,export具有模仿现有JS语法的语法,但不会将{ ... }解释为表达式。 export syntax was strictly defined因为ES2015模块应该进行静态分析。这是它们的一个好处,但它要求开发人员明确指定导出和导入。

由于{ ...wrappedReactBootstrap }引入了动态导出(在此处使用它完全用于此目的),ES2015模块export不支持它,并且它不太可能出现。

如果需要为导出提供动态行为,可以将其导出并导入为命名或默认对象。

import * as reactBootstrap from 'react-bootstrap';

export default doFunnyThingsTo(reactBootstrap);

一样使用
import wrappedReactBootstrap from '...';

const { funny, thing } = wrappedReactBootstrap;

显然,wrappedReactBootstrap对象不会以这种方式获得ES2015模块的好处,例如树摇动。