间歇性RequireJS加载错误

时间:2012-06-09 07:03:25

标签: javascript module backbone.js requirejs js-amd

我有一个使用RequireJS的相当大的Backbone.js项目。随着项目规模的增长(这里“大小”指的是单独模块文件的数量),间歇性错误开始出现。大多数情况下,这是一个对象错误:

Uncaught TypeError: object is not a function

偶尔会抱怨没有加载模块。

一旦项目通过r.js优化器运行,这些错误就会消失。它们仅在RequireJS加载单个模块时发生。

这让我想到了我的问题 - 当模块数量达到一定数量时,RequireJS是否开始及时加载模块的问题?

4 个答案:

答案 0 :(得分:9)

此问题似乎在即将发布的require.js 2.1版本中得到解决。见这里:

https://github.com/jrburke/requirejs/issues/478

答案 1 :(得分:5)

这绝对是我在过去几天遇到过的很多错误。加载一个模块可能会导致应用程序的不同部分中的第二个完全不相关的模块在之前完美运行的位置变为未定义。我经常使用RequireJS - 这不是脚本加载或循环依赖问题。起初我在第二层视图中需要一个文本文件时会经常遇到错误,这个文件被迭代了很多次(1800 +):

domReady -calls-> new View1() -iterates-> new SubView() -depends-> text!template
         -calls-> new View2() --> undefined!

这会导致其他地方完全不相关的模块变得不确定。通过将SubView功能集成到View模块中,我解决了一段时间。

domReady -calls-> new CombinedView1() -depends-> text!template
         -calls-> new View2() --> ... all good ...

随着项目的成长,我再次遇到困难,真的需要找到解决问题的方法。包含更多模块会导致先前定义的模块随机变为未定义。要求抛出没有错误,浏览器也没有。我也没有使用CoffeeScript或类似的东西。

我花了一些时间创建一个我的应用程序版本,该版本具有相同的模块和依赖关系结构,其中依赖的视图,模型和集合被删除。这完全正常,所以我只能假设存在某种内存问题?但Chrome也不会抛出任何错误。

我认为我的下一步是用一些耗费内存的循环填充我的骨架应用程序,看看会发生什么:我会告诉你它是怎么回事。

使用Require v2.0.1,因此没有使用shim config指令配置订单插件 - 依赖项和包。 加载了非AMD模块:

  • 骨干
  • 下划线
  • 的jQuery
  • 单张
  • 自举

P.S。如果这不是在正确的地方,请道歉。我认为作为评论会更好,但老实说我无法在任何地方看到评论按钮。

<强>更新 这种依赖结构始终如一地突破:

Main
  - View 1
      - text!...
      - View 2
         - text!...

用空字符串替换文本每次都可以正常工作:

Main
  - View 1
      - View 2

那么,为什么等待加载文本会导致View 1在主模块中显式设置为依赖项时变为未定义?肯定Main不应该被调用,直到它所依赖的东西被加载?

答案 2 :(得分:5)

我在前几天一直在和同样的问题作斗争,这就是我发现的:

显然,通过text.js插件需要模板的嵌套依赖结构可能会导致竞争条件,当requirejs认为它时,顶级模块没有准备就绪。当我有几个这种类型的嵌套模块依赖结构时,我才遇到这个问题:

Router
  -> View1
    -> text!.../view1.html
    -> View2
      -> text!.../view2.html
  -> View3
    -> text!.../view3.html
    -> View4
      -> text!.../view4.html
  -> View5
    -> text!.../view5.html
    -> View6
      -> text!.../view6.html
  -> View7
    -> text!.../view7.html
    -> View8
      -> text!.../view8.html

有了这个结构,当路由器试图实例化视图时,我得到类似'View1不是构造函数'的TypeErrors。

还要求顶层视图中嵌套视图的模板解决了我的问题:

Router
  -> View1
    -> text!.../view1.html
    -> text!.../view2.html
    -> View2
      -> text!.../view2.html
  -> View3
    -> text!.../view3.html
    -> text!.../view4.html
    -> View4
      -> text!.../view4.html
  -> View5
    -> text!.../view5.html
    -> text!.../view6.html
    -> View6
      -> text!.../view6.html
  -> View7
    -> text!.../view7.html
    -> text!.../view8.html
    -> View8
      -> text!.../view8.html

我真的不知道require.js是如何工作的,但这看起来就像那些嵌套文本!当设置父模块的某个“就绪”标志时,不会考虑调用。

答案 3 :(得分:1)

确认您有

希望这有帮助