ChatGPT解决这个技术问题 Extra ChatGPT

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

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

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


B
Bergi

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

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


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

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

export * from './XThingActions';

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

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

拥有具有两个命名导出的 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/';

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

简单地:

// 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目的。
k
ksav

文件夹结构:

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

组件文件夹内的 Nav.js comp

export {Nav}

组件文件夹中的 index.js

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

随处导入

import {Nav, Another} from './components'

w
wilbo

对我有用的是添加 type 关键字:

export type { Comp1, Comp2 } from './somewhere';

S
Sherman Hui

通过以下方式安装 @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 Foo from './components/Foo'
export Bar from './components/Bar'

祝你好运...


如何在不弹出的情况下为 Create-React-App 执行此操作?
谢谢你的回答。我认为这对于某些特定项目来说有点范围,但在其他项目中,例如 react-react-app 或 nextjs 似乎无法正常工作