Fork me on Gitee

ES6中export、export default、exports、module.exports的区别和用法

ES6中export、export default、exports、module.exports的区别和用法

在ES6和Nodejs中,一个js文件就是一个模块,模块里面定义的所有变量都是私有的,外部无法直接获取;但是ES6和Nodejs都有相关的语法规范,可以实现模块之间变量的读取。

首先得清楚exportexport defaultES6中导出模块中变量的语法,exportsmodule.exportsNodejs中导出模块中变量的语法(基于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中exportsmodule.exports的用法

Nodejs的模块机制是基于CommonJs语法规范的。CommonJS规范规定,每个模块内部,module变量代表当前模块。这个变量是一个对象,它的exports属性(即module.exports)是对外的接口。加载某个模块,其实是加载该模块的module.exports属性。

1、module.exports的用法

image-20221020113204514

可以看到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

image-20221020113909178

总结: 在对外输出模块接口时,也可以向exports对象添加变量和方法。
// utils.js

let name = 'zhangsan'
let age = 18
module.exports = {
  name,
  age
}

exports.sex = '男'
exports.behavior = function() {
  console.log('I like girl')
}
注意:不能直接将exports变量指向一个值,因为这样等于切断了exportsmodule.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的,真是好苦逼啊。

posted @ 2022-10-20 13:59  等风的羽毛  阅读(440)  评论(0编辑  收藏  举报
1