zoukankan      html  css  js  c++  java
  • seaJS循环依赖的解决原理

    seajs模块的六个状态。

    var STATUS = { 
      'FETCHING': 1, // The module file is fetching now. 模块正在下载中 
      'FETCHED': 2, // The module file has been fetched. 模块已下载 
      'SAVED': 3, // The module info has been saved. 模块信息已保存 
      'READY': 4, // All dependencies and self are ready to compile. 模块的依赖项都已下载,等待编译 
      'COMPILING': 5, // The module is in compiling now. 模块正在编译中 
      'COMPILED': 6 // The module is compiled and module.exports is available. 模块已编译 
    }

    我们假设a.js的代码:

    define(function(require, exports, module){
        var b = require('./b.js');
        //......
    });
    

    b.js的代码:

    define(function(require, exports, module){
        var a = require('./a.js');
        //......
    });
    

    循环依赖的概念:seajs在使用a模块时,会先下载a模块,a模块下载时,a模块的状态是FETCHING,下载好了之后,a模块的状态是FETCHED,然后解析a模块,这时会从a模块的回调函数中寻找a模块依赖的模块,这里a模块依赖的模块是b模块。这时,a模块的状态变成了SAVED,然后去下载b模块,这时b模块的状态是FETCHING,下载好了之后,b模块的状态是FETCHED,然后解析b模块,这时会从b模块的回调函数中寻找b模块依赖的模块,这里b模块依赖的模块是a模块。这里就产生了循环依赖的问题。

    seajs里面是如何解决这个问题的呢?

    此问题,非常重要,不信,你等着看。

    seajs中处理这个问题的第一步:

    在a模块的回调函数中寻找a模块依赖的模块后(这时a模块的状态是SAVED了,会判断a模块所依赖的模块是否跟自己有循环依赖的关系,如果有,就不去下载,seajs是通过getPureDependencies方法进行判断的,由于这时b模块还不存在于cachedModules中,所以这里不会检查出a与b有循环依赖的关系。

    因此,去下载b模块,下载好了之后,b模块的状态是FETCHED,然后解析b模块,这时就会从b模块的回调函数中寻找b模块依赖的模块,这里检查出来了是a模块,这时b模块的状态变成了SAVED的。然后判断a模块是否与自己(b模块)循环依赖。由于此时a模块存在,并且状态是SAVED,这时就会检查出来了有依赖,因此b模块的状态就会直接变成了READY。

    这时,a模块的状态就会变成READY(如果a模块还依赖其他的模块,比如c模块,那么等c模块变成READY后,a模块才会变成READY状态)。这时,就会去编译a模块,a模块的状态是COMPILING,编译过程,其实就是执行a模块的回调函数,(如果这里a模块依赖的是c模块,这时,就会执行c模块的回调函数,也就是编译c模块,编译结束后,c模块变成了COMPILED),紧接着,a模块变成COMPILED。

    但是,这里依赖的是b模块,因此,在执行a模块的回调函数时(在编译a模块时),会执行b模块的回调函数,也就是编译b模块,等编译结束,b模块变成了COMPILED,紧接着a模块就变成了COMPILED。

    循环依赖的分析到此结束,大家可以跟着我的另一篇博客一起分析。

    http://www.cnblogs.com/chaojidan/p/4126647.html

    加油! 

  • 相关阅读:
    uninstall_edge:win10带浏览器edge卸载工具
    安装spacedesk后,Win10状态栏图标间距变宽
    jacob实现语音朗读一段文本
    汇编语言-12内中断
    告警只提示一次,未解决也不再次提示
    汇编语言-11标志寄存器
    第2章 顺序表及其顺序存储
    第1章 概论
    再见:计算机行业
    QPainter
  • 原文地址:https://www.cnblogs.com/chaojidan/p/4514710.html
Copyright © 2011-2022 走看看