seajs到底是垃圾还是神???模块依赖怎么就不行
有三个js文件,1.js 2.js 3.js,一个index.html文件(空。只写模板和引入seajs和写配置),
----------------首页index.html-------------
<script src="sea.min.js"></script>
<script>
seajs.use('./1.js');
</script>
------------------1.js文件-----------------
define(function(require, exports, module){
require('2').abc();
});
------------------2.js文件-----------------
define(function(require, exports, module){
require('3').abc();
exports.abc = function(){
console.log('module2');
}
});
------------------3.js文件-----------------
define(function(require, exports, module){
require('2').abc();
exports.abc = function(){
console.log('3333333');
}
});
提示,控制台查看js文件都正常加载到了,这里付上截图
模块1依赖模块2,模块2依赖模块3,模块3页依赖模块2,单是问题来了,凭什么模块3不能调用模块2的abc方法,换成seajs.use()可以找到模块2的返回值是一个对象,而且返回值里面有abc方法,但是是空函数,到底是我脑残?还是seajs傻逼,来位大神解答下!!!
这里模块3调用模块2的时候,不管是use方法还是直接require再或者require.async方法都是一样不行。
二楼说换命名方式,换成英文的,我换了,一样无用,a.js b.js c.js无用,求大神实质性的解答下,感激不尽
知问里面发过的帖子沉了很久,这里就不知道能沉多久了!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
虽然很久不用 seajs 了(毕竟过时很久了),但冲着题主的怨气,强答一发顺顺毛。
题主代码的问题在于,模块依赖中产生了递归依赖条件(死循环依赖),如果按代码直觉逻辑,这儿应该是会直接卡死(
2
的执行完成依赖3
的执行完成,3
的执行完成依赖2
的执行完成,死循环,直接卡住无法执行),好在一般模块加载库都不会这么傻,它们会选择一个可接受的方式取舍。不同的模块加载库对递归依赖的处理方式不一样,
seajs
的取舍方式简单描述是:所有,
3
模块里require到的2
,不是最终的2
,而是因为循环依赖而暂时卡在中间状态的2
。当然,这里面有很多细节,我的表述也不够严谨。你可以看 seajs 的官方文档,里面有更准确的说明。
解决方案是:
尽量不要产生递归依赖。
如果 1 不好满足,可以采用异步加载模块(require.async)或者异步执行具体调用(等所有递归依赖模块都加载完成)。
我觉得你应该换种命名,而不是用1 2 3,可能数字加载会出现问题