require : node支持引入
export/import : 只有es6支持的导出/引入
module.export / exports : 只有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的引用,辅助后者添加内容用的。
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 modifiedtips:
a.es6中模块通过export 和 export default 暴露出来的属性或者方式并不是普通的赋值或者引用,他们是对模块内部定义的标识符类似指针的绑定。
b.对于一个导出的属性或者方法,在什么地方导出不重要,在什么时候导入也不重要,重要的是:访问这个绑定的时候的当前值。