【问题标题】:JS `import` is undefined, potentially circular import issue?JS `import` 未定义,可能是循环导入问题?
【发布时间】:2018-07-23 10:41:23
【问题描述】:

前言

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

问题

TodoList === undefined

代码

组件/index.js

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

容器/index.js

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

components/App/App.js

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

容器/VisibleTodoList.js

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

组件/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

【问题讨论】:

  • 简单示例似乎可以正常工作stackblitz.com/edit/react-v5hc2b 关于您的应用程序结构,您还有什么可以告诉我们的吗?如果在components/index.js中导入默认的App,是否有合适的值?
  • 导入时可以忽略.js
  • @AndreiNemes 从组件导入App 可以正常工作。
  • 导入工作正常:codesandbox.io/s/74mlwnwyy1
  • @AlexMcCabe export from 订单也是进口订单。是的,如果你有循环依赖,导入顺序很重要。

标签: javascript reactjs ecmascript-6 babeljs


【解决方案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

【讨论】:

  • 我们花了一段时间才达到这一点,但如果有时间考虑一下,这很合乎逻辑。接受为答案。另一种答案是根本不将./components/App/App 导入./components/index,而只是在一个地方使用它。
猜你喜欢
  • 2022-08-18
  • 1970-01-01
  • 1970-01-01
  • 2017-07-12
  • 1970-01-01
  • 2021-12-19
  • 1970-01-01
  • 1970-01-01
  • 2014-04-19
相关资源
最近更新 更多