间歇性要求JS加载错误

Intermittent RequireJS Load Error

本文关键字:JS 加载 错误      更新时间:2023-09-26

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

Uncaught TypeError: object is not a function

有时,它会抱怨模块未加载。

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

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

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

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

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

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

这将导致其他地方完全不相关的模块变得未定义。我通过将 SubView 功能集成到视图模块中来解决这个问题一段时间。

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

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

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

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

使用

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

  • 骨干
  • 强调
  • jQuery
  • 胡子
  • 小叶
  • 启动

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

更新:此依赖关系结构会持续中断:

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

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

Main
  - View 1
      - View 2

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

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

显然,需要通过 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是如何工作的,但在我看来,这就像那些嵌套的文本! 当为父模块设置某些"就绪"标志时,不会考虑调用。

验证您是否有

  • 配置 http://requirejs.org/docs/api.html#config-shim 填充码
  • "等待秒"属性和
  • http://requirejs.org/docs/errors.html#timeout

希望这有帮助