亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

詳談commonjs模塊與es6模塊的區別

2019-11-19 15:08:54
字體:
來源:轉載
供稿:網友

到目前為止,已經實習了3個月的時間了。最近在面試,在面試題里面有題目涉及到模塊循環加載的知識。趁著這個機會,將commonjs模塊與es6模塊之間一些重要的的區別做個總結。語法上有什么區別就不具體說了,主要談談引用的區別。

commonjs

對于基本數據類型,屬于復制。即會被模塊緩存。同時,在另一個模塊可以對該模塊輸出的變量重新賦值。

對于復雜數據類型,屬于淺拷貝。由于兩個模塊引用的對象指向同一個內存空間,因此對該模塊的值做修改時會影響另一個模塊。

當使用require命令加載某個模塊時,就會運行整個模塊的代碼。

當使用require命令加載同一個模塊時,不會再執行該模塊,而是取到緩存之中的值。也就是說,commonjs模塊無論加載多少次,都只會在第一次加載時運行一次,以后再加載,就返回第一次運行的結果,除非手動清除系統緩存。

循環加載時,屬于加載時執行。即腳本代碼在require的時候,就會全部執行。一旦出現某個模塊被"循環加載",就只輸出已經執行的部分,還未執行的部分不會輸出。

ES6模塊

es6模塊中的值屬于【動態只讀引用】。

對于只讀來說,即不允許修改引入變量的值,import的變量是只讀的,不論是基本數據類型還是復雜數據類型。當模塊遇到import命令時,就會生成一個只讀引用。等到腳本真正執行時,再根據這個只讀引用,到被加載的那個模塊里面去取值。

對于動態來說,原始值發生變化,import加載的值也會發生變化。不論是基本數據類型還是復雜數據類型。

循環加載時,

上面說了一些重要區別?,F在舉一些例子來說明每一點吧

commonjs

對于基本數據類型,屬于復制。即會被模塊緩存。同時,在另一個模塊可以對該模塊輸出的變量重新賦值。

// b.jslet count = 1let plusCount = () => { count++}setTimeout(() => { console.log('b.js-1', count)}, 1000)module.exports = { count, plusCount}// a.jslet mod = require('./b.js')console.log('a.js-1', mod.count)mod.plusCount()console.log('a.js-2', mod.count)setTimeout(() => { mod.count = 3 console.log('a.js-3', mod.count)}, 2000)node a.jsa.js-1 1a.js-2 1b.js-1 2 // 1秒后a.js-3 3 // 2秒后

以上代碼可以看出,b模塊export的count變量,是一個復制行為。在plusCount方法調用之后,a模塊中的count不受影響。同時,可以在b模塊中更改a模塊中的值。如果希望能夠同步代碼,可以export出去一個getter。

// 其他代碼相同module.exports = { get count () { return count }, plusCount}node a.jsa.js-1 1a.js-2 1b.js-1 2 // 1秒后a.js-3 2 // 2秒后, 由于沒有定義setter,因此無法對值進行設置。所以還是返回2

對于復雜數據類型,屬于淺拷貝。由于兩個模塊引用的對象指向同一個內存空間,因此對該模塊的值做修改時會影響另一個模塊。

// b.jslet obj = { count: 1}let plusCount = () => { obj.count++}setTimeout(() => { console.log('b.js-1', obj.count)}, 1000)setTimeout(() => { console.log('b.js-2', obj.count)}, 3000)module.exports = { obj, plusCount}// a.jsvar mod = require('./b.js')console.log('a.js-1', mod.obj.count)mod.plusCount()console.log('a.js-2', mod.obj.count)setTimeout(() => { mod.obj.count = 3 console.log('a.js-3', mod.obj.count)}, 2000)node a.jsa.js-1 1a.js-2 2b.js-1 2a.js-3 3b.js-2 3

以上代碼可以看出,對于對象來說屬于淺拷貝。當執行a模塊時,首先打印obj.count的值為1,然后通過plusCount方法,再次打印時為2。接著在a模塊修改count的值為3,此時在b模塊的值也為3。

3.當使用require命令加載某個模塊時,就會運行整個模塊的代碼。

4.當使用require命令加載同一個模塊時,不會再執行該模塊,而是取到緩存之中的值。也就是說,commonjs模塊無論加載多少次,都只會在第一次加載時運行一次,以后再加載,就返回第一次運行的結果,除非手動清除系統緩存。

5.循環加載時,屬于加載時執行。即腳本代碼在require的時候,就會全部執行。一旦出現某個模塊被"循環加載",就只輸出已經執行的部分,還未執行的部分不會輸出。

3, 4, 5可以使用同一個例子說明// b.jsexports.done = falselet a = require('./a.js')console.log('b.js-1', a.done)exports.done = trueconsole.log('b.js-2', '執行完畢')// a.jsexports.done = falselet b = require('./b.js')console.log('a.js-1', b.done)exports.done = trueconsole.log('a.js-2', '執行完畢')// c.jslet a = require('./a.js')let b = require('./b.js')console.log('c.js-1', '執行完畢', a.done, b.done)node c.jsb.js-1 falseb.js-2 執行完畢a.js-1 truea.js-2 執行完畢c.js-1 執行完畢 true true

仔細說明一下整個過程。

在Node.js中執行c模塊。此時遇到require關鍵字,執行a.js中所有代碼。

在a模塊中exports之后,通過require引入了b模塊,執行b模塊的代碼。

在b模塊中exports之后,又require引入了a模塊,此時執行a模塊的代碼。

a模塊只執行exports.done = false這條語句。

回到b模塊,打印b.js-1, exports, b.js-2。b模塊執行完畢。

回到a模塊,接著打印a.js-1, exports, b.js-2。a模塊執行完畢

回到c模塊,接著執行require,需要引入b模塊。由于在a模塊中已經引入過了,所以直接就可以輸出值了。

結束。

從以上結果和分析過程可以看出,當遇到require命令時,會執行對應的模塊代碼。當循環引用時,有可能只輸出某模塊代碼的一部分。當引用同一個模塊時,不會再次加載,而是獲取緩存。

ES6模塊

es6模塊中的值屬于【動態只讀引用】。只說明一下復雜數據類型。

對于只讀來說,即不允許修改引入變量的值,import的變量是只讀的,不論是基本數據類型還是復雜數據類型。當模塊遇到import命令時,就會生成一個只讀引用。等到腳本真正執行時,再根據這個只讀引用,到被加載的那個模塊里面去取值。

對于動態來說,原始值發生變化,import加載的值也會發生變化。不論是基本數據類型還是復雜數據類型。

// b.jsexport let counter = { count: 1}setTimeout(() => { console.log('b.js-1', counter.count)}, 1000)// a.jsimport { counter } from './b.js'counter = {}console.log('a.js-1', counter)// Syntax Error: "counter" is read-only

雖然不能將counter重新賦值一個新的對象,但是可以給對象添加屬性和方法。此時不會報錯。這種行為類型與關鍵字const的用法。

// a.jsimport { counter } from './b.js'counter.count++console.log(counter)// 2

循環加載時,ES6模塊是動態引用。只要兩個模塊之間存在某個引用,代碼就能夠執行。

// b.jsimport {foo} from './a.js';export function bar() { console.log('bar'); if (Math.random() > 0.5) { foo(); }}// a.jsimport {bar} from './b.js';export function foo() { console.log('foo'); bar(); console.log('執行完畢');}foo();node a.jsfoobar執行完畢// 執行結果也有可能是foobarfoobar執行完畢執行完畢

由于在兩個模塊之間都存在引用。因此能夠正常執行。

以上這篇詳談commonjs模塊與es6模塊的區別就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲韩国日本中文字幕| 久久久在线免费观看| 成人黄色在线免费| 亚洲色图av在线| 国模精品视频一区二区三区| 中文字幕日韩综合av| 午夜精品久久久久久久白皮肤| 爱福利视频一区| 丝袜亚洲欧美日韩综合| 欧美日韩另类在线| 国产91成人video| 国产999在线| 亚洲欧美视频在线| 福利一区视频在线观看| 亚洲午夜国产成人av电影男同| 91tv亚洲精品香蕉国产一区7ujn| 国产精品美女在线| 亚洲人午夜色婷婷| 久久99国产精品自在自在app| 欧美激情乱人伦一区| 91av在线网站| 成人免费福利在线| 欧美天天综合色影久久精品| 成人免费网站在线| 久久av中文字幕| 日韩精品电影网| 日本精品一区二区三区在线| 久久综合88中文色鬼| 欧美极品少妇xxxxⅹ喷水| 欧美性生交xxxxxdddd| 国产一区二区色| 81精品国产乱码久久久久久| 欧美放荡办公室videos4k| 国产成人免费av电影| 国产成人综合精品在线| 国产91精品高潮白浆喷水| 国产精品一区二区三区毛片淫片| 亚洲人成77777在线观看网| 国产精品人成电影在线观看| 精品欧美aⅴ在线网站| 亚洲一级黄色片| 欧美中文在线字幕| 亚洲久久久久久久久久| 欧美巨猛xxxx猛交黑人97人| 欧美精品生活片| 欧美一区二区大胆人体摄影专业网站| 国产精品久久久久77777| 黑人精品xxx一区一二区| 精品女厕一区二区三区| 国产欧美一区二区三区四区| 国产精品久久久久久中文字| 亚洲色图日韩av| 成人性生交大片免费观看嘿嘿视频| 日韩电影视频免费| 国内揄拍国内精品| 91日韩在线播放| 成人免费大片黄在线播放| 97在线观看免费高清| 亚洲精品国产电影| 亚洲第一页在线| 一区国产精品视频| 国产精品99久久久久久久久久久久| 欧美电影在线观看高清| 日韩久久午夜影院| 国产婷婷成人久久av免费高清| 欧美专区国产专区| 亚洲欧美精品中文字幕在线| 深夜福利亚洲导航| 在线成人中文字幕| 高清欧美一区二区三区| 中文字幕欧美在线| 久久在线免费视频| 欧美激情按摩在线| 日本欧美一级片| 啊v视频在线一区二区三区| 欧美中文字幕在线观看| 国产精品综合久久久| 欧美亚洲国产视频小说| zzijzzij亚洲日本成熟少妇| 亚洲天堂男人天堂| 亚洲片国产一区一级在线观看| 国内揄拍国内精品| 国产午夜精品理论片a级探花| 亚洲无线码在线一区观看| 永久免费看mv网站入口亚洲| 国产精品高潮粉嫩av| 日韩免费观看av| 欧美亚洲午夜视频在线观看| 97精品国产97久久久久久春色| 日韩成人网免费视频| 国产精品美乳在线观看| 亚洲国产成人精品一区二区| 久久久久久久国产精品视频| 精品亚洲一区二区三区四区五区| 国产一区二区黑人欧美xxxx| 日韩欧美成人精品| 中文欧美日本在线资源| 久久久精品久久久| zzijzzij亚洲日本成熟少妇| 成人妇女淫片aaaa视频| 久久激情视频久久| 久久久久久久999精品视频| 欧美成人网在线| 98精品在线视频| 国产精品18久久久久久首页狼| 91精品国产自产91精品| 久久国产色av| 久久这里有精品| 亲爱的老师9免费观看全集电视剧| 亚洲福利视频网站| 黑人欧美xxxx| 57pao精品| 欧美日产国产成人免费图片| 国产日韩欧美日韩大片| 国产精品美女在线| 日日骚久久av| 国产日韩欧美一二三区| 97在线视频免费播放| xxx成人少妇69| 国产精品欧美日韩久久| 中文字幕日本欧美| 国产精品第一页在线| 国产精品视频精品视频| 欧美午夜女人视频在线| 97精品国产91久久久久久| 亚洲激情视频在线播放| 国产精品老女人精品视频| 亚洲欧美国产视频| 日韩成人激情视频| 在线播放国产一区中文字幕剧情欧美| 成人深夜直播免费观看| 欧美激情视频三区| 91精品免费看| 日韩精品在线视频| 91精品国产高清自在线| 日韩精品福利网站| 欧美激情在线观看| 人体精品一二三区| 国产中文字幕亚洲| 精品激情国产视频| 国产91成人video| 亚洲精品www| 少妇激情综合网| 国产精品美女www爽爽爽视频| 欧美韩国理论所午夜片917电影| 成人高清视频观看www| 国产欧美日韩视频| 亚洲a∨日韩av高清在线观看| 在线不卡国产精品| 国产精品一区二区三区在线播放| 蜜月aⅴ免费一区二区三区| 国产精品热视频| 亚洲欧美自拍一区| 国产福利视频一区| 亚洲欧美在线x视频| 在线播放国产一区二区三区| 亚洲精品视频免费在线观看| 亚洲欧美精品在线| 国产精品久久电影观看| 91精品国产高清久久久久久久久| 国产亚洲欧洲黄色| 国产精品嫩草影院久久久| 亚洲欧美中文日韩在线v日本| 欧美肥婆姓交大片|