1

我相信下面的所有四种方法都会起作用,但我不清楚为什么有人会仅仅因为它的代码更多而使用前三种。然而,第一个(也是最冗长的)一个是 RequireJS 文档中给出的。

define "circular1", ["example1"], -> "circular1"
define "circular2", ["example2"], -> "circular2"
define "circular3", ["example3"], -> "circular3"
define "circular4", ["example4"], -> "circular4"

#1
define "example1", ["require", "circular1"], (require, circular) ->
  alert "example1 Before: " + circular
  circular = require "circular1"
  alert "example1 After: " + circular

#2
define "example2", ["require"], (require) ->
  alert "example2 Before: " + circular
  circular = require "circular2"
  alert "example2 After: " + circular

#3
define "example3", ["circular3"], (circular) ->
  alert "example3 Before: " + circular
  circular = require "circular3"
  alert "example3 After: " + circular

#4
define "example4", [], ->
  alert "example4 Before: " + circular
  circular = require "circular4"
  alert "example4 After: " + circular

require ["example1"], ->
require ["example2"], ->
require ["example3"], ->
require ["example4"], ->
  • 如果circularDependency在你执行显式之前是未定义的require,那么麻烦将它包含在定义中(#1 和#3)有什么意义呢?
  • 如果require在加载第一个脚本时始终全局可用,为什么还要传入它?这只是代码清晰度的问题,即。是否只是为了在代码顶部提供所有依赖项的简洁快照(因为您可能要require到很久以后才能真正解决显式问题?或者它是否对 RequireJS 如何进行优化有一些实际影响,具体取决于是否或不是它包含在define?

如果仅仅因为它“有效”而对我的软件产生负面影响,我不想使用任何这些变体。

4

1 回答 1

1

当 RequireJS 将每个模块作为单独的文件加载而不是将它们捆绑在一起时,它会有所不同。在依赖项列表中指定模块会告诉 RequireJS 在调用模块函数之前需要加载该模块。由于require是同步的,它不会尝试同步加载脚本,如果脚本尚未加载,它无法返回模块。由于require应该解析相对于所需模块的相对模块 ID,因此您需要使用require它传递给您的。所以:

  1. 第一种方法是正确的。如果模块尚未加载,它会告诉 RequireJS 加载该模块。如果circular是最初undefined,它可以很快用另一个模块填充它。

  2. 第二种方式不正确。如果circular2尚未加载,则调用require将不起作用。它将正确解析模块 ID,因为它使用require给定的。

  3. 第三种方式在这种情况下是正确的,但是如果你给它传递一个相关的模块 ID 之类的./circular3,它就行不通了。如果模块尚未加载,它也会告诉 RequireJS 加载模块,因此您不会遇到 #2 中的问题。唯一的区别是它使用 global require,它缺少require传递给工厂函数的上下文,所以如果你向它传递一个相对模块 ID,比如./circular3,它不知道相对于什么来解析它。

  4. 这种方式结合了#2和#3的不正确性。首先,它无法正确解析相关模块 ID。其次,即使它可以正确解析相对 ID,如果模块尚未加载,它仍然不会加载它们。

如果您可以保证在模块需要它circularN之前始终定义该exampleN模块,那么是的,它会工作,但是使用方法#1 和#3 确保它会工作,即使不是这种情况。

于 2013-06-19T04:16:10.813 回答