允许使用所需的周期,但可能会导致未初始化值。考虑重构以消除对循环的需要 [英] Require cycles are allowed, but can result in uninitialized values. Consider refactoring to remove the need for a cycle
问题描述
我在Chrome控制台中为我的原生项目收到此警告消息。你知道我为什么会收到这个吗?
这是完整的消息:
需要周期:node_modules/react-native-radio-buttons/lib/index.js-> node_modules/react-native-radio-buttons/lib/segmented-controls.js-> node_modules/react-native-radio-buttons/lib/index.js
允许使用所需的周期,但可能会导致未初始化值。 考虑进行重构以消除循环的需要。
感谢您的建议。 谢谢
推荐答案
TL;DR:您将模块A导入模块B和模块B导入模块A导致一个循环A🡒B🡒A🡒B🡒A.,这可能会导致错误。通过重组模块来解决这个问题,这样循环就会中断。
详细答案
在javascript中,如果您将不同的模块导入到其他模块中,则所有这些导入操作都会生成依赖关系树:
root_module
┌───────────┴───────────┐
sub_module_A sub_module_B
┌────────┴────────┐
sub_module_C sub_module_D
当您运行代码时,所有模块都将从下到上或从叶子到主干进行评估,因此,例如,如果您将模块C和D导入到模块B中,则C和D的所有导出都已进行评估,不再是未定义的。如果将在C和D之前评估模块B,则模块B将无法工作,因为来自C和D的所有导出都将是未定义的,因为它们尚未进行评估。
不过,可以在依赖关系树中形成循环(这就是您收到警告的原因):
root_module
┌───────────┴───────────┐
sub_module_A sub_module_B
🡑 🡓
sub_module_C
问题:假设评估现在从模块C开始。由于它从模块B导入了一些内容,并且尚未进行评估,因此模块C无法正常工作。所有从B导入的内容都是未定义的。这实际上并没有那么糟糕,因为在最后,模块C在评估完所有其他内容后再次进行评估,因此C也在工作。如果评估以模块B开始,也是如此。
但是:如果您的代码从一开始就依赖于工作模块C,这将导致很难找到错误。因此您会收到此错误。
如何解决:在您的情况下,警告还会给出详细说明,说明出现循环的位置。您在node_modules/react-native-radio-buttons/lib/index.js
中导入native-radio-buttons/lib/segmented-controls.js
,在native-radio-buttons/lib/segmented-controls.js
中导入node_modules/react-native-radio-buttons/lib/index.js
。似乎循环被放在您的一些节点模块中。很遗憾,在这种情况下,您不可能自己解决这个问题。
如果循环位于您自己的代码中,则必须将某些导出提取到第三个模块/文件中,从该模块/文件将代码导入到先前形成该循环的两个模块中。
这篇关于允许使用所需的周期,但可能会导致未初始化值。考虑重构以消除对循环的需要的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!