日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

es6 混合commjs_详谈commonjs模块与es6模块的区别

發布時間:2025/3/21 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 es6 混合commjs_详谈commonjs模块与es6模块的区别 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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

commonjs

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

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

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

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

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

ES6模塊

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

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

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

循環加載時,

上面說了一些重要區別。現在舉一些例子來說明每一點吧

commonjs

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

// b.js

let count = 1

let plusCount = () => {

count++

}

setTimeout(() => {

console.log('b.js-1', count)

}, 1000)

module.exports = {

count,

plusCount

}

// a.js

let 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.js

a.js-1 1

a.js-2 1

b.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.js

a.js-1 1

a.js-2 1

b.js-1 2 // 1秒后

a.js-3 2 // 2秒后, 由于沒有定義setter,因此無法對值進行設置。所以還是返回2

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

// b.js

let 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.js

var 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.js

a.js-1 1

a.js-2 2

b.js-1 2

a.js-3 3

b.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.js

exports.done = false

let a = require('./a.js')

console.log('b.js-1', a.done)

exports.done = true

console.log('b.js-2', '執行完畢')

// a.js

exports.done = false

let b = require('./b.js')

console.log('a.js-1', b.done)

exports.done = true

console.log('a.js-2', '執行完畢')

// c.js

let a = require('./a.js')

let b = require('./b.js')

console.log('c.js-1', '執行完畢', a.done, b.done)

node c.js

b.js-1 false

b.js-2 執行完畢

a.js-1 true

a.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.js

export let counter = {

count: 1

}

setTimeout(() => {

console.log('b.js-1', counter.count)

}, 1000)

// a.js

import { counter } from './b.js'

counter = {}

console.log('a.js-1', counter)

// Syntax Error: "counter" is read-only

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

// a.js

import { counter } from './b.js'

counter.count++

console.log(counter)

// 2

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

// b.js

import {foo} from './a.js';

export function bar() {

console.log('bar');

if (Math.random() > 0.5) {

foo();

}

}

// a.js

import {bar} from './b.js';

export function foo() {

console.log('foo');

bar();

console.log('執行完畢');

}

foo();

node a.js

foo

bar

執行完畢

// 執行結果也有可能是

foo

bar

foo

bar

執行完畢

執行完畢

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

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

總結

以上是生活随笔為你收集整理的es6 混合commjs_详谈commonjs模块与es6模块的区别的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产成人精品av久久 | 999精品在线观看 | 好吊妞视频这里只有精品 | 黄色一级片免费播放 | 亚洲黄色网址大全 | av一区二区在线观看 | 五月婷六月 | 久久人人做 | 欧美另类videosbestsex日本 | 欧美日韩精品在线观看 | 午夜精品网| 久久成人免费网站 | 大黑人交交护士xxxxhd | 性xxxx欧美| 午夜小视频免费 | 欧美福利精品 | 国产精品久久久毛片 | 国产一区成人 | 极品白嫩丰满美女无套 | 丰满少妇久久久久久久 | 国产又黄又粗的视频 | jk美女又爽又黄视频 | 天堂网视频在线观看 | www.毛片| 久久亚洲成人 | 天天射夜夜爽 | 成年人免费在线观看网站 | 欧美久久视频 | 加勒比精品在线 | 91久久人人| 丝袜淫脚 | 久久久久无码精品国产sm果冻 | 乱色精品无码一区二区国产盗 | 精品人妻一区二区三区日产乱码 | 少妇高潮视频 | 成人黄色一级片 | 第一次破处视频 | 夜色精品| 国产美女永久免费无遮挡 | 亚洲免费网站 | aaaaaaa毛片| 亚洲观看黄色网 | 四虎精品成人免费网站 | 国产一区二区三区在线视频观看 | 狠狠做深爱婷婷久久综合一区 | 日本中文字幕高清 | 亚洲一区二区三区影院 | 淫久久 | 台湾佬成人中文网222vvv | 色com| 潘金莲一级淫片aaaaaa播放 | 丝袜制服中文字幕 | 亚洲成人国产精品 | 国产精品午夜福利视频234区 | 特级西西444www大精品视频免费看 | 色哟哟在线观看视频 | 最新色网址| av手机天堂 | 一本色道久久综合亚洲精品 | 乱码av| 欧美精品日韩在线观看 | 成人综合色站 | 在线手机av| 在线看片你懂的 | 一二三四国产精品 | 在线免费日本 | 少妇学院在线观看 | 极品白嫩少妇无套内谢 | 综合网中文字幕 | 国产精品99精品无码视 | 91精品国产91久久久久久黑人 | 午夜久久久久久久 | 亚洲乱码少妇 | 成人午夜天 | 18禁网站免费无遮挡无码中文 | 99这里有精品 | 欧美性综合| 天堂av在线中文 | 欧美一级欧美三级在线观看 | 影音先锋啪啪资源 | 黄色在线观看av | 性插动态视频 | 日本一区不卡视频 | 亚洲尤物在线 | 好吊妞视频在线观看 | 黄色激情在线观看 | 老妇高潮潮喷到猛进猛出 | 亚洲精品久久久久久一区二区 | 国产成人a∨ | 91精选视频 | 日本视频中文字幕 | 国产精品二区三区 | 黄p在线播放 | 欧美性生话 | 91爱啪| 九九九免费视频 | 91干视频 | 不卡一区二区三区四区 | 美女二区|