在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 中的循環依賴 - 網道