module.exports、exports、export 三者的區別是什麼?html
想要了解三者的區別,須要瞭解下他們產生的背景。前端
之前JS自己沒有模塊化的概念和相關API,開發者通常都是在html
中引入多個script
標籤,業務邏輯複雜時,就會帶來不少問題,好比:node
script
的書寫順序進行加載2009年 Node.js
出現,node
裏面的模塊系統遵循的是CommonJS
規範面試
CommonJS定義的模塊分爲: 模塊標識(
module
)、模塊定義(exports
) 、模塊引用(require
)後端
CommonJS是主要爲了JS在後端的表現制定的,是不適合前端的 ,因此出現了AMD、CMD、UMD等等一系列能夠在瀏覽器等終端實現的異步加載的模塊化方案,咱們最熟悉的require.js
就是AMD的產物,seajs
是CMD的產物。瀏覽器
exports
和module.exports
exports
和module
兩個對象,module
對象內部會建立一個exports屬性。exports = module.exports = {};
一個node模塊,咱們能夠認爲首行定義了exports
和module.exports
兩個對象:bash
// module1.js
let a = 2;
let add = function () {
a++;
}
console.log(module.exports); //能打印出結果爲:{}
console.log(exports); //能打印出結果爲:{}
// module1.js 可改寫爲以下代碼
var exports = module.exports = {};
let a = 2;
let add = function () {
a++;
}
console.log(module.exports); //能打印出結果爲:{}
console.log(exports); //能打印出結果爲:{}
複製代碼
既然exports
和module.exports
兩個對象指向同一個對象,require
導入的是誰呢?一塊兒看下下面代碼app
// test.js
module.exports = {
a: 100
}
exports = {
a: 200
}
// app.js
let test = require('./test');
console.log(test); // 打印爲 {a : 100}
複製代碼
從上面可知,require
導出的內容是module.exports
的指向的內存塊內容,並非exports
的。異步
export
是ES6中的導出,與它對應的導入是 import
,常見的還有一個export default
下面咱們講講兩者的區別模塊化
綜上可知:
export / import
: 是ES6中的導入導出。module.exports / exports
: 只有 node 支持的導出,兩者指向同一個對象。與他們對應的導入是require
,模塊最終導入的是module.exports
對象。目前的瀏覽器幾乎都不支持 ES6 的模塊機制,因此咱們要用 Babel 把 ES6 的模塊機制轉換成 CommonJS 的形式,而後使用 Browserify 或者 Webpack 這樣的打包工具把他們打包起來。達到模塊化加載效果相似於
seajs
代碼
掃一掃 關注個人公衆號【前端名獅】,更多精彩內容陪伴你!