當前位置:編程學習大全網 - 源碼下載 - ES6 模塊與 CommonJS 模塊的差異

ES6 模塊與 CommonJS 模塊的差異

討論 Node.js 加載 ES6 模塊之前,必須了解 ES6 模塊與 CommonJS 模塊完全不同。

它們有三個重大差異。

第二個差異是因為 CommonJS 加載的是壹個對象(即module.exports屬性),該對象只有在腳本運行完才會生成。而 ES6 模塊不是對象,它的對外接口只是壹種靜態定義,在代碼靜態解析階段就會生成。

下面重點解釋第壹個差異。

CommonJS 模塊輸出的是值的拷貝,也就是說,壹旦輸出壹個值,模塊內部的變化就影響不到這個值。請看下面這個模塊文件lib.js的例子。

上面代碼輸出內部變量counter和改寫這個變量的內部方法incCounter。然後,在main.js裏面加載這個模塊。

上面代碼說明,lib.js模塊加載以後,它的內部變化就影響不到輸出的mod.counter了。這是因為mod.counter是壹個原始類型的值,會被緩存。除非寫成壹個函數,才能得到內部變動後的值。

上面代碼中,輸出的counter屬性實際上是壹個取值器函數。現在再執行main.js,就可以正確讀取內部變量counter的變動了。

上面代碼說明,ES6 模塊輸入的變量counter是活的,完全反應其所在模塊lib.js內部的變化。

再舉壹個出現在export壹節中的例子。

上面代碼中,m1.js的變量foo,在剛加載時等於bar,過了 500 毫秒,又變為等於baz。

讓我們看看,m2.js能否正確讀取這個變化。

上面代碼表明,ES6 模塊不會緩存運行結果,而是動態地去被加載的模塊取值,並且變量總是綁定其所在的模塊。

由於 ES6 輸入的模塊變量,只是壹個“符號連接”,所以這個變量是只讀的,對它進行重新賦值會報錯。

上面代碼中,main.js從lib.js輸入變量obj,可以對obj添加屬性,但是重新賦值就會報錯。因為變量obj指向的地址是只讀的,不能重新賦值,這就好比main.js創造了壹個名為obj的const變量。

最後,export通過接口,輸出的是同壹個值。不同的腳本加載這個接口,得到的都是同樣的實例。

上面的腳本mod.js,輸出的是壹個C的實例。不同的腳本加載這個模塊,得到的都是同壹個實例。

現在執行main.js,輸出的是1。

這就證明了x.js和y.js加載的都是C的同壹個實例。

  • 上一篇: 礦產資源
  • 下一篇:什麽叫雙核瀏覽器
  • copyright 2024編程學習大全網