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

    加油! 

  • 相关阅读:
    hadoop再次集群搭建(3)-如何选择相应的hadoop版本
    48. Rotate Image
    352. Data Stream as Disjoint Interval
    163. Missing Ranges
    228. Summary Ranges
    147. Insertion Sort List
    324. Wiggle Sort II
    215. Kth Largest Element in an Array
    快速排序
    280. Wiggle Sort
  • 原文地址:https://www.cnblogs.com/chaojidan/p/4514710.html
Copyright © 2011-2022 走看看