我在过去几天遇到了很多次的一个bug。加载一个模块可能会导致应用程序中不相关的另一个模块在之前运行良好的地方变为未定义。我经常使用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配置指令进行配置。
加载的非AMD模块:
- Backbone
- Underscore
- jQuery
- Mustache
- Leaflet
- Bootstrap
附言:如果这不是正确的地方,请谅解。我认为这应该是一条评论,但实在找不到评论按钮。
更新:此依赖结构会一直出现问题。
Main
- View 1
- text!...
- View 2
- text!...
替换文本为空字符串每次都可以正常工作:
Main
- View 1
- View 2
那么为什么等待文本加载会导致视图1变为未定义,而它在主模块中被明确设置为依赖项?毕竟,在所有依赖项加载完成之前,主模块不应该被调用吗?