red*_*nce 16 javascript module requirejs backbone.js js-amd
我有一个使用RequireJS的相当大的Backbone.js项目.随着项目规模的增长(这里"大小"指的是单独模块文件的数量),间歇性错误开始出现.大多数情况下,这是一个对象错误:
Uncaught TypeError: object is not a function
有时,它抱怨模块没有加载.
一旦项目通过r.js优化器运行,这些错误就会消失.它们仅在RequireJS加载单个模块时发生.
这让我想到了我的问题 - 当模块数量达到一定数量时,RequireJS是否开始出现模块加载问题?
这绝对是我在过去几天遇到的一个错误.加载一个模块可能会导致应用程序的不同部分中的第二个完全不相关的模块在之前完美运行的位置变为未定义.我经常使用RequireJS - 这不是脚本加载或循环依赖问题.起初我在第二层视图中需要一个文本文件时会经常遇到错误,这个文件被迭代了很多次(1800+):
domReady -calls-> new View1() -iterates-> new SubView() -depends-> text!template
-calls-> new View2() --> undefined!
Run Code Online (Sandbox Code Playgroud)
这将导致其他地方完全不相关的模块变得不确定.通过将SubView功能集成到View模块中,我解决了一段时间.
domReady -calls-> new CombinedView1() -depends-> text!template
-calls-> new View2() --> ... all good ...
Run Code Online (Sandbox Code Playgroud)
随着项目的不断发展,我再次遇到困难,真的需要找到解决问题的方法.包含更多模块会导致先前定义的模块随机变为未定义.要求抛出没有错误,浏览器也没有.我也没有使用CoffeeScript或类似的东西.
我花了一些时间创建一个我的应用程序版本,它具有相同的模块和依赖关系结构,其中依赖的视图,模型和集合被删除.这完全正常,所以我只能假设存在某种内存问题?但Chrome也不会抛出任何错误.
我认为我的下一步是用一些耗费内存的循环填充我的骨架应用程序,看看会发生什么:我会告诉你它是怎么回事.
使用Require v2.0.1,所以没有订单插件 - 依赖关系和包都使用shim config指令配置.加载非AMD模块:
PS道歉,如果这不是在正确的地方.我认为作为评论会更好,但老实说,我无法在任何地方看到评论按钮.
更新: 此依赖关系结构始终如一:
Main
- View 1
- text!...
- View 2
- text!...
Run Code Online (Sandbox Code Playgroud)
用空字符串替换文本每次都可以正常工作:
Main
- View 1
- View 2
Run Code Online (Sandbox Code Playgroud)
那么,为什么等待加载文本会导致View 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
Run Code Online (Sandbox Code Playgroud)
有了这个结构,当路由器试图实例化视图时,我得到了类似'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
Run Code Online (Sandbox Code Playgroud)
我真的不知道require.js是如何工作的,但这看起来就像那些嵌套文本!当设置父模块的某个"就绪"标志时,不会考虑调用.
| 归档时间: |
|
| 查看次数: |
7915 次 |
| 最近记录: |