做项目的时候遇到exports、require、module.exports还有export、export default、import这几个关键词,用着用着越来越混,今天特意看了菜鸟教程还有各种博客文章,终于总结出这几者的区别。
@TOC
使用范围区别
首先我们需要知道它们各自来自哪里:
- module.exports / exports: 是node支持的导出
- require: 是node支持的引入
- export / import : 分别是es6 支持的导出和引入
Node里面的module.exports / exports和require遵循的是CommonJS规范,即模块标识(module)、模块定义(exports) 、模块引用(require)。
一、module.exports、exports、require
每一个文件可以看成是一个单独的模块,是私密的,外部文件都无法访问。外部文件要访问需要用module.exports或exports导出。在module.exports中,module是当前模块,exports是对外接口,是module的一个属性。而export可以看成是对module.exports的引用或者副本,可以用它来方便操作module.exports内的内容。
每当运行命令node app.js的时候,node会在这个js文件内自动生成一个module.exports和exports对象,且两者指向同一个内存空间。即
module.exports=exports={}
//两者都指向同一个内存空间
当用export来导出一个变量时,实际上是为module.export添加了该变量并导出了该变量,导出的实际上是module.export。
//a.js
let a = 100;
console.log(module.exports); //结果为:{}
console.log(exports); //结果为:{}
exports.a = 200; //实际是 module.exports 的内容给改成 {a : 200},导出的实际上是module.exports指向的内容
//app.js
var a = require('/a');//用require来导入使用
console.log(a) // 打印为 {a : 200}
以上便是用内存块的概念来理解module.exports和exports。
二、export、export default、import
export/export default、import是es6新增的模块。同样用于导出和导入。根据菜鸟教程总结出的几个区别:
- export与export default均可用于导出常量、函数、文件、模块等
- 在一个文件或模块中,export、import可以有多个,export default仅有一个
- 通过export方式导出,在导入时要加{ },export default则不需要
- export能直接导出变量表达式,export default不行。
详细代码请看菜鸟教程。