前言 在开发过程中,我们经常会写一些模块化的东西,提到模块化,那就一定会用到module.exports或者export。对于这两类导出,在实际使用的过程中很容易混淆。我们这篇文章就是主要介绍module.exports和exports和export和export default的区别。
module.exports和exports
module.exports和exports是nodeJS中的模块导出方式,属于commonJS规范
exports属于module.exports, 相当于在js文件头部,有一个module对象,module.exports = exports;
exports是一个对象,所以可以exports多个值
// export.js
exports.f1;
exports.f2;
exports.f3;
// import.js
let fs = require('export.js');
fs.f1();
// 相当于
exports = {f1, f2, f3};
// 相当于
modules.exports = {f1, f2, f3};
主要用法有以下两类。
1. 对于要导出的属性,可以简单挂在exports对象上
exports.name = function() {
console.log('my name is lucy');
}
2. 对于类,为了直接使导出的内容作为类的构造器可以让调用者使用new操作符创建实例对象,应该把构造函数挂到module.exports对象上,不要和导出属性值混在一起。
// export.js
module.exports = function (name, age) {
this.name = name;
this.age = age;
this.about = function() {
console.log(this.name + 'is' + this.age + 'years old');
}
};
// import.js
let A = require('export.js');
let a = new A('zhangsan', 28);
小结
module.exports初始值为一个空对象{},exports是指向的module.exports的引用,require()返回的是module.exports而不是exports。也就是:exports = module.exports = {},exports和module.exports都指向一个引用地址{},如果exports.name = 'xxx',那module.exports = {name:'xxx'},引用对象改变,两者又是同时指向一个对象,所以都改变了。 可以总结为以下三点:
-
exports对象是module对象的一个属性,在初始时exports和module.exports是指向同一块内存区域的;
-
不改变exports内存指向的情况下,修改exports的值可以改变module.exports的值;
-
尽量使用module.exports以避免混淆。
export和export default
export和export default是es6中的模块导出方式,属于ES6模块规范
区别
- export default在一个模块里只能有一个,但是export可以有多个
- 通过export方式导出,在导入时要加上{},export default则不需要
- export default命令的本质是将后面的值赋给default变量,所以可以直接将一个值写在export default之后。export var e1 = '...'是合法语句,但是export default var e2 = '...'是不合法的。