module.exports与exports,export与export default之间的关系和区别


首先我们要明白一个前提,CommonJS模块规范和ES6模块规范完全是两种不同的概念。

CommonJS模块规范

Node应用由模块组成,采用CommonJS模块规范。

根据这个规范,每个文件就是一个模块有自己的作用域。在一个文件里面定义的变量、函数、类,都是私有的,对其他文件不可见。

CommonJS规范规定,每个模块内部,module变量代表当前模块。这个变量是一个对象,它的exports属性(即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

1.exports 与 module.exports

建议优先使用 module.exports

为了方便,Node为每个模块提供一个exports变量,指向module.exports。这等同在每个模块头部,有一行这样的命令。

var exports = module.exports;

其结果是,在对外输出模块接口时,我们可以直接在 exports 对象上添加方法, 如同在module.exports上添加一样。

注意因为 Node 模块是通过 module.exports 导出的,如果直接将exports变量指向一个值,就切断了exportsmodule.exports的联系,导致意外发生。

var exports = module.exports;

//两个是相等的关系,但又不是绝对相当的关系
/*
例如:
1.module.exports可以直接导出一个匿名函数或者一个值
*/
module.exports=function(){
  var a="Hello World"  
  return   a;
}
//但是exports是不可以的,因为这样等于切断了exports与module.exports的联系,exports不再指向module.exports了。

下面的写法也是无效的。

exports.hello = function() {
  return 'hello';
};

module.exports = 'Hello world';

面代码中,hello函数是无法对外输出的,因为module.exports被重新赋值了。

这意味着,如果一个模块的对外接口,就是一个单一的值,不能使用exports输出,只能使用module.exports输出。

module.exports = function (x){ console.log(x);};

如果你觉得,exportsmodule.exports之间的区别很难分清,一个简单的处理方法,就是放弃使用exports,只使用module.exports

参考来源:CommonJS规范

ES6模块规范

不同于CommonJSES6使用 exportimport 来导出、导入模块。 exportES6引出的语法,用于导出模块中的变量、对象、函数、类。对应的导入关键字是import。

// profile.js
var firstName = 'Michael';
var lastName = 'Jackson';
var year = 1958;

export {firstName, lastName, year};

需要特别注意的是,export命令规定的是对外的接口,必须与模块内部的变量建立一一对应关系。

// 写法一
export var m = 1;

// 写法二
var m = 1;
export {m};

// 写法三
var n = 1;
export {n as m};

1.export default 命令

使用export default命令,为模块指定默认输出。

// export-default.js
export default function () {
  console.log('foo');
}

二者的区别有以下几点:

  • export default在一个模块中只能有一个,当然也可以没有。export在一个模块中可以有多个。
  • export default的对象、变量、函数、类,可以没有名字。export的必须有名字。
  • export default对应的importexport有所区别。
//1.export写法
//./aap.js
var name="我是电脑"var say=function(){
 console.log("我可以干很多事")}

export {name,say}//也可以直接一个一个的export但是必须得有名字
export const a=1export function data(){
  return data;
}


//其他页面引入时必须这样
import {name,say} from "./app.js"

//2.export default
//app.js
//可以没有函数名字
export default function(){
  return data;
}
//这里export不能这样导出
export default const a=12//应该这样导出
const a=12export default a



//其他页面引入时必须这样
import data from "./app.js"

相关链接:


文章作者: 弈心
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 弈心 !
评论
  目录