JS`import`未定义,可能是循环导入问题?

时间:2018-07-23 10:41:24

标签: javascript reactjs ecmascript-6 babeljs

序言

我正在使用create-react-app来生成应用程序。

问题

TodoList === undefined

代码

components / index.js

export { default as App } from './App/App.js';
export { default as TodoList } from './TodoList/TodoList.js';

containers / index.js

export { default as VisibleTodoList } from './VisibleTodoList.js';

components / App / App.js

import { VisibleTodoList } from '../../containers/index.js';

containers / VisibleTodoList.js

import { TodoList } from '../components/index.js';

components / TodoList / TodoList.js

export default function TodoList({ todos, onTodoClick }) { ... }

TodoList现在为undefined。我认为这可能与我有某种循环问题有关。

问题是,如果我使用以下方法导入 containers / VisibleTodoList.js ,一切正常。

import TodoList from '../components/TodoList/TodoList.js';

如果我尝试使用“中间人”(components / index.js文件)进行导入,那么有什么特殊之处会破坏导入。

完整代码

我已经创建了一个CodeSandbox,其中包含我的完整代码,就像我的应用程序中一样。该应用程序非常简单,但比我在这里概述的要复杂。

https://codesandbox.io/s/m54nql1ky9

1 个答案:

答案 0 :(得分:1)

此问题是由您的components/index.js文件中的 exports 的顺序引起的。

export { default as App } from './App/App.js';
export { default as TodoList } from './TodoList/TodoList.js';

由于App.js导入了VisibleTodoList,需要导入TodoList并将其传递给redux connect函数才能导出自身,所以最终会发生冲突。

我不确定这是否是babel的实现怪癖,或者这是从ES导入规范的定义得出的逻辑结果。

在任何情况下,更改导出顺序都可以修复该错误。

export { default as TodoList } from './TodoList/TodoList.js';
export { default as App } from './App/App.js';

根据经验,如果您无法重构文件以避免导入循环,则应将外层组件放在列表的最后,因为它可能依赖于列表中较高的导入。

此处提供完整的工作代码和框:https://codesandbox.io/s/74mlwnwyy1