nodejs模块中exports和module.exports的区别

通过Node.js的官方API可以看到Node.js本身提供了很多核心模块 http://nodejs.org/api/ ,这些核心模块被编译成二进制文件,可以require(‘模块名‘)去获取;核心模块具有最高的加载优先级(有模块与核心模块同名时会体现)

文件模块访问方式通过require(‘/文件名.后缀‘) require(‘./文件名.后缀‘) requrie(‘../文件名.后缀‘) 去访问,文件后缀可以省略;以"/"开头是以绝对路径去加载,以"./"开头和以"../"开头表示以相对路径加载,而以"./"开头表示同级目录下文件

exports和module.exports;提供了外部访问的接口

讲讲他们的区别

1、模块导入会缓存,写了多次导入,只会导一次。

即使导入的路径不一样。它缓存是指实际文件名,并不会因为传入的路径形式不一样而认会是不同的文件

 1 var outputVal  = 0;     //输出值
 2 var increment = 1;    //增量
 3 /* 设置输出值 */
 4 function seOutputVal (val) {
 5     outputVal = val;
 6 }
 7 /* 设置增量 */
 8 function setIncrement(incrementVal){
 9     increment = incrementVal;
10 }
11 /* 输出 */
12 function printNextCount()
13 {
14     outputVal += increment;
15     console.log(outputVal) ;
16 }
17 function printOutputVal() {
18     console.log(outputVal);
19 }
20 exports.seOutputVal = seOutputVal;
21 exports.setIncrement = setIncrement;
22 module.exports.printNextCount = printNextCount;
 1 /*
 2     一个Node.js文件就是一个模块,这个文件可能是Javascript代码、JSON或者编译过的C/C++扩展。
 3     重要的两个对象:
 4     require是从外部获取模块
 5     exports是把模块接口公开
 6 */
 7 var counter = require(‘./1_modules_custom_counter‘);
 8 console.log(‘第一次调用模块[1_modules_custom_counter]‘);
 9 counter.seOutputVal(10);               //设置从10开始计数
10 counter.setIncrement (10);             //设置增量为10
11 counter.printNextCount();
12 counter.printNextCount();
13 counter.printNextCount();
14 counter.printNextCount();
15 /*
16     require多次调用同一模块不会重复加载
17 */
18 var counter = require(‘./1_modules_custom_counter‘);
19 console.log(‘第二次调用模块[1_modules_custom_counter]‘);
20 counter.printNextCount();

2、通过exports和module.exports对外公开的方法都可以访问,但有区别

module.exports才是真正的接口,exports只不过是它的一个辅助工具。 最终返回给调用的是module.exports而不是exports。
所有的exports收集到的属性和方法,都赋值给了Module.exports。当然,这有个前提,就是module.exports本身不具备任何属性和方法。
如果,module.exports已经具备一些属性和方法,那么exports收集来的信息将被忽略。

我把exports和 module.exports都打印出来看看究竟

①  (虽然这样在引入模块时会报错,但这一步能说明问题,后面说原因)

 1 var counter  = 0;
 2 exports.temp  = function(){
 3     counter += 10;
 4     this.printNextCount = function()
 5     {
 6         console.log(counter);
 7     }
 8 }
 9 var isEq = (exports === module.exports);
10 console.log(exports);
11 console.log(module.exports);
12 console.log(isEq);

结果:

通过exports导出的方法,会传递给module.exports。二者没区别

 1 var counter  = 0;
 2 module.exports = function(){
 3     counter += 10;
 4     this.printNextCount = function()
 5     {
 6         console.log(counter);
 7     }
 8 }
 9 var isEq = (exports === module.exports);
10 console.log(exports);
11 console.log(module.exports);
12 console.log(isEq);

结果:

直接传给module.exports,那exports就说明都没有,二者不相等了。

③:注意,导入时有点区别。和上面第一大点不一样

如这里的②

1  var  Counter = require(‘./  ‘);
2  var  counterObj = new Counter();
3  counterObj.printNextCount();

而第一大点可以直接这样:

1  var counter = require(‘./1_modules_custom_counter‘);
2  console.log(‘第二次调用模块[1_modules_custom_counter]‘);
3  counter.printNextCount();

就是要new一个对象!

因为导出的文件中的函数变成了成员方法,所以要new一个对象,再调用成员方法。

说明①不可行的原因:当我在别的文件调用它时,无论是直接调用,还是new一个对象再调用,都报错!

所以,要遵循这两点

1.最好别分别定义module.exports和exports

2.NodeJs开发者建议导出对象用module.exports,导出多个方法和变量用exports

3、exports和module.exports覆盖

直接上代码,看谁留下,谁消失

 1 var counter  = 0;
 2 exports.printNextCount = function()
 3     {
 4     counter+=2;
 5         console.log(counter);
 6     }
 7 module.exports = function(){
 8 counter+=10;
 9 this.printNextCount=function(){
10 console.log(counter)
11 }
12
13 }
14 var isEq = (exports === module.exports);
15 console.log(exports);
16 console.log(module.exports);
17 console.log(isEq);

想想都知道谁厉害。

引用该模块:

①报错,说明exports的消失了

1 var counter = require(‘./test3‘);
2 counter.printNextCount();

②留下了。

1 var counter = require(‘./test3‘);
2 var counterObj=new counter()
3 counterObj.printNextCount();

结果,输出了它成功导出的对象函数值;前面两个是两个接口收集到的东西,最后exports的被覆盖了

文章是学习笔记,如有错误,望指正

时间: 2024-12-26 05:50:08

nodejs模块中exports和module.exports的区别的相关文章

(译)Node.js的模块-exports和module.exports

原文标题:Node.js Module – exports vs module.exports原文链接:http://www.hacksparrow.com/node-js-exports-vs-module-exports.html exports 和 module.exports 有什么区别? 你一定很熟悉 Node.js 模块中的用来在你的模块中创建函数的 exports 对象,就像下面这样. 创建一个叫做rocker.js的文件: exports.name = function() {

深入理解nodejs 中 exports与module.exports

在Javascript 中,有2种作用域,分为 全局作用域 ,和函数作用域, 在 浏览器端 , 全局作用域 就是 window对象的属性, 函数作用域 就是 ,某个 函数 生成的对象的属性: <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title></title> <script> var name

nodejs中exports与module.exports的区别

node中exports模块对象相信大家一定不陌生: 如studentModule.js: exports.student = function() { console.log("this is student module!"); } 在另一个模块中这样引用: var student = require('./studentModule.js'); student.student(); // this is student module! 那么问题来了:module.exports是

node.js模块中exports和module.exports的区别

Node应用由模块组成,采用CommonJS模块规范. 根据这个规范,每个文件就是一个模块,有自己的作用域.在一个文件里面定义的变量.函数.类,都是私有的,对其他文件不可见. CommonJS规范规定,每个模块内部,module变量代表当前模块.这个变量是一个对象,它的exports属性(即module.exports)是对外的接口.加载某个模块,其实是加载该模块的module.exports属性. var x = 5; var addX = function (value) { return

nodeJS exports – exports vs module.exports

require, exports, module.exports 区别: require 用来加载代码(模块),而 exports 和 module.exports 则用来导出代码. exports 是指向的 module.exports 的引用 module.exports 初始值为一个空对象 {},所以 exports 初始值也是 {} require() 返回的是 module.exports 而不是 exports nodejs中exports与module.exports的区别: Mo

node.js中exports与Module.exports区别

想你的模块是一个特定的类型就用Module.exports.如果你想的模块是一个典型的“实例化对象”就用exports. 你肯定非常熟悉nodejs模块中的exports对象,你可以用它创建你的模块.例如:(假设这是rocker.js文件) 复制代码代码如下: exports.name = function() { console.log('My name is Lemmy Kilmister'); }; 在另一个文件中你这样引用 复制代码代码如下: var rocker = require('

node.js中的exports和module.exports

不同的编程语言都有各自的代码组织和复用的方式,如.net.php中的命名空间,python中的import,ruby中的module等,来避免命名空间污染.一直都没搞清楚node中的exports和module.exports的区别,借此搞清楚node的代码模块复用方式. 首先怎么创建node中的modules. 可以直接创建一个文件作为module,如下module.js function writeLine(){ console.log("module.js"); } export

Node.js中exports与module.exports的区别

原文:http://www.hacksparrow.com/node-js-exports-vs-module-exports.html 你肯定对Node.js模块中用来创建函数的exports对象很熟悉(假设一个名为rocker.js的文件): exports.name = function() { console.log('My name is Lemmy Kilmister'); }; 然后你在另一个文件中调用: var rocker = require('./rocker.js'); r

Node.js中exports,module.exports以及require方法

在Node.js中,使用module.exports.f = ...与使用exports.f = ...是一样的,此时exports就是module.exports的一种简写方式.但是,需要注意的是,如果直接给exports赋值的话,exports就与module.exports没有任何关联了,比如: exports = { hello: false }; // Not exported, only available in the module 此时,exports是没有导出任何变量的. 要弄