一、基礎(chǔ)概念
module.exports和exports是屬于CommonJS模塊規(guī)范F教簟(commonjs規(guī)范)
export和export default是屬于ES6語(yǔ)法(ES6模塊)浓瞪!
同樣import和require分別屬于ES6和CommonJS访诱!
二筛峭、明確點(diǎn)
module.exports和exports宛徊、export和export default都是導(dǎo)出模塊崔梗;
import和require則是導(dǎo)入模塊夜只;
module.exports導(dǎo)出對(duì)應(yīng)require導(dǎo)入,export導(dǎo)出對(duì)應(yīng)import導(dǎo)入炒俱;
三盐肃、module.exports和exports的區(qū)別與聯(lián)系
Node應(yīng)用由模塊組成,采用CommonJS模塊規(guī)范权悟。
根據(jù)這個(gè)規(guī)范砸王,每個(gè)文件就是一個(gè)模塊,有自己的作用域峦阁。在一個(gè)文件里面定義的變量谦铃、函數(shù)、類榔昔,都是私有的驹闰,對(duì)其他文件不可見。
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;
上面代碼通過module.exports輸出變量x和函數(shù)addX褪秀。
require方法用于加載模塊。
var example = require('./example.js');
console.log(example.x); // 5
console.log(example.addX(1)); // 6
通過上面的例子我們就可以明白以下區(qū)別與聯(lián)系:
exports變量是指向module.exports薛训,加載模塊實(shí)際是加載該模塊的module.exports媒吗。這等同在每個(gè)模塊頭部,有一行這樣的命令乙埃。
var exports = module.exports;
于是我們可以直接在 exports 對(duì)象上添加方法闸英,表示對(duì)外輸出的接口锯岖,如同在module.exports上添加一樣。注意自阱,不能直接將exports變量指向一個(gè)值嚎莉,因?yàn)檫@樣等于切斷了exports與module.exports的聯(lián)系。
四沛豌、export和export default的區(qū)別與聯(lián)系
模塊功能主要由:export和import構(gòu)成趋箩。export導(dǎo)出模塊的對(duì)外接口,import命令導(dǎo)入其他模塊暴露的接口加派。
export其實(shí)和export default就是寫法上面有點(diǎn)差別叫确,一個(gè)是導(dǎo)出一個(gè)個(gè)單獨(dú)接口,一個(gè)是默認(rèn)導(dǎo)出一個(gè)整體接口芍锦。使用import命令的時(shí)候竹勉,用戶需要知道所要加載的變量名或函數(shù)名,否則無(wú)法加載娄琉。這里就有一個(gè)簡(jiǎn)單寫法不用去知道有哪些具體的暴露接口名次乓,就用export default命令,為模塊指定默認(rèn)輸出孽水。
export可以這樣寫
// testA.js
var f = 'Miel';
var name = 'Jack';
var data= 1988;
export {f, name, data};
使用export命令定義了模塊的對(duì)外接口以后票腰,其他 JS 文件就可以通過import命令加載這個(gè)模塊。
// main.js
import {f, name, data} from './testA';
export default可以這樣寫
// export-default.js
export default function () {
console.log('foo');
}
// 或者寫成
function foo() {
console.log('foo');
}
export default foo;
// import-default.js
import customName from './export-default';
customName(); // 'foo'
下面比較一下export default和export 輸出女气。
// 第一組
export default function car() { // 輸出
// ...
}
import car from 'car'; // 輸入
// 第二組
export function car2() { // 輸出
// ...
};
import {car2} from 'car2'; // 輸入
可以看到第一組是使用export default杏慰,import語(yǔ)句不需要使用大括號(hào);第二組使用export炼鞠,對(duì)應(yīng)的import語(yǔ)句需要使用大括號(hào)缘滥,一個(gè)模塊只能有一個(gè)默認(rèn)輸出,所以export default只能使用一次谒主。
五朝扼、import和require的區(qū)別與聯(lián)系
看了上面其實(shí)已經(jīng)清楚了,import和require是分別屬于ES6和CommonJS的兩種導(dǎo)入模塊的語(yǔ)法而已霎肯。