Node.js之循環依賴

在Node.js中有可能會出現循環依賴的問題,在此作一個簡單的記錄segmentfault

假若有一個模塊A:緩存

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

假若有一個模塊B:ui

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

咱們在main.js中調用他們:code

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

這就是一個循環依賴的問題,a中加載了b,b中加載了a,咱們看一下輸出結果:get

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

能夠發現,雖然循環依賴了 ,可是並無形成死循環,這是怎麼作到的呢?console

原理就是模塊加載過程的緩存機制,Node對模塊的加載作了緩存的,能夠經過require.cache訪問到,這樣看來上邊的內容就比較好理解了 。class

在加載a的時候,a是沒有緩存的,當a的代碼走到加載b的時候,就進入了模塊b中,依次調用代碼,當在b中加載a的時候,這時候a已經被緩存了,所以會使用緩存值,這個時候b加載後的結果是:require

{
    aWasLoaded: false,
    loaded: true
}

b加載完成後,a模塊繼續走本身的代碼,所以這是a的結果就是:module

{
    aWasLoaded: true,
    loaded: true
}

調用const b = require('./b');這段代碼時,由於b已經緩存了,因此不會沖走b模塊的代碼,因此最後打印的結果是:{ aWasLoaded: false, loaded: true }原理

用比較專業的話來講,就是循環依賴會致使模塊加載時的缺失現象

更相信的內容,能夠看這篇文章Node.js 中的循環依賴 - 網道

相關文章
相關標籤/搜索