ES6中export、export default、exports、module.exports的区别和用法
ES6中export、export default、exports、module.exports的区别和用法
在ES6和Nodejs中,一个js文件就是一个模块,模块里面定义的所有变量都是私有的,外部无法直接获取;但是ES6和Nodejs都有相关的语法规范,可以实现模块之间变量的读取。
首先得清楚export和export default 是ES6中导出模块中变量的语法,exports和module.exports是Nodejs中导出模块中变量的语法(基于CommonJs语法规范)
一、ES6中export和export default的用法
1、export 的用法
// xxx.js
export let n = 1
// yyy.js中引入
import n from 'xxx.js'
let n = 1; export { n } // 等同于上面的写法
// yyy.js中引入
import {n} from 'xxx.js'
// 同时导出多个变量
export let m = 2
export function aaa() {}
// 推荐写法
let m = 2
function aaa() {}
export {
m,
aaa
}
// yyy.js中引入
import { m, aaa } from 'xxx.js'
2、export default的用法
export default指定模块的默认导出,即外部模块无需知道导出的变量名,也可以导入该变量
// xxx.js
// 默认导出一个变量名为aaa的函数
export default function aaa() {
console.log('aaa')
}
// 外部模块在导入时,可以为该函数指定任意合法变量名;
// yyy.js中
import myFun from 'xxx.js'
export default的本质是导出一个名为default的变量,比如上述例子中,实质上是将名为aaa的函数,命名为default进行导出
注意:一个模块中只能有一个默认导出,所以使用import导入时,后面无需加
更多详细用法请移步:https://es6.ruanyifeng.com/#docs/module
二、Nodejs中exports和module.exports的用法
Nodejs的模块机制是基于CommonJs语法规范的。CommonJS规范规定,每个模块内部,module
变量代表当前模块。这个变量是一个对象,它的exports
属性(即module.exports
)是对外的接口。加载某个模块,其实是加载该模块的module.exports
属性。
1、module.exports的用法
可以看到module.exports默认是一个空对象,因为该模块尚未导出任何变量。由于module对象的exports属性是该模块的对外接口,因此要想导出相关变量时,只需对module.exports进行赋值即可。
// utils.js
let name = 'zhangsan'
let age = 18
module.exports = {
name,
age
}
console.log(module.exports) // { name: 'zhangsan', age: 18 }
2、exports的用法
为了方便,Node还为每个模块提供一个exports变量,指向module.exports。这等同在每个模块头部,有一行这样的命令。let exports = module.exports
总结: 在对外输出模块接口时,也可以向exports对象添加变量和方法。
// utils.js
let name = 'zhangsan'
let age = 18
module.exports = {
name,
age
}
exports.sex = '男'
exports.behavior = function() {
console.log('I like girl')
}
注意:不能直接将exports变量指向一个值,因为这样等于切断了exports
与module.exports
的联系。
使用CommonJs的require命令,在其它模块中导入utils.js,require的本质是引入module.exports的值。
// yyy.js
const util = require('./utils.js')
console.log(util) // { name: 'zhangsan', age: 18 }
最后输出的结果只有name和age两个属性,是因为,加载某个模块,其实是加载该模块的module.exports
属性,
用白话讲就是,exports只辅助module.exports操作内存中的数据,辛辛苦苦各种操作数据完,累得要死,结果到最后真正被require出去的内容还是module.exports的,真是好苦逼啊。