zoukankan      html  css  js  c++  java
  • Node.js之循环依赖

    在Node.js中有可能会出现循环依赖的问题,在此做一个简单的记录

    假如有一个模块A:

    exports.loaded = false; 
    const b = require('./b'); 
    module.exports = { 
     bWasLoaded: b.loaded, 
     loaded: true 
    }; 
    
    

    假如有一个模块B:

    exports.loaded = false; 
    const a = require('./a'); 
    module.exports = { 
     aWasLoaded: a.loaded, 
     loaded: true 
    }; 
    
    

    我们在main.js中调用他们:

    const a = require('./a'); 
    const b = require('./b'); 
    console.log(a); 
    console.log(b); 
    

    这就是一个循环依赖的问题,a中加载了b,b中加载了a,我们看一下输出结果:

    { bWasLoaded: true, loaded: true }
    { aWasLoaded: false, loaded: true }
    

    可以发现,虽然循环依赖了 ,但是并没有造成死循环,这是怎么做到的呢?

    原理就是模块加载过程的缓存机制,Node对模块的加载做了缓存的,可以通过require.cache访问到,这样看来上边的内容就比较好理解了 。

    在加载a的时候,a是没有缓存的,当a的代码走到加载b的时候,就进入了模块b中,依次调用代码,当在b中加载a的时候,这时候a已经被缓存了,因此会使用缓存值,这个时候b加载后的结果是:

    {
    	aWasLoaded: false,
    	loaded: true
    }
    

    b加载完成后,a模块继续走自己的代码,因此这是a的结果就是:

    {
    	aWasLoaded: true,
    	loaded: true
    }
    

    调用const b = require('./b');这段代码时,因为b已经缓存了,所以不会冲走b模块的代码,所以最后打印的结果是:{ aWasLoaded: false, loaded: true }

    用比较专业的话来说,就是循环依赖会导致模块加载时的缺失现象

    更相信的内容,可以看这篇文章Node.js 中的循环依赖 - 网道

  • 相关阅读:
    面向对象
    反射的基本介绍
    简单的总结
    生成器和迭代器
    shutil
    模块
    利用reguests 请求获取列车时刻表
    初识requests
    hashlib:用于加密相关的操作,代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法
    【网站】一些有用的网站
  • 原文地址:https://www.cnblogs.com/machao/p/7649365.html
Copyright © 2011-2022 走看看