2014-02-17 16 views
0

RequireJS依赖关系表示为部分订单 ...这太棒了!每个模块都可以精确指定它需要的依赖关系,而不再需要其他依赖关系特别是,不需要在所有模块之间指定的线性顺序。如何防止或调试RequireJS项目中的“缺失依赖链接”?

一个经常提到这个问题是意外地指定循环依赖的可能性。我现在碰到你可能称为对面的问题。说我有三个模块,ABC

define('A', [], function() { ... }); 
define('B', ['A'], function() { ... }); 
define('C', [], function() { ... }); 

实际装载顺序,模块之间具有不确定性。在这种情况下,有三种可能的装载顺序:ABC,      ACBCAB。依赖关系结构确保A总是在B之前加载。

现在想象一下,模块C也变得依赖于A,但我忘了在模块头中指定它。这将很难被发现。运行(假设所有订单都同样可能)的三分之二不会显现任何问题,因为一次偶然的机会,A发生如预期C之前加载。但是,在三分之一的情况下,会出现错误消息(或更糟,不正确的行为)。

如果所有模块都返回一个值作为唯一接口,则不存在此问题。然后通过缺少相应的函数参数来提供非常明确的错误消息。但实际上,许多模块只是通过访问全局状态或通过自己的依赖链接修改状态来添加或更改某些内容。例如,AngularJS指令和服务就是这种情况。

问题:什么是防止这种情况发生的好方法,或者在它发生时进行调试?


路易斯给出的答案是,我认为,对于具有严格测试实践的大型项目来说,这是一个“正确”的方法。但我正在寻找更简单的东西。例如:

  • 一种编码规范,保证施工
  • 运行所有可能的装载顺序,然后检查所产生的国家平等

回答

1

设计你的单元测试,这样的工具适当的依赖他们从没有模块的状态开始,不加载整个应用程序,而只加载被测模块。加载这个模块会导致它的依赖被加载。如果忘记了依赖关系,那么测试应该失败。

+0

非常好的建议!我一定会遵循它。 ----但是,这并不是我正在寻找的东西,因为它取决于使用严格的单元测试实践。我正在考虑的项目确实会这样做,但仍处于原型/实验阶段,严格的测试是一个负担而非优势。----我对这个问题又增加了一些想法。 – mhelvens