怎么叫模塊循環(huán)引用
- a腳本的執(zhí)行依賴b腳本,b腳本的執(zhí)行依賴a腳本
// a.js
var b = require('b');
// b.js
var a = require('a');
兩種解決方案:
CommonJS模塊
- 使用require語句導(dǎo)入模塊,module.exports導(dǎo)出模塊,輸出的是
值的拷貝,按需引入,同步執(zhí)行
- 對于基本數(shù)據(jù)類型天试,屬于復(fù)制,對于復(fù)雜數(shù)據(jù)類型然低,屬于淺拷貝
- 如何解決循環(huán)加載的原理:
循環(huán)加載時(shí)喜每,屬于加載時(shí)執(zhí)行。
即腳本代碼在require的時(shí)候雳攘,就會全部執(zhí)行带兜,然后在內(nèi)存中生成該模塊的一個(gè)說明對象
。當(dāng)再次執(zhí)行require命令吨灭,下次會直接讀取緩存刚照。一旦出現(xiàn)某個(gè)模塊被"循環(huán)加載"
,就只輸出已經(jīng)執(zhí)行的部分喧兄,還未執(zhí)行的部分不會輸出(解決原理)
{
id: '', //模塊名无畔,唯一
exports: { //模塊輸出的各個(gè)接口 使用當(dāng)?shù)臅r(shí)候啊楚,會來這里取值
...
},
loaded: true, //模塊的腳本是否執(zhí)行完畢
...
}
- 解決模塊循環(huán)引用問題,nodejs推薦使用
ES6模塊
-
import
語句導(dǎo)入模塊浑彰,export
語句導(dǎo)出模塊恭理,是異步的 - ES6模塊原理:不論是基本數(shù)據(jù)類型還是復(fù)雜數(shù)據(jù)類型。當(dāng)模塊遇到import命令時(shí),就會生成一個(gè)
只讀引用
,腳本真正執(zhí)行時(shí)何乎,再根據(jù)這個(gè)只讀引用竹观,到被加載的那個(gè)模塊里面去取值。循環(huán)加載時(shí)遭赂,ES6模塊是動態(tài)引用循诉。只要兩個(gè)模塊之間存在某個(gè)引用,代碼就能夠執(zhí)行(解決原理)
//a.js
console.log("before import b")
import 撇他 from "./b"
console.log("b is " + b)
export let a = b+1;
//b.js
console.log("before import a")
import {a} from "./a"
console.log("a is " + a)
export let b = a+1;
執(zhí)行結(jié)果:
// before import a
// a is undefined
// before import b
// b is NAN