ES6导出/导入索引文件


201

我目前正在通过webpack / babel在React应用中使用ES6。我正在使用索引文件来收集模块的所有组件并导出它们。不幸的是,这看起来像这样:

import Comp1_ from './Comp1.jsx';
import Comp2_ from './Comp2.jsx';
import Comp3_ from './Comp3.jsx';

export const Comp1 = Comp1_;
export const Comp2 = Comp2_;
export const Comp3 = Comp3_;

因此,我可以像这样从其他地方很好地导入它:

import { Comp1, Comp2, Comp3 } from './components';

显然,这不是一个很好的解决方案,所以我想知道是否还有其他方法。我似乎无法直接导出导入的组件。


Answers:


369

您可以轻松地重新导出默认导入:

export {default as Comp1} from './Comp1.jsx';
export {default as Comp2} from './Comp2.jsx';
export {default as Comp3} from './Comp3.jsx';

还有一个针对ES7 ES8建议,可以让您编写export Comp1 from '…';



6
除了ES8提议,您还可以使用代码生成来维护索引文件。看看github.com/gajus/create-indexgithub.com/ryardley/indexr
朱斯

@Bergi那么这3行都可以导入和导出吗?还是只是导出而已,而您不再需要摆弄Comp1_名称等?
musicformellons

@musicformellons它们直接从引用的模块中导出,是的。
Bergi

2
@amann本身的循环引用并不坏,但根据模块的用途,可能导致问题。无论如何,我认为您应该只在库的索引文件中使用此模式来导出所有组件,并且如果您具有模块间的依赖性,则应直接导入它们,而不是从大型组件中导入。这样,此模式不会引入任何循环引用。
Bergi

56

另外,请记住,如果您需要一次导出多个功能(例如操作),则可以使用

export * from './XThingActions';

14
是。不幸的是,这接受命名的导出,即不包括默认导出。
ArneHugo '16

给我一个(相当误导...花了我一段时间)SyntaxError: Unexpected reserved word,@ Bergi接受的答案确实有效。
Frank Nocke

您也可以为默认导出命名,以解决该问题。而且您的操作实际上应该没有默认导出,因此此解决方案效果很好。
巴里·迈克尔·道尔

2
最佳做法是不要在JavaScript中使用默认导出,这是不必要的额外语法。@GM对于现代javascript在此线程上有最佳答案。
mibbit

39

为时已晚,但我想分享解决问题的方式。

model文件,该文件有两个名为export:

export { Schema, Model };

并具有controller默认导出的文件:

export default Controller;

index以这种方式在文件中公开:

import { Schema, Model } from './model';
import Controller from './controller';

export { Schema, Model, Controller };

并假设我要导入所有这些:

import { Schema, Model, Controller } from '../../path/';

导入函数然后将其导出回时,此方法有效吗?我尝试过,但是没有。
Aftab Naveed

抱歉,它确实起作用了,我在路上迷路了。
Aftab Naveed

14

只是:

// Default export (recommended)
export {default} from './MyClass' 

// Default export with alias
export {default as d1} from './MyClass' 

// In >ES7, it could be
export * from './MyClass'

// In >ES7, with alias
export * as d1 from './MyClass'

或按函数名称:

// export by function names
export { funcName1, funcName2, …} from './MyClass'

// export by aliases
export { funcName1 as f1, funcName2 as f2, …} from './MyClass'

更多信息:https : //developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Statements/export


1

@babel/plugin-proposal-export-default-from通过以下方式安装:

yarn add -D @babel/plugin-proposal-export-default-from

在您.babelrc.json或任何配置文件类型中

module.exports = {
  //...
  plugins: [
     '@babel/plugin-proposal-export-default-from'
  ]
  //...
}

现在,您可以export直接从file-path

export Foo from './components/Foo'
export Bar from './components/Bar'

祝好运...


如何在不弹出的情况下针对Create-React-App执行操作?
Negin Basiri
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.