module.exports與exports,export與export default之間的關(guān)系和區(qū)別
首先我們要明白一個(gè)前提,CommonJS模塊規(guī)范和ES6模塊規(guī)范完全是兩種不同的概念。
CommonJS模塊規(guī)范
Node應(yīng)用由模塊組成,采用CommonJS模塊規(guī)范。
根據(jù)這個(gè)規(guī)范,每個(gè)文件就是一個(gè)模塊,有自己的作用域。在一個(gè)文件里面定義的變量、函數(shù)、類,都是私有的,對(duì)其他文件不可見(jiàn)。
CommonJS規(guī)范規(guī)定,每個(gè)模塊內(nèi)部,module變量代表當(dāng)前模塊。這個(gè)變量是一個(gè)對(duì)象,它的exports屬性(即module.exports)是對(duì)外的接口。加載某個(gè)模塊,其實(shí)是加載該模塊的module.exports屬性。
var x = 5;
var addX = function (value) {
return value + x;
};
module.exports.x = x;
module.exports.addX = addX;
上面代碼通過(guò)module.exports輸出變量x和函數(shù)addX。
require方法用于加載模塊。
var example = require('./example.js');
console.log(example.x); // 5
console.log(example.addX(1)); // 6
exports 與 module.exports
為了方便,Node為每個(gè)模塊提供一個(gè)exports變量,指向module.exports。這等同在每個(gè)模塊頭部,有一行這樣的命令。
var exports = module.exports;
于是我們可以直接在 exports 對(duì)象上添加方法,表示對(duì)外輸出的接口,如同在module.exports上添加一樣。注意,不能直接將exports變量指向一個(gè)值,因?yàn)檫@樣等于切斷了exports與module.exports的聯(lián)系。
ES6模塊規(guī)范
不同于CommonJS,ES6使用 export 和 import 來(lái)導(dǎo)出、導(dǎo)入模塊。
// profile.js
var firstName = 'Michael';
var lastName = 'Jackson';
var year = 1958;
export {firstName, lastName, year};
需要特別注意的是,export命令規(guī)定的是對(duì)外的接口,必須與模塊內(nèi)部的變量建立一一對(duì)應(yīng)關(guān)系。
// 寫(xiě)法一
export var m = 1;
// 寫(xiě)法二
var m = 1;
export {m};
// 寫(xiě)法三
var n = 1;
export {n as m};
export default 命令
使用export default命令,為模塊指定默認(rèn)輸出。
// export-default.js
export default function () {
console.log('foo');
}
轉(zhuǎn)載于 https://www.cnblogs.com/fayin/p/6831071.html