ES6 在索引文件中导出/导入

Posted

技术标签:

【中文标题】ES6 在索引文件中导出/导入【英文标题】:ES6 exporting/importing in index file 【发布时间】:2016-03-08 10:57:38 【问题描述】:

我目前正在通过 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';

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

【问题讨论】:

import modules from files in directory的可能重复 【参考方案1】:

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

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

还有一个proposal for ES7 ES8 可以让你写export Comp1 from '…';

【讨论】:

另见类似模式 here 和 here 除了 ES8 提案之外,还可以使用代码生成来维护索引文件。看看github.com/gajus/create-index 和github.com/ryardley/indexr。 @Bergi 那么这 3 行既可以导入也可以导出?或者这只是导出但您不再需要摆弄 Comp1_ 名称等? @musicformellons 他们直接从引用的模块导出,是的。 @amann 循环引用本身还不错,但 可能 会导致问题,具体取决于模块的功能。无论如何,我认为你应该只在库的索引文件中使用这种模式来导出所有组件,如果你有模块间依赖项,你应该直接导入它们,而不是从大的部分导入。这样,这种模式就不会引入循环引用。【参考方案2】:

另外,请记住,如果您需要一次导出多个函数,例如您可以使用的操作

export * from './XThingActions';

【讨论】:

是的。不幸的是,这 only 采用命名导出,即它不包括默认导出。 给我一个(相当误导......花了我一点时间)SyntaxError: Unexpected reserved word,@Bergi 接受的答案确实有效。 您还可以命名您的默认导出来解决该问题。而且您的操作不应该真正具有默认导出,因此此解决方案运行良好。 最佳实践是不要在 javascript 中使用默认导出,不必要的额外语法。 @GM在此线程上为现代 javascript 提供了最佳答案。【参考方案3】:

为时已晚,但我想分享我解决它的方法。

拥有model 文件,其中有两个命名导出:

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/';

【讨论】:

当您导入一个函数然后将其导出回来时,这是否有效?我试过了,但没有。 抱歉,它确实有效,我的路径中缺少 /。【参考方案4】:

简单地说:

// 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/en-US/docs/Web/JavaScript/Reference/Statements/export

【讨论】:

default 2 分!不知道有这样的好东西存在。 如果你在一个文件中有一个export myFile,然后在另一个文件中有一个const myFile = require('/myfile'),你可以console.log('myFile')看到import在对象中添加一个覆盖层,你会看到参数default 也在您导入的对象中。【参考方案5】:

文件夹结构:

components|
          |_ Nave.js
          |_Another.js
          |_index.js

组件文件夹内的 Nav.js 组件

export Nav

组件文件夹中的index.js

export Nav from './Nav';
export Another from './Another';

在任何地方导入

import Nav, Another from './components'

【讨论】:

【参考方案6】:

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

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

在您的.babelrc.json 或任何Configuration File Types

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

现在你可以直接从file-pathexport

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

祝你好运……

【讨论】:

Create-React-App 不弹出怎么办?

以上是关于ES6 在索引文件中导出/导入的主要内容,如果未能解决你的问题,请参考以下文章

如何向mysql数据库中导入大批量数据?

ES6,如何在一行中导出导入的模块?

如何在 ES6 中导出导入的对象?

xml 使用数据导入处理程序在Solr中导入/索引数据库(MySQL或SQL Server)

如何从导入的 csv 文件中索引日期时间列 - pandas

如何用plsql从oracle中导入导出数据