Jest、create-react-app 和 typescript 的奇怪错误。
今晚 Jest 开始无法正确导入我的“./ProcessStore”模块。这个模块是我的测试导入的东西的传递依赖。
我看到的错误是我导入的东西未定义。
当我执行
import * as what from "./ProcessStore"
和 log(what) 时,它会打印所有导出,但值未定义。就像 {default: undefined, ResourceChange: undefined}
导出的两个类一样。应该是{default: <a class>, ResourceChange: <a class>}
。
这只是一个文件。所有其他文件都有效。
当我使用 npm start 时,它可以工作 --- 这只是一个 Jest 问题。
此外,如果我将损坏的文件重命名为
./ProcessStore2
,它也可以工作。
我尝试过
./node_modules/jest --clearCache
,但没有帮助。
如果相关的话,我通常使用craco。暂时切换回反应脚本并没有帮助。
我正在使用react-scripts 4.0.3(最新版本)。
发生什么事了?我该如何解决这个愚蠢的问题?
这是由我的项目中的循环依赖引起的。
循环依赖导致 Jest 返回一个空模块。我相信第二次进入模块时,它会有未定义的内容。
就我而言,链条是
ProcessStore.ts -> stores.ts -> ProcessStore.ts
。因此,当 stores.ts
加载 ProcessStore.ts
时,流程存储已经加载,因此一切都未定义。
当我导入这样的一个文件时,我遇到了这个问题
import { myHook } from 'services/hooks/myHook'
在另一个文件中
import { myHook } from 'services/hooks'
有一个索引文件
// src/services/hooks/index.ts
export * from './myHook.ts'
将它们全部转换为使用索引路径修复了它。我不认为我在任何地方都有循环依赖,我永远无法真正理解出了什么问题。
由于循环依赖,我也遇到了这个问题。
为了确认错误的性质,我
console.log
缺少导入并执行了我的测试。我可以看到实际上是 undefined
导入了不应该导入的内容。
我运行此命令来查找包/项目级别的循环依赖项:
npx madge --circular --extensions ts,tsx .
然而,这只给了我一个关于发生了什么的线索。
然后我在循环依赖发生的地方使用了
debugger
。使用 Chrome DevTools,我检查了调用堆栈,并发现了每个导入的导入方式。这非常清楚地揭示了循环依赖。对我来说,这是解决循环依赖的最重要部分。
我遇到过这样的情况:我没有循环依赖项,但导入仍然是
undefined
在一个小型 monorepo 的库中。听起来很奇怪,但使用较短的文件名解决了问题。