CommonJs和ES6的區(qū)別

CommonJs

運(yùn)行時加載(動態(tài)加載)焦蘑,相當(dāng)于module.exports的那一刻進(jìn)行了值拷貝巍扛,其實(shí)就是是給 module.exports 賦予了一個新的對象,拷貝的對象里每個key和每個value和module.exports對應(yīng)
因?yàn)槭莿討B(tài)語法,所以可以寫在判斷里

獲取module.exports值的改變

第一種方式

我們知道m(xù)odule.exports實(shí)際上是執(zhí)行了值拷貝,并且新對象的key和value與module.exports對應(yīng)玻佩,那么對于引用類型的value而言,他們指向的都是同一個堆地址漱牵,當(dāng)然可以動態(tài)獲取

//b.js
const obj = {
    b: 1,
};

module.exports = {
    obj
};

setTimeout(() => {
    obj.b = 2;
});

//a.js
const {
    obj,
} = require("./b.js");

console.log(obj.b);

setTimeout(() => {
    console.log(obj.b);
}, 1000);

//node a.js
//1
//2

翻譯一下

//b.js
  let obj = {
      b: 1
  };

  const myModule = {
      exports: {}
  }

  myModule.exports = {
      obj
  }

  setTimeout(() => {
      obj.b = 2;
  });

//a.js
  const { obj: copyObj } = myModule.exports;

  console.log(copyObj.b);    //1

  setTimeout(() => {
       console.log(copyObj.b);   //2
  }, 1000);

  //const b = require('./b');
  //obj對象直接賦值給了新對象copyObj夺蛇,兩個對象指向同一個堆地址
  //這時候改變obj.b(兩個對象仍然指向同一個堆地址),結(jié)果自然會改變

第二種方式

利用函數(shù)動態(tài)獲取

//b.js
let b = 1

module.exports = {
    getB: () => b
};

setTimeout(() => {
    b = 2;
}, 500);

//a.js
const {
    getB
} = require("./b.js");

console.log(getB());

setTimeout(() => {
    console.log(getB());
}, 1000);

//node a.js
//1
//2

多次require同一個模塊

第一次require模塊時會緩存其執(zhí)行結(jié)果酣胀,當(dāng)后面再require模塊時不會重復(fù)執(zhí)行模塊代碼,而是讀取緩存并直接拷貝當(dāng)前該模塊已經(jīng)module.exports的值

//b.js
module.exports.b = 1;
const A = require('./a');
console.log(A.a);
module.exports.b = 2;

//a.js
module.exports.a = 1;
const B = require('./b');
console.log(B.b);
module.exports.a = 2;

//node a.js
//執(zhí)行b模塊時娶聘,b 中想引入 a 模塊的時候闻镶,因?yàn)?node 之前已經(jīng)加載過 a 模塊了,所以它不會再去重復(fù)執(zhí)行 a 模塊丸升,而是直接拷貝一份{a: 1}铆农,所以A.a = 1
//1
//執(zhí)行到a的打印時,b中的module.exports.b= 2修改了之前的導(dǎo)出狡耻,所以B.b = 2
//2

因?yàn)榫彺鏅C(jī)制墩剖,出現(xiàn)循環(huán)依賴時才不會出現(xiàn)無限循環(huán)調(diào)用的情況

ES6

編譯時加載,也就是靜態(tài)加載夷狰,相當(dāng)于建立了動態(tài)綁定關(guān)系岭皂,當(dāng)使用某個值時通過綁定關(guān)系,可以取到模塊內(nèi)部實(shí)時的值
import是靜態(tài)執(zhí)行沼头,所以不能使用表達(dá)式和變量爷绘,這些只有在運(yùn)行時才能得到結(jié)果的語法結(jié)構(gòu)

import和export

import在執(zhí)行時會優(yōu)先執(zhí)行,export會“變量提升”

// b.js
export const b = 1;
import * as a from "./a";
console.log(a);

// a.js
import { b } from "./b";
console.log("a.js");
export const a = 1;
export const A = () => {
   console.log("A");
};
export function AA() {
   console.log("AA");
}

//執(zhí)行結(jié)果
// { a: undefined, A: undefined, AA: [Function: AA] } AA是函數(shù)申明进倍,會被提取到頂部土至,所以不是undefined,而函數(shù)表達(dá)式會和變量聲明一樣猾昆,只提升A陶因,賦值操作要等到代碼執(zhí)行到具體位置,所以為undefined

多次import同一個模塊

ES6 不會再去執(zhí)行重復(fù)加載的模塊垂蜗,又由于 ES6 動態(tài)輸出綁定的特性楷扬,能保證 ES6 在任何時候都能獲取其它模塊當(dāng)前的最新值。

// b.js
import { a } from './a';
export const b = '1';
console.log(a);
setTimeout(() => {
 console.log(a);
})

// a.js
import { b } from './b';
console.log(b);
export const a = 2;

//執(zhí)行結(jié)果
// undefined
// 1
// 2
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末么抗,一起剝皮案震驚了整個濱河市毅否,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蝇刀,老刑警劉巖螟加,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡捆探,警方通過查閱死者的電腦和手機(jī)然爆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來黍图,“玉大人曾雕,你說我怎么就攤上這事≈唬” “怎么了剖张?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長揩环。 經(jīng)常有香客問我搔弄,道長,這世上最難降的妖魔是什么丰滑? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任顾犹,我火速辦了婚禮,結(jié)果婚禮上褒墨,老公的妹妹穿的比我還像新娘炫刷。我一直安慰自己,他們只是感情好郁妈,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布浑玛。 她就那樣靜靜地躺著,像睡著了一般圃庭。 火紅的嫁衣襯著肌膚如雪锄奢。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天剧腻,我揣著相機(jī)與錄音拘央,去河邊找鬼。 笑死书在,一個胖子當(dāng)著我的面吹牛灰伟,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播儒旬,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼栏账,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了栈源?” 一聲冷哼從身側(cè)響起挡爵,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎甚垦,沒想到半個月后茶鹃,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體涣雕,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年闭翩,在試婚紗的時候發(fā)現(xiàn)自己被綠了挣郭。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡疗韵,死狀恐怖兑障,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蕉汪,我是刑警寧澤流译,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站肤无,受9級特大地震影響先蒋,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜宛渐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望眯搭。 院中可真熱鬧窥翩,春花似錦、人聲如沸鳞仙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽棍好。三九已至仗岸,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間借笙,已是汗流浹背扒怖。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留业稼,地道東北人盗痒。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像低散,于是被迫代替她去往敵國和親俯邓。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容