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
}