ES6 模塊與 CommonJS 模塊的差異
- CommonJS 模塊輸出的是一個值的拷貝,ES6 模塊輸出的是值的引用。
- CommonJS 模塊是運行時加載,ES6 模塊是編譯時輸出接口。
- CommonJS 加載的是一個對象(即module.exports屬性),該對象只有在腳本運行完才會生成。而 ES6 模塊不是對象,它的對外接口只是一種靜態定義,在代碼靜態解析階段就會生成。
-
在 ES6 之前,社區制定了一些模塊加載方案,最主要的有 CommonJS 和 AMD 兩種。前者用於服務器,后者用於瀏覽器。ES6 在語言標准的層面上,實現了模塊功能,而且實現得相當簡單,完全可以取代 CommonJS 和 AMD 規范,成為瀏覽器和服務器通用的模塊解決方案。
ES6 模塊的設計思想,是盡量的靜態化,使得編譯時就能確定模塊的依賴關系,以及輸入和輸出的變量。CommonJS 和 AMD 模塊,都只能在運行時確定這些東西。比如,CommonJS 模塊就是對象,輸入時必須查找對象屬性。 -
commonJS 和 es6模塊化 區別:
es6 {
export : '可以輸出多個,輸出方式為 {}' ,
export default : ' 只能輸出一個 ,可以與export 同時輸出,但是不建議這么做',
解析階段確定對外輸出的接口,解析階段生成接口,
模塊不是對象,加載的不是對象,
可以單獨加載其中的某個接口(方法),
靜態分析,動態引用,輸出的是值的引用,值改變,引用也改變,即原來模塊中的值改變則該加載的值也改變,
this 指向undefined
}
commonJS {
module.exports = ... : '只能輸出一個,且后面的會覆蓋上面的' ,
exports. ... : ' 可以輸出多個',
運行階段確定接口,運行時才會加載模塊,
模塊就是對象,加載的是該對象,
加載的是整個模塊,即將所有的接口全部加載進來,
輸出的是值的拷貝,即原來模塊中的值改變不會影響已經加載的該值,
this 指向當前模塊
}