exports、module.exports、export、export default有什么区别

使用范围

操作 ES6 CommonJS
导出 export default,export module.exports = {},exports
导入 import … form … require()

CommonJS又是啥呢?

历史上,JavaScript 一直没有模块(module)体系。在 ES6 之前,社区制定了一些模块加载方案,最主要的有 CommonJS 和 AMD 两种。前者用于服务器,后者用于浏览器。Node里面的模块系统遵循的就是是CommonJS规范。

后来ES6提出了自己的模块加载方案,在语言标准的层面上,实现了模块功能,而且实现得相当简单,完全可以取代 CommonJS 和 AMD 规范,成为浏览器和服务器通用的模块解决方案。所以现在一般都是使用ES6的模块导入导出规则,不过node一直还是使用的CommonJS规范,也就是require,想使用import的话需要使用插件。但是在node12中import export已作为实验特性支持了。

module.exports和exports区别

系统会自动给nodejs 文件增加2个变量 exports 和 module, module 又有一个属性 exports, 这个exports 属性指向一个空对象 {}; 同时 exports这个变量也指向了这个空对象{};
于是就有了 exports => {} <=module.exports。
而在导入时,require导入的内容是module.exports的指向的内存块内容。exports 只是 module.exports的引用,辅助后者添加内容用的。
这两个exports其实是没有直接关系的,唯一的关系是: 他们初始都指向同一个空对象{};
如果其中一个不指向做个空对象了, 那么他们的关系就没有了.
为了避免出现麻烦,尽量都用 module.exports 导出,然后用require导入。

//utils.js
let a = 100;

console.log(module.exports); //能打印出结果为:{}
console.log(exports); //能打印出结果为:{}

exports.a = 200; //这里辛苦劳作帮 module.exports 的内容给改成 {a : 200}

exports = '指向其他内存区'; //这里把exports的指向指走

//test.js

var a = require('/utils');
console.log(a) // 打印为 {a : 200} 

export和export default

  • 在一个文件或模块中,export、import可以有多个,export default仅有一个
  • 通过export方式导出,在导入时要加{ },export default则不需要
  • export能直接导出变量表达式,export default不行
  • 两个不能同时使用
1.export
//a.js
export const str = "blablabla~";
export function foo(sth) { 
  return sth;
}
对应的导入方式:

//b.js
import { str, foo} from 'a'; //导入的时候带花括号,也可以分开写两次

2.export default
//a.js
const str = "blablabla~";
export default str;
其实此处相当于为str变量值"blablabla"起了一个系统默认的变量名default,自然default只能有一个值,所以一个文件内不能有多个export default。
对应的导入方式: 
//b.js 
import str from 'a'; //导入的时候没有花括号
本质上,a.js文件的export default输出一个叫做default的变量,然后系统允许你为它取任意名字。所以可以为import的模块起任何变量名,且不需要用大括号包含
posted @ 2019-11-25 15:12  威斯布鲁童  阅读(397)  评论(0)    收藏  举报