首先
module.exports/exports是Node才支持的导出方式
export/import是ES6才制止的导入导出方式
require是Node和ES6都支持的导入方式
Node里面的模块系统遵循的是CommonJS规范。
CommonJS定义的模块分为: 模块标识(module)、模块定义(exports) 、模块引用(require)
当Node执行一个文件时,会给该文件生成module对象和exports对象。其中module对象又有一个exports对象属性。
初始情况下,module.exports和exports指向同一块内存。也就是说你是用module.exports导出还是用exports导出,用require接收的结果是一样的。但给二者赋不同的值时:
//1.js
module.exports={name:'aa'}
exports={name:'bb'}
//2.js
var a=require('./1.js')
console.log(a)//{name:'aa'}
//3.js
exports={name:'cc'}
console.log(module.exports)//{name:'cc'}
//4.js
var a=require('3.js)
console.log(a)//{name:'cc'}
require接收的是module.exports导出的。
export可以有多个,export default只能有一个。
// 1.
// 引入模块的某些变量(方法、类),配合4、5使用
import {xxx, xxxx} from 'xxx'
// 2.
// 引入模块的默认变量(方法、类),配合6使用
import xxx from 'xxx'
// 3.
// 实现动态加载,适用于按需加载等
import('../xxx')
// 4.
// 输出模块的变量(方法、类),对应引入方法为1
let xxx = 'x'; export {xxx}
// 5.
// 输出模块的变量(方法、类),对应引入方法为1
export class xxx {}
// 6.
// 输出模块默认的变量(方法、类),对应引入方法为2
export default {}
// 7.
// 待更新
exports.post()
// 8.
module.exports.init = init;