一、使用范围
require : node支持引入
export/import : 只有es6支持的导出/引入
module.export / exports : 只有node支持的导出
二、node模块
Node 里面的模块系统遵循的是CommonJs规范,commonJs定义的模块分为:模块标识(module)、模块定义(exports)、模块引用(require)
exports和module.exports在一个node执行一个文件时,会给这个文件生成一个exports和module对象,而module又有一个exports属性。他们之间的关系如下图,都指向一个块{}内存区域。
exports = module.exports = {};
//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}
从上面可以看出,其实
require
导出的内容是module.exports
的指向的内存块内容,并不是exports
的。 简而言之,区分他们之间的区别就是exports
只是module.exports
的引用,辅助后者添加内容用的。
三、es6 export和export default的区别
1.export和export default 都可以导出 常量、函数、模块、文件。
2.export default在一个模块中只能有一个,export可以有多个
3.export 导出的内容需要包再{}中接收,export default则不需要
4.模块中通过export 导出的(属性或者方法)可以修改,但是通过export default导出的不可以修改。
//model.js
let e1='export 1';
let e2='export 2';
export {e2};
export default e1;
e1='export 1 modified';
e2='export 2 modified';
//index.js
import e1, {e2}from "./model";
console.log(e1);
console.log(e2);
#index.js执行结果
export 1
export 2 modified
tips:
a.es6中模块通过export 和 export default 暴露出来的属性或者方式并不是普通的赋值或者引用,他们是对模块内部定义的标识符类似指针的绑定。
b.对于一个导出的属性或者方法,在什么地方导出不重要,在什么时候导入也不重要,重要的是:访问这个绑定的时候的当前值。