模块化 - seajs到底是垃圾还是神???模块依赖怎么就不行

查看:90
本文介绍了模块化 - 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无用,求大神实质性的解答下,感激不尽

知问里面发过的帖子沉了很久,这里就不知道能沉多久了!

解决方案

虽然很久不用 seajs 了(毕竟过时很久了),但冲着题主的怨气,强答一发顺顺毛。


题主代码的问题在于,模块依赖中产生了递归依赖条件(死循环依赖),如果按代码直觉逻辑,这儿应该是会直接卡死(2的执行完成依赖3的执行完成,3的执行完成依赖2的执行完成,死循环,直接卡住无法执行),好在一般模块加载库都不会这么傻,它们会选择一个可接受的方式取舍。

不同的模块加载库对递归依赖的处理方式不一样,seajs的取舍方式简单描述是:

如果一个模块依赖一个正在加载的模块(产生循环依赖),使用此模块的当前状态(而不是等待最后结果)作为加载的返回值。

所有,3模块里require到的 2,不是最终的2,而是因为循环依赖而暂时卡在中间状态的2

当然,这里面有很多细节,我的表述也不够严谨。你可以看 seajs 的官方文档,里面有更准确的说明。

解决方案是:

  1. 尽量不要产生递归依赖。

  2. 如果 1 不好满足,可以采用异步加载模块(require.async)或者异步执行具体调用(等所有递归依赖模块都加载完成)。

这篇关于模块化 - seajs到底是垃圾还是神???模块依赖怎么就不行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆