module.exports和exports得区别
对module.exports和exports的一些理解
可能是有史以来最简单通俗易懂的有关Module.exports和exports区别的文章了。
exports = module.exports = {};
所以module.exports
和exports
的区别就是var a={}; var b=a;
,a和b的区别
看起来木有什么太大区别,但实际用起来的时候却又有区别,这是为啥呢,请听我细细道来
关于Module.exports和exports有什么区别,网上一搜一大把,但是说的都太复杂了…
听说exports是Module.exports对象的一个引用(reference)^1,什么是引用?!…_(:з」∠)_
当然啦,如果要彻底理解这两个导出的区别,最好肯定是去看源码,看看都是怎么封装的,功力深厚的童鞋应该一看就懂了。不过,源码我也是看不懂的…(ಥ_ಥ)
但是最近感觉杂七杂八看了好多文章做了好多实验之后,像是打开了任督二脉,机智的我好像有点上道了…
module
首先要明确的一点,module是一个对象 {Object}
。
当你新建一个文件,比如mo.js,文件内容如下:
1 |
console.log(module); |
然后在CMD里执行这个文件node mo.js
,就能看到module其实是一个Module实例,你可以这么理解,NodeJS中定义了一个Module类,这个类中有很多属性和方法,exports是其中的一个属性:
12345 |
function Module { id : 'blabla', exports : {}, blabla...} |
当每个js文件在执行或被require的时候,NodeJS其实创建了一个新的实例var module = new Module()
,这个实例名叫module
。
这也就是为什么你并没有定义module
这个变量,却能console.log出来而不会报错的原因。
module.exports
假设我有一个JS文件内容如下:
console.log(module); //你会看到Module中的exports为空对象{}
module.exports = {print : function(){console.log(12345)} } console.log(module); //你会看到Module中的exports对象已经有了print()方法
有了上面的基础,很容易理解module.export
其实是给Module实例中的exports对象中添加方法/属性。
exports
通常使用exports的时候,是这么用的:
exports.print = function(){console.log(12345)}
假设我有一个JS文件内容如下:
console.log(module); //你会看到Module中的exports为空对象{}
console.log(exports); //你会看到Module中的exports为空对象{} module.exports = { print : function(){console.log(12345)} } console.log(module); //你会看到Module中的exports对象有了print()方法 exports.name = '小白妹妹'; console.log(module); //你会看到Module中的exports对象不仅有了print()方法,还有了name属性
由此也能看出,传说中的exports
其实是module.exports
的引用,你可以这么理解,NodeJS在你的代码之前悄悄的加了以下代码:
var module = new Module();
var exports = module.exports;
这也就是为什么你并没有定义exports
这个变量,却能console.log出来而不会报错的原因。
require
当你从外部调用某个模块,require其实是在require什么?^2
require的时候NodeJS会到处去找有没有这个模块,如果有,return的就是module.exports里的东东。
DOs & DONTs
- √你可以这样:
module.exports.name = '小白妹妹'; exports.age = 10; module.exports.print = function(){console.log(12345)};
如果只是使用
.
来添加属性和方法,module.exports
和exports
混用是完全可以的,这种情况下,感觉exports
就是给懒人用的…毕竟能少写几个7个字符呢! - √也可以这样:
module.exports = { name = '小白妹妹'; }; exports.age = 10; module.exports.print = function(){console.log(12345)};
- ×但不可以这样:
module.exports = { name = '小白妹妹'; }; exports = {age:10}; // exports现在是{age:10}这个对象的引用,不再是module.exports的引用了 console.log(module); //你会看到Module的exports中只有name属性!!!
- ×也不可以这样:
exports.age = 10; console.log(module); //你会看到Module的exports中多了age属性 module.exports = { name = '小白妹妹'; }; console.log(module); //你会看到Module的exports中还是只有name属性!!!
总结
还是那一句话,
module.exports
和exports
的区别就是var a={}; var b=a;
,a和b的区别- 改变
exports
的指向后所添加的exports.xxx
都是无效的。因为require返回的只会是module.exports
- 改变
- 不能在使用了
exports.xxx
之后,改变module.exports
的指向。因为exports.xxx
添加的属性和方法并不存在于module.exports
所指向的新对象中。 - 对于要导出的属性,可以简单直接挂到
exports
对象上 - 对于类,为了直接使导出的内容作为类的构造器可以让调用者使用new操作符创建实例对象,应该把构造函数挂到
module.exports
对象上,不要和导出属性值混在一起
转载于:https://www.cnblogs.com/wang-z-z/p/9262456.html
module.exports和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的区别
在模块化规范中commonjs大部分用于node.js中,而commonjs中的导出方式分为两种 module.exports 和 exports,那么这两种具体有哪些区别呢?请往下看 CommonJ ...
- module.exports 和 exports 、export default 、export、require 、 inport 的区别
module.exports 和 exports 的区别(不完全理解exports 实际操作有出入) module.export 和exports 是node.js 的语法 , 而export def ...
- nodejs中module.exports和exports的区别
最近在学习nodejs,这篇文章就权当是一篇笔记,如果有什么地方有误,望指出. 首先我们要明白一个前提,CommonJS模块规范和ES6模块规范完全是两种不同的概念. CommonJS模块规范 Com ...
- module.export和exports两者区别及使用方法
参考链接:简书博客.简书博客.CommonJS规范 功能介绍 module.exports Node应用由模块组成,采用CommonJS模块规范.根据这个规范,每个文件就是一个模块,有自己的作用域.在 ...
- (区别、详解、使用)module.exports与exports,export与export default,import 与require
目录 导出简介(里面有小细节请仔细阅读) module.exports与exports 1.该js文件要导出的值即为test 2.该js文件要导出的值即为test1和test2 3. 注意这里我是先给 ...
- Node中Exports与module.export的使用与区别
最近在看<node开发实战详解>时有写疑问,所以自己就整理了一些资料.下面是node4.*的官方api文档(http://nodejs.cn/doc/node_4/modules.html ...
最新文章
- mysql 存储过程 互斥_mysql中的存储过程和事务隔离
- linux信号(signal) 机制分析
- android 镜像 制作工具,手机rom只制作-镜像工厂app下载2.8安卓最新版-西西软件下载...
- 左手供给,右手营销,聚划算99大促首战告捷的下沉市场进攻方法论
- getAndIncrement中使用cas
- appinventor如何做个游戏_单亮:游戏的重要性
- Mask rcnn介绍
- python序列操作_操作序列(python)
- UE4 植被工具的使用
- msvcr100.dll丢失怎么办?msvcr100.dll丢失的解决方法
- 【热血传奇】 添加新地图
- 阿里 卫哲谈阿里人力招聘价值观
- KEIL工程文件打不开
- Spring Boot当中获取request的三种方式
- 祝愿大家未来顺利平安
- 韩版机泛泰A850改mms.apk去除收到短信的国家代码
- Unity API常用方法和类
- 训练赛一:bfs广搜题目 CF115B Lawnmower
- TypeScript报错信息表(备注)
- numpy.corrcoef 计算相关系数