CommonJS模块规范和ES6模块规范完全是两种不同的概念。
CommonJS模块规范:
根据这个规范,每个文件就是一个模块,有自己的作用域。在一个文件里面定义的变量、函数、类,都是私有的,对其他文件不可见。
CommonJS规范规定,每个模块内部,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。这等同在每个模块头部,有一行这样的命令。
优先使用 module.exports
var exports = module.exports;
module.exports / exports
: 只有 node 支持的导出
require
: node 和 es6 都支持的引入--{遵循的是CommonJS
规范}
exports
只辅助module.exports
操作内存中的数据,各种操作数据完,结果到最后真正被require
出去的内容还是module.exports
其实大家用内存块的概念去理解,就会很清楚了。
然后呢,为了避免糊涂,尽量都用 module.exports
导出,然后用require
导入
ES6模块规范
不同于CommonJS,ES6使用 export 和 import 来导出、导入模块。
// profile.js
var firstName = 'Michael';
var lastName = 'Jackson';
var year = 1958;export {firstName, lastName, year};//需要特别注意的是,export命令规定的是对外的接口,必须与模块内部的变量建立一一对应关系。//export default// 使用export default命令,为模块指定默认输出
// export-default.js
export default function () {console.log('foo');
}
export 和 export default区别:
- export与export default均可用于导出常量、函数、文件、模块等
- 在一个文件或模块中,export、import可以有多个,export default仅有一个
- 通过export方式导出,在导入时要加{ },export default则不需要
- export能直接导出变量表达式,export default不行。
export / import
: 只有es6 支持的导出引入
testEs6Export.js
'use strict'
//导出变量
export const a = '100'; //导出方法
export const dogSay = function(){ console.log('wang wang');
}//导出方法第二种
function catSay(){console.log('miao miao');
}
export { catSay };//export default导出
const m = 100;
export default m;
//export defult const m = 100;// 这里不能写这种格式。//index.js
'use strict'
var express = require('express');
var router = express.Router();import { dogSay, catSay } from './testEs6Export'; //导出了 export 方法
import m from './testEs6Export'; //导出了 export default import * as testModule from './testEs6Export'; //as 集合成对象导出/* GET home page. */
router.get('/', function(req, res, next) {dogSay();catSay();console.log(m);testModule.dogSay();console.log(testModule.m); // undefined , 因为 as 导出是 把 零散的 export 聚集在一起作为一个对象,而export default 是导出为 default属性。console.log(testModule.default); // 100res.send('恭喜你,成功验证');
});module.exports = router;
ES6
的模块系统非常灵活。