谈谈module.exports和exports

module.exports 对象是由模块系统创建的。在我们自己写模块的时候,需要在模块最后写好模块接口,声明这个模块对外暴露什么内容,module.exports 提供了暴露接口的方法。

先用module.exports导出几个变量

//module.js
module.exports.name = "孙悟空";
module.exports.age = 1;
module.exports.sayname=function(){console.log("我一天不敲代码我就难受!");
}
//B.js
var moduleB=require('./module');
console.log(moduleB.name);//孙悟空
moduleB.sayname()//我一天不敲代码我就难受!

上面代码module.js导出了变量name和age、函数sayname,在B.js文件中得出输出

module.exports导函数

//B.js
var moduleB=require('./module');
var c=new moduleB(1,2)
console.log(c);//结果是
//3
//add {}
//module.js
var add=function(a,b){console.log(a+b);
}
module.exports=add

可见可以通过new来创建对象等到里的结果

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

//module.js
var x=5;
var add=function(a,b){// console.log(a+b);return a+b;}
module.exports.x=x
module.exports.add=add
//B.js
var moduleB=require('./module');
console.log(moduleB.x);//5
console.log(moduleB.add(1,2));//3

前面讲解了module.exports基本导入变量和函数,那如果函数和变量过多怎么办可以使用一下方法进行简化

//module.js
var x=5;
var add=function(a,b){// console.log(a+b);return a+b;}
var diverse=function(a,b){return a/b;
}
module.exports={x,add,diverse}
//B.js
var moduleB=require('./module');
console.log(moduleB.x);
console.log(moduleB.add(1,2));
console.log(moduleB.diverse(4,2));
//5
//3
//2

或则

var {x,add,diverse}=require('./module');
console.log(x,add(1,2),diverse(4,2));
//5
//3
//2

下面介绍exports与module.exports

exports 与 module.exports

优先使用 module.exports

为了方便,Node为每个模块提供一个exports变量,指向module.exports。这等同在每个模块头部,有一行这样的命令

var exports = module.exports;

​ 您可以在模块中使用的魔法变量 - exportsrequiremodule__filename__dirname不是魔法,它们只是加载模块时调用的函数的参数。

最初,exportsmodule.exports指向同一个*空*对象

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FZE8HNjP-1633934898237)(C:\Users\赤子\AppData\Roaming\Typora\typora-user-images\image-20211011140034406.png)]

您可以使用module.exportsexports因为它们都指向同一个对象,所以您可以向该对象添加属性,所以您使用哪个并不重要

如果添加exports.foo = "bar"module.exports.baz = "boz"那么你的模块的输出对象将是这样的:

{foo: "bar", baz: "boz"}

**exports **返回的是模块函数

**module.exports 返回的是模块对象本身,返回的是一个类
** 使用上的区别是:

  1. exports的方法可以直接调用
  2. module.exports需要new对象之后才可以调用
  3. 当一个模块需要导出单个成员的时候,这个时候必须使用:module.exports = xxx 的方 式,不要使用 exports = xxx 不管用

二话不说,撸代码!

//A.js
var test=require('./exports_module')
console.log(test.add(1,2));//3
//expoets_module.js
var add=function(a,b){return a+b;
}
exports.add=add;

我们再看看用module.exports

//B.js
var test=require('./module');
console.log(test.add(1,2));//3
var add=function(a,b){return a+b;
}
exports.add=add;

发现此时exports和module.exports输出的都是一样的

为什么module.exports也有exports方法了,简单点理解就是

**exports是module.exports的一个引用,exports指向的是module.exports**

我们用代码判断一下

console.log(exports === module.exports)//true

说明exports和module.exports是同一个对象

只不过是一开始exports和module.exports指向的都是同一个空对象

随着对象的改变而改变

exports、module.exports 和 export、export default 到底是咋回事

require: node 和 es6 都支持的引入 export / import : 只有es6 支持的导出引入 module.exports / exports: 只有 node 支持的导出
Node里面的模块系统遵循的是CommonJS规范。那问题又来了,什么是CommonJS规范呢?
由于js以前比较混乱,各写各的代码,没有一个模块的概念,而这个规范出来其实就是对模块的一个定义。
CommonJS定义的模块分为: 模块标识(module)、模块定义(exports) 模块引用(require)

先解释 exports 和 module.exports
在一个node执行一个文件时,会给这个文件内生成一个 exports和module对象,
而module又有一个exports属性。他们之间的关系如下图,都指向一块{}内存区域。

exports = module.exports = {};复制代码

exports 只是 module.exports的引用,辅助后者添加内容用的。

ES中的模块导出导入

说实话,在es中的模块,就非常清晰了。不过也有一些细节的东西需要搞清楚。比如 export 和 export default,还有 导入的时候,import a from …,import {a} from …,总之也有点乱,那么下面我们就开始把它们捋清楚吧。

export 和 export default

首先我们讲这两个导出,下面我们讲讲它们的区别

  1. export与export default均可用于导出常量、函数、文件、模块等
  2. 在一个文件或模块中,export、import可以有多个,export default仅有一个
  3. 通过export方式导出,在导入时要加{ },export default则不需要
  4. export能直接导出变量表达式,export default不行。
'use strict'
//导出变量
export const a = '100';  //导出方法
export const dogSay = function(){ console.log('wang wang');
}//导出方法第二种
function catSay(){console.log('miao miao');
}
export { catSay };//export default导出
const m = 100;
export default m;
//export defult const m = 100;// 这里不能写这种格式。复制代码
//index.js
'use strict'
var express = require('express');
var router = express.Router();import { dogSay, catSay } from './testEs6Export'; //导出了 export 方法
import m from './testEs6Export';  //导出了 export default import * as testModule from './testEs6Export';//as 集合成对象导出/* GET home page. */
router.get('/', function(req, res, next) {dogSay();catSay();console.log(m);testModule.dogSay();console.log(testModule.m); // undefined , 因为  as 导出是 把 零散的 export 聚集在一起作为一个对象,而export default 是导出为 default属性。console.log(testModule.default); // 100res.send('恭喜你,成功验证');
});module.exports = router;

谈谈module.exports和exports相关推荐

  1. 谈谈module.exports对象和exports对象

    一.模块作用域 1.我们先来创建一个js文件模块 //我们先来声明一个常量和函数const username = 'tom'function sayHi(){console.log('hi 你好~') ...

  2. 浅析Node模块中module.exports与exports的关系

    Node.js遵循CommonJS规范的模块机制,一个JS文件即被视为一个独立的模块.在模块内部可以通过2种方式导出模块: module.exports exports module.exports是 ...

  3. module是什么类型_nodejs中module.exports和exports的区别

    本文同步发表在我的个人博客中: 沧沧凉凉​www.cclliang.com 最近在学习nodejs,这篇文章就权当是一篇笔记,如果有什么地方有误,望指出. 先说说它们之间的区别: exports只能使 ...

  4. 一句话说清楚NodeJS中module.exports和exports的区别

    关于这个问题NodeJS的官方文档中有一句很精辟的解释: What's the difference between module.exports and exports? The first exp ...

  5. module.exports与exports,export与export default之间的关系和区别

    CommonJS模块规范和ES6模块规范完全是两种不同的概念. CommonJS模块规范: 根据这个规范,每个文件就是一个模块,有自己的作用域.在一个文件里面定义的变量.函数.类,都是私有的,对其他文 ...

  6. module.exports和exports得区别

    对module.exports和exports的一些理解 可能是有史以来最简单通俗易懂的有关Module.exports和exports区别的文章了. exports = module.exports ...

  7. nodejs里的module.exports和exports

    引 在node.js中我们可以使用module.exports和exports导出模块,设置导出函数.数组.变量等等 为什么可以用这两个模块? 或者直接问,node.js的模块功能是怎么实现的. 这样 ...

  8. (node中)module.exports 和exports的区别

    (node中使用)module.exports 和exports的区别是什么? 用一句话来说明就是,require只会去引用module.exports这个对象的导出,不会引用exports对象的,而 ...

  9. 关于module.exports和exports

    关于module.exports和export 总结:直接使用module.exports.属性名=属性值 的方式,根据后面的会覆盖前面的原则. 使用module.exports={ 属性名:属性值} ...

最新文章

  1. matlab中patch命令_matlab 放大平移图形是超出边界问题的处理
  2. java主类与源代码名称_Java高级编程基础:类文件结构解析,看穿Class代码背后的秘密...
  3. 1489 蜥蜴和地下室
  4. 无法删除DLL文件解决方法(转)
  5. h5 时间控件问题,怎么设置type =datetime-local 的值
  6. 大数据分析平台具备什么功能特点
  7. AllenNLP 用法总结
  8. 微软开源网络攻防模拟工具CyberBattleSim介绍及源码分析
  9. Compiz Fusion 安装后的设置
  10. opencv形态学-开操作和闭操作
  11. 应用不能远程访问RabbitMQ的5672端口
  12. 人工智能——机器学习与深度学习思维导图
  13. 听歌的时候再也不用各个音乐播放软件来回切换啦!
  14. 20单元——学习正解表达式及学习实践 Shell script
  15. iphone微信长按二维码识别不了
  16. 最新好玩的神乐七奈桌面宠物+附带BGM音效
  17. 网新恒天2013年校园招聘笔试
  18. c++运行时报错terminate called after throwing an instance of ‘std::bad_alloc‘
  19. 基于AI的智能急性颅内出血类型检测-2019
  20. 数值分析线性方程组迭代法之SOR迭代法详解及其C语言算法实现

热门文章

  1. linux 复制 软链接文件,cp复制软链接失效的原因
  2. java面试题(java中高级面试题及答案)
  3. 学校教学计算机报损程序,信息学院计算机应用实验教学中心低值品、易耗品及材料管理办法...
  4. 经典K线形态组合普及大全!(好文珍藏)
  5. 计算机网络 | HTTPS | 参考各家资料 | 无知的我学习日记(图文排版无水印)
  6. 记录从U盘安装Ubuntu20.04系统到旧电脑
  7. Python自制随机食物生成器(食物可自拟)
  8. 18、消防责任事故罪
  9. 自己动手做QQ-特洛伊
  10. OpenCV学习笔记(14):形态学滤波对图像进行边缘及角点检测