17

I have a rather large Backbone.js project that uses RequireJS. As the project size grew ("size" here referring to the number of separate module files), intermittent errors started cropping up. Most of the time, it's an object error:

Uncaught TypeError: object is not a function

Occasionally, it complains about a module not being loaded.

These errors disappear once the project is run through the r.js optimizer. They only happen when RequireJS is loading the individual modules.

Which brings me down to my question - does RequireJS start having issues with modules loading in time when the number of modules reach a certain number?

4

4 回答 4

9

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

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

于 2012-09-27T19:08:43.517 回答
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 ...

随着项目的发展,我再次碰壁,真的需要找到一种方法来解决它。包含更多模块会导致先前定义的模块随机变为未定义。Require 不会引发错误,浏览器也不会。我也没有使用 CoffeeScript 或类似的东西。

我花了一些时间创建了我的应用程序的一个版本,它具有相同的模块和依赖结构,依赖视图、模型和集合被删除。这工作得很好,所以我只能假设存在某种内存问题?但是 Chrome 也从不抛出任何错误。

我想我的下一步是用一些消耗内存的循环来填充我的骨架应用程序,看看会发生什么:我会让你知道它是怎么回事。

使用 Require v2.0.1,所以没有顺序插件 - 依赖项和包都使用 shim config 指令进行配置。加载的非 AMD 模块:

  • 骨干
  • 下划线
  • jQuery
  • 胡子
  • 传单
  • 引导程序

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

更新: 此依赖结构不断中断:

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

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

Main
  - View 1
      - View 2

那么为什么等待文本加载会导致 View 1 在主模块中显式设置为依赖项时变得未定义呢?在加载它所依赖的所有内容之前,肯定不应该调用 Main 吗?

于 2012-06-18T16:59:06.210 回答
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 不是构造函数”这样的类型错误。

还需要顶层视图中嵌套视图的模板为我解决了这个问题:

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 是如何工作的,但这在我看来就像那些嵌套文本!当为父模块设置了一些“就绪”标志时,不考虑调用。

于 2012-08-17T07:16:20.350 回答
1

确认您有

希望这可以帮助

于 2012-08-11T09:06:51.430 回答