module.exports和exports和export和export default的区别

82 阅读2分钟

前言 在开发过程中,我们经常会写一些模块化的东西,提到模块化,那就一定会用到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'},引用对象改变,两者又是同时指向一个对象,所以都改变了。 可以总结为以下三点:

  1. exports对象是module对象的一个属性,在初始时exports和module.exports是指向同一块内存区域的;

  2. 不改变exports内存指向的情况下,修改exports的值可以改变module.exports的值;

  3. 尽量使用module.exports以避免混淆。

export和export default

export和export default是es6中的模块导出方式,属于ES6模块规范

区别

  1. export default在一个模块里只能有一个,但是export可以有多个
  2. 通过export方式导出,在导入时要加上{},export default则不需要
  3. export default命令的本质是将后面的值赋给default变量,所以可以直接将一个值写在export default之后。export var e1 = '...'是合法语句,但是export default var e2 = '...'是不合法的。