Javascript 如何合并来自多个文件的命名导出并作为一个对象导出

Javascript 如何合并来自多个文件的命名导出并作为一个对象导出,javascript,import,ecmascript-6,redux,Javascript,Import,Ecmascript 6,Redux,我有很多动作创作者,我正试图把他们组织成几个不同的文件。每个单独的文件都有导出的功能,如: export function addData(data) { return { type: 'ADD_DATA', data } } 在将它们分离为不同的文件之前,它们的导入方式如下: import { addData } from './actions/actionCreators' 但是现在的结构怎么样 ├─┬ actions │ ├── actionsCreators1

我有很多动作创作者,我正试图把他们组织成几个不同的文件。每个单独的文件都有导出的功能,如:

export function addData(data) {
  return {
    type: 'ADD_DATA',
    data
  }
}
在将它们分离为不同的文件之前,它们的导入方式如下:

import { addData } from './actions/actionCreators'
但是现在的结构怎么样

├─┬ actions
│ ├── actionsCreators1.js
│ ├── actionsCreators2.js
│ └── index.js
我想将它们合并到索引文件中,并按照它们最初的名称导出它们。我尝试的是:

actions/index.js

但是,导入时命名函数未定义。我可以将它们分别从“/actionCreatos1”导入{action1,action2},这样就可以工作了,但是必须在两个地方编写所有内容并不理想


如何整合这些导入并将其作为一个对象导出?我认为问题在于您的actions/index.js

由于您是以
默认值导出的
,因此必须按如下方式导入:

import actions from '../actions'

actions.action1(...)
这将不起作用:

import { action1 } from '../actions'

actions.action1(...) // Error: action1 is undefined
解构语法只能获取命名导出,但您使用的是默认导出

我希望能够使用对象扩展创建命名导出,但遗憾的是,这不是有效的语法:

import * as actions1 from './actionCreators1'
import * as actions2 from './actionCreators2'

export {
  ...actions1, // object spread cannot be used in an export like this
  ...actions2
}

您可以使用模块系统本身传递名称,而不是依赖于spread,例如

// actions/index.js

export * from './actionCreators1'
export * from './actionCreators2'

因此,只要文件中的名称不发生冲突,它们就会被很好地传递。

在搜索一致的导出/导入模式时,这是一种可能的解决方案

对所有导入使用此选项:

从“/alpha”导入alpha
(无星)

出口方面:

export default {
  ...module.exports,
  ...alpha
}

这将所有内容分组,前面有一个
export
,以及从
alpha

导出的所有内容。我认为默认设置可能也是问题所在。不幸的是,看起来spread不能像那样在导出中使用,
const combinedExports={…actions1}export combinedExports
出于某种原因是一个语法错误。嗯,您可以始终导入所有操作,然后全部导出。还有一种直接从另一个文件导出的方法(而不是使用
导入
然后
导出
):这很好。嗨,如果我(可能)有名字collisons,我可以将它们组合在一起以防止它吗?例如,“将*导出为来自“/actionCreators1”的文件”;从“/actionCreators2”将*导出为两个,然后在导入后,我可以像一个一样调用它们。addData,两个。addData,有可能这样吗?@Zennichimaro是的,您的代码段使用最近添加的语法,但如果失败,您也可以从“/actionCreators1”将*导入为一个;从“/actionCreators2”导入*为两个;出口{1,2}
// actions/index.js

export * from './actionCreators1'
export * from './actionCreators2'
export default {
  ...module.exports,
  ...alpha
}