首先我們要明白一個前提,CommonJS模塊規(guī)范和ES6模塊規(guī)范完全是兩種不同的概念跃赚。
CommonJS模塊規(guī)范
Node應用由模塊組成笆搓,采用CommonJS模塊規(guī)范。
根據這個規(guī)范来累,每個文件就是一個模塊砚作,有自己的作用域窘奏。在一個文件里面定義的變量嘹锁、函數、類着裹,都是私有的领猾,對其他文件不可見。
CommonJS規(guī)范規(guī)定,每個模塊內部摔竿,module變量代表當前模塊面粮。這個變量是一個對象,它的exports屬性(即module.exports)是對外的接口继低。加載某個模塊熬苍,其實是加載該模塊的module.exports屬性。
var x = 5;
var addX = function (value) {
return value + x;
};
module.exports.x = x;
module.exports.addX = addX;
上面代碼通過module.exports輸出變量x和函數addX袁翁。
require方法用于加載模塊柴底。
var example = require('./example.js');
console.log(example.x); // 5
console.log(example.addX(1)); // 6
exports 與 module.exports
為了方便,Node為每個模塊提供一個exports變量粱胜,指向module.exports柄驻。這等同在每個模塊頭部,有一行這樣的命令焙压。
var exports = module.exports;
于是我們可以直接在 exports 對象上添加方法鸿脓,表示對外輸出的接口,如同在module.exports上添加一樣涯曲。注意野哭,不能直接將exports變量指向一個值,因為這樣等于切斷了exports與module.exports的聯系幻件。
ES6模塊規(guī)范
不同于CommonJS虐拓,ES6使用 export 和 import 來導出、導入模塊傲武。
// profile.js
var firstName = 'Michael';
var lastName = 'Jackson';
var year = 1958;
export {firstName, lastName, year};
需要特別注意的是蓉驹,export命令規(guī)定的是對外的接口,必須與模塊內部的變量建立一一對應關系揪利。
// 寫法一
export var m = 1;
// 寫法二
var m = 1;
export {m};
// 寫法三
var n = 1;
export {n as m};
export default 命令
使用export default命令态兴,為模塊指定默認輸出。
// export-default.js
export default function () {
console.log('foo');
}
相關鏈接:
CommonJS規(guī)范疟位,http://javascript.ruanyifeng.com/nodejs/module.html
ES6 Module 的語法瞻润,http://es6.ruanyifeng.com/#docs/module