如何解构ES6模块联合导出

时间:2016-11-13 02:11:25

标签: javascript ecmascript-6 es6-modules

我遇到出口情况时遇到了一些小问题,我不知道为什么。我可能需要一个Babel插件来解决它,但不确定是哪个。

// a.js
export function fromA() {}

// b.js
export function fromB() {}

// index.js
import * as a from './a'
import * as b from './b'

export default { ...a, ...b}

// test.js
import all from './index'  
const { fromA } = all // Works

import { fromA } from './index'  // Does not work. Why?

我正在通过巴贝尔。这是我的rc:

{
  "plugins":  [
    "transform-object-rest-spread", 
    "transform-class-properties", 
    "transform-export-extensions", 
    "transform-decorators-legacy"
   ], 
  "presets":  ["latest", "react"]
}

似乎我应该像往常一样在import语句中的test.js中进行解决,但是没有。如果,在index.js中,我导出单个函数,那么它就会出错。如:

import { fromA } from './a'
import { fromB } from './b'
export default { fromA, fromB }

但是我想避免这种情况。

1 个答案:

答案 0 :(得分:10)

虽然导入语法看起来像解构,但它不是。

当您导出命名变量时,您只能将其作为命名变量导入。当您导出默认变量时,您只能将其导入为默认变量。

例如:

// a.js
export const foo = 1
export const bar = 2
export default { bar: 42, baz: 33 }
import { foo } from './a'
// foo = 1
import { bar } from './a'
// bar = 2
import a from './a'
// a = { bar: 42, baz: 33 }

唯一的例外是当您导入非es6模块时。由于commonjs模块每个模块只能导出一个变量,因此babel会回归解构导入它们。

因此,既然您要从index.js导出单个对象,那么您只能将其作为整个对象导出。

您正在寻找的是export * from声明:

export * from './a'
export * from './b'

它将从两个模块重新导出所有已命名的导出。