2012-06-09 95 views
16

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

Uncaught TypeError: object is not a function

有时,抱怨没有被加载的模块。

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

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

+1

我怀疑,这的确是一个RequireJS问题,而是一些浏览器相关的一个。它是否在不同的浏览器中一致地失败? RequireJS是否将任何问题(例如加载脚本时超时)记录到控制台? – Lucero

+0

我在Chrome中看到的最多,但我也看到它也出现在Firefox中。没有RequireJS日志或错误。正在发生的错误是当我尝试实例化从加载的模块导出的Javascript函数(原型)时。这是抛出,因为该模块似乎没有正确加载,因为JavaScript不承认它是一个函数。这是错误实际发生的时间 - 这只是有时候。剩下的时间,代码执行得很好。无论如何,没有RequireJS超时错误。 – redhotvengeance

+0

听起来像加载/初始化问题的顺序给我。请注意,如果您的代码中存在循环依赖关系,则可以获取未定义的引用,我会先查找它们。我们有一个由RequireJS加载的几百个JS文件的项目,并且没有任何问题(无论是在Chrome还是其他浏览器中)。 – Lucero

回答

5

这绝对是我在过去几天遇到过的一个错误。加载一个模块会导致应用程序不同部分中的第二个完全不相关的模块在之前完美工作的位置变得未定义。我已经使用了RequireJS很多 - 这不是一个脚本加载或循环依赖问题。

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

这会导致其他地方完全不相关的模块变得不确定:首先我需要在二线视图的文本文件被重复了好几次(1800+)时遇到的错误最常见。我通过将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 

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

+1

我得到了完全相同的问题。另请参阅https://groups.google.com/forum/?fromgroups#!topic/requirejs/Eym3R08Bmmg –

+0

显然,还需要视图1中View 2的“text!...”依赖性,才能使模块再次正确加载。不漂亮,但它的作品。 –

+0

很高兴听到我不疯狂 - 如果它是间歇性的,它显然不能成为循环依赖问题。显然是更深层次的事情。我将跟随您打开的Google网上论坛,@SteveBeer。 – redhotvengeance

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 

有了这个结构,我得到了像TypeErrors“视图1不是构造函数”当路由器尝试实例的意见。

而且需要在顶层欣赏到嵌套视图模板解决了我的问题:

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的作品,但是这看起来对我来说,这些嵌套文本!当设置父模块的某个“准备就绪”标志时,不会考虑调用。

+0

是的,这看起来是什么导致了这个问题。我也使用了很多文字!电话,所以看起来问题在那里。 – redhotvengeance