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

发布于 2022-09-04 09:58:28 字数 1355 浏览 20 评论 0

有三个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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

绮烟 2022-09-11 09:58:28

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


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

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

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

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

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

解决方案是:

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

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

抚笙 2022-09-11 09:58:28

我觉得你应该换种命名,而不是用1 2 3,可能数字加载会出现问题

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文