谈谈module.exports和exports
谈谈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;
您可以在模块中使用的魔法变量 - exports
、require
、module
、__filename
和__dirname
不是魔法,它们只是加载模块时调用的函数的参数。
最初,exports
并module.exports
指向同一个*空*对象。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FZE8HNjP-1633934898237)(C:\Users\赤子\AppData\Roaming\Typora\typora-user-images\image-20211011140034406.png)]
您可以使用module.exports
或exports
因为它们都指向同一个对象,所以您可以向该对象添加属性,所以您使用哪个并不重要。
如果添加exports.foo = "bar"
和module.exports.baz = "boz"
那么你的模块的输出对象将是这样的:
{foo: "bar", baz: "boz"}
**exports **返回的是模块函数
**module.exports 返回的是模块对象本身,返回的是一个类
** 使用上的区别是:
- exports的方法可以直接调用
- module.exports需要new对象之后才可以调用
- 当一个模块需要导出单个成员的时候,这个时候必须使用: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
首先我们讲这两个导出,下面我们讲讲它们的区别
- export与export default均可用于导出常量、函数、文件、模块等
- 在一个文件或模块中,export、import可以有多个,export default仅有一个
- 通过export方式导出,在导入时要加{ },export default则不需要
- 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相关推荐
- 谈谈module.exports对象和exports对象
一.模块作用域 1.我们先来创建一个js文件模块 //我们先来声明一个常量和函数const username = 'tom'function sayHi(){console.log('hi 你好~') ...
- 浅析Node模块中module.exports与exports的关系
Node.js遵循CommonJS规范的模块机制,一个JS文件即被视为一个独立的模块.在模块内部可以通过2种方式导出模块: module.exports exports module.exports是 ...
- module是什么类型_nodejs中module.exports和exports的区别
本文同步发表在我的个人博客中: 沧沧凉凉www.cclliang.com 最近在学习nodejs,这篇文章就权当是一篇笔记,如果有什么地方有误,望指出. 先说说它们之间的区别: exports只能使 ...
- 一句话说清楚NodeJS中module.exports和exports的区别
关于这个问题NodeJS的官方文档中有一句很精辟的解释: What's the difference between module.exports and exports? The first exp ...
- module.exports与exports,export与export default之间的关系和区别
CommonJS模块规范和ES6模块规范完全是两种不同的概念. CommonJS模块规范: 根据这个规范,每个文件就是一个模块,有自己的作用域.在一个文件里面定义的变量.函数.类,都是私有的,对其他文 ...
- module.exports和exports得区别
对module.exports和exports的一些理解 可能是有史以来最简单通俗易懂的有关Module.exports和exports区别的文章了. exports = module.exports ...
- nodejs里的module.exports和exports
引 在node.js中我们可以使用module.exports和exports导出模块,设置导出函数.数组.变量等等 为什么可以用这两个模块? 或者直接问,node.js的模块功能是怎么实现的. 这样 ...
- (node中)module.exports 和exports的区别
(node中使用)module.exports 和exports的区别是什么? 用一句话来说明就是,require只会去引用module.exports这个对象的导出,不会引用exports对象的,而 ...
- 关于module.exports和exports
关于module.exports和export 总结:直接使用module.exports.属性名=属性值 的方式,根据后面的会覆盖前面的原则. 使用module.exports={ 属性名:属性值} ...
最新文章
- matlab中patch命令_matlab 放大平移图形是超出边界问题的处理
- java主类与源代码名称_Java高级编程基础:类文件结构解析,看穿Class代码背后的秘密...
- 1489 蜥蜴和地下室
- 无法删除DLL文件解决方法(转)
- h5 时间控件问题,怎么设置type =datetime-local 的值
- 大数据分析平台具备什么功能特点
- AllenNLP 用法总结
- 微软开源网络攻防模拟工具CyberBattleSim介绍及源码分析
- Compiz Fusion 安装后的设置
- opencv形态学-开操作和闭操作
- 应用不能远程访问RabbitMQ的5672端口
- 人工智能——机器学习与深度学习思维导图
- 听歌的时候再也不用各个音乐播放软件来回切换啦!
- 20单元——学习正解表达式及学习实践 Shell script
- iphone微信长按二维码识别不了
- 最新好玩的神乐七奈桌面宠物+附带BGM音效
- 网新恒天2013年校园招聘笔试
- c++运行时报错terminate called after throwing an instance of ‘std::bad_alloc‘
- 基于AI的智能急性颅内出血类型检测-2019
- 数值分析线性方程组迭代法之SOR迭代法详解及其C语言算法实现
热门文章
- linux 复制 软链接文件,cp复制软链接失效的原因
- java面试题(java中高级面试题及答案)
- 学校教学计算机报损程序,信息学院计算机应用实验教学中心低值品、易耗品及材料管理办法...
- 经典K线形态组合普及大全!(好文珍藏)
- 计算机网络 | HTTPS | 参考各家资料 | 无知的我学习日记(图文排版无水印)
- 记录从U盘安装Ubuntu20.04系统到旧电脑
- Python自制随机食物生成器(食物可自拟)
- 18、消防责任事故罪
- 自己动手做QQ-特洛伊
- OpenCV学习笔记(14):形态学滤波对图像进行边缘及角点检测