北鸟南游的博客 北鸟南游的博客
首页
  • 前端文章

    • JavaScript
    • Nextjs
  • 界面

    • html
    • css
  • 计算机基础
  • 后端语言
  • linux
  • mysql
  • 工具类
  • 面试相关
  • 图形学入门
  • 入门算法
  • 极客专栏
  • 慕课专栏
  • 电影资源
  • 儿童动漫
  • 英文
关于我
归档
GitHub (opens new window)
首页
  • 前端文章

    • JavaScript
    • Nextjs
  • 界面

    • html
    • css
  • 计算机基础
  • 后端语言
  • linux
  • mysql
  • 工具类
  • 面试相关
  • 图形学入门
  • 入门算法
  • 极客专栏
  • 慕课专栏
  • 电影资源
  • 儿童动漫
  • 英文
关于我
归档
GitHub (opens new window)
  • JavaScript

    • 原生js
      • 33个非常实用的JavaScript一行代码
      • Es6新增属性Promise对象
      • Es6新增属性generator对象
      • JavaScript数组遍历的方法
      • JavaScript防抖和节流
      • ajax的跨域和jsonp的使用
      • exports和module.exports以及export的区别
        • CommonJS(exports和module.exports)模块规范
        • Es6(export)模块规范
          • export default
      • js正则表达式深度解析
      • js运行过程分析
      • vite开发原生js插件
      • 你不知道的JavaScript(上)
    • vue
    • react
    • node
    • nextjs
    • 其它框架
  • 界面

  • front
  • javascript
  • js
北鸟南游
2018-01-21
目录

exports和module.exports以及export的区别

exports和module.exports属于CommonJs规范,export属于Es6定义

# CommonJS(exports和module.exports)模块规范

NodeJs使用的是CommonJs规范,根据这个规范每个js文件就是一个模块,有自己的作用域。 在一个文件内部定义的变量,函数,类都是私有的,其他文件看不到。

exports对象是module.exports的引用。 关于引用可以使用下面的例子来解释清楚: ECMAScript的变量值类型共有两种; 基本类型(primitive values):包括undefined,null,boolean,number,string五种基本类型。 引用类型(reference values):保存在内存中的对象,不能直接操作,只能通过保存在变量的地址引用对其进行操作。 exports和module.exports属于object类型,属于引用类型。

var module = {
	exports:{
		name:"I am module exports"
	}
};
var exports = module.exports;// exports是对module.exports的引用,就是说exports指向的内存地址和module.exports指向的内存地址一样。
console.log(module.exports); //{name:'I am module exports'}
console.log(exports); //{name:'I am module exports'}

exports.name = "change name";
console.log(module.exports); //{name:'change name'}
console.log(exports); //{name:'change name'}
**由此可见,exports和module.exports是引用的同一块内存地址**
//如果重新定义一个对象,将exports的引用指向重新定义的对象
var newObj = {
	name:"this is new Object",
	func:function(x){
		return x*x;
	}
};
exports = newObj;//这时newObj这个Object在内存中指向了新的地址,所以exports也指向了这个新地址,和原来的module.exports对象内存地址没有任何关系。
console.log(module.exports);//{name:'change name'}
console.log(exports);//{name:'this is new Object',function:[Function]}
``

回到nodeJs中,module.exports初始的时候置为{},exports也指向这个空对象。
下面的写法,作用是一样的
``` js
exports.name = function(x){
	console.log(x)
};
module.exports.name = function(x){
	console.log(x)
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34

但是如果按照下面的写法,效果就不同

exports = function(x){
	console.log(x)
};
//上面的function是一块新的内存地址,导致了exports和module.exports不存在任何关系,而require下看到的只有module.exports这个对象,看不到exports对象,所以这样写是有问题是无法导出的。

//下面的这个写法是可以导出,module.exports除了导出对象、函数,还可以导出所有的类型,如字符串,数值,布尔...
module.exports = function(x){
	console.log(x)
}
1
2
3
4
5
6
7
8
9

# Es6(export)模块规范

不同于commonJs,Es6使用export和import来导入导出模块

//info.js
var firstName = "Michael";
var lastName = "jackson";
var year = 1958;
export {firstName, lastName, year};
1
2
3
4
5

需要特别注意的是,export命令规定的是对外的接口,必须与模块内部的变量建立一一对应关系

// 写法一
export var m = 1;

// 写法二
var m = 1;
export {m};

// 写法三
var n = 1;
export {n as m};
1
2
3
4
5
6
7
8
9
10

# export default

使用export default命令,为模块指定默认输出,一个文件只能有一个默认输出

export default function () {
  console.log('foo');
}
1
2
3
编辑 (opens new window)
上次更新: 2025/04/19, 14:22:11
ajax的跨域和jsonp的使用
js正则表达式深度解析

← ajax的跨域和jsonp的使用 js正则表达式深度解析→

最近更新
01
色戒2007
04-19
02
真实real
04-19
03
Home
更多文章>
Theme by Vdoing | Copyright © 2018-2025 北鸟南游
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式