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的区别:

  • Module.exports:如果你想你的模块是一个 特定的类型 就用 Module.exports。
  • exports: 如果你想的模块是一个 典型的“实例化对象” 就用 exports。

原文:http://www.hacksparrow.com/node-js-exports-vs-module-exports.html

参考:http://www.cnblogs.com/kongxianghai/p/3936197.html

1. nodejs 模块中的 exports 对象:你可以用它创建你的模块。例如:

假设这是 rocker.js 文件:

# rocker.js 
exports.name = function() {
    console.log(‘My name is Lemmy Kilmister‘);
};

则,在另一文件中,你可以这样引用:

var rocker = require(‘./rocker.js‘);rocker.name();    // ‘My name is Lemmy Kilmister‘

强调:

(1)给 exports 赋值其实是给 module.exports 这个空对象添加了属性,eg:


var name = ‘nswbmw‘;
exports.name = name;
exports.sayName = function() {  console.log(name); } 

# 给 exports 赋值其实是给 module.exports 这个空对象添加了两个属性而已,上面的代码相当于:
var name = ‘nswbmw‘;
module.exports.name = name; module.exports.sayName = function() {  console.log(name); }

(2)两者的使用方法不同,eg:

使用 exports:

# circle.js -- 使用 exports 定义一个方法exports.area = function(r) {  return r * r * Math.PI; } 
# app.js -- 使用上面文件里定义的方法var circle = require(‘./circle‘); console.log(circle.area(4));    # 使用,引用的方式:***.area()

使用 Module.exports:

# area.js -- 使用 module.exports 定义方法module.exports = function(r) {  return r * r * Math.PI;  
# app.js -- 使用上面文件定义的方法
var area = require(‘./area‘); console.log(area(4));  # 直接使用,***()

2. Module.exports :

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

    # 修改的 rocker.jsmodule.exports = ‘ROCK IT!‘;  # 将 module.exports = {}; 变为了 module.exports = ‘‘;
    exports.name = function() {
        console.log(‘My name is Lemmy Kilmister‘);
    }; 

    此时,再次引用执行 rocker.js 如下:

    var rocker = require(‘./rocker.js‘);rocker.name(); // TypeError: Object ROCK IT! has no method ‘name‘ # 发现报错:对象“ROCK IT!”没有name方法 

    rocker 模块忽略了 exports 收集的 name 方法,返回了一个字符串“ROCK IT!”。由此可知,你的模块并不一定非得返回“实例化对象”。你的模块可以是任何合法的javascript对象--boolean, number, date, JSON, string, function, array等等。

  • 你的模块可以是任何你设置给它的东西。如果你没有显式的给 Module.exports 设置任何属性和方法,那么你的模块就是 exports 设置给 Module.exports 属性。

  eg1: 你的模块是一个类:

# 再次修改 rocker.jsmodule.exports = function(name, age) {
    this.name = name;
    this.age = age;
    this.about = function() {
        console.log(this.name +‘ is ‘+ this.age +‘ years old‘);
    };
};

可以这样使用它:

var Rocker = require(‘./rocker.js‘);var r = new Rocker(‘Ozzy‘, 62);r.about();   // Ozzy is 62 years old

eg2: 你的模块是一个数组:

# 再次修改 rocker.js
module.exports = [‘Lemmy Kilmister‘, ‘Ozzy Osbourne‘, ‘Ronnie James Dio‘, ‘Steven Tyler‘, ‘Mick Jagger‘];

可以这样使用它:

var rocker = require(‘./rocker.js‘);console.log(‘Rockin in heaven: ‘ + rocker[2]); //Rockin in heaven: Ronnie James Dio

现在你明白了,如果你想你的模块是一个特定的类型就用 Module.exports,直接 变量/new方法 使用。如果你想的模块是一个典型的“实例化对象”就用 exports,需引用使用 .***

  • 给Module.exports添加属性类似于给exports添加属性。例如:

    module.exports.name = function() {
        console.log(‘My name is Lemmy Kilmister‘);
    };

    同样, exports 是这样的:

    exports.name = function() {
        console.log(‘My name is Lemmy Kilmister‘);
    };

    强调:这两种定义效果并不相同(本人还是有点晕,后续将继续学习)。前面已经提到 module.exports 是真正的接口,exports 只不过是它的辅助工具。推荐使用 exports 导出,除非你打算从原来的 “实例化对象” 改变成一个 类型!!

时间: 2024-12-20 00:54:44

nodeJS exports – exports vs module.exports的相关文章

NodeJs系列课程:module.exports与exports详解

你肯定非常熟悉nodejs模块中的exports对象,你可以用它创建你的模块接下来介绍创建过程,感兴趣的朋友可以参考下 你肯定非常熟悉nodejs模块中的exports对象,你可以用它创建你的模块. 例如:(假设这是rocker.js文件) exports.name = function() { console.log('My name is Lemmy Kilmister'); }; 在另一个文件中你这样引用 var rocker = require('./rocker.js'); rocke

nodejs中exports与module.exports的实践

只要是在nodejs中写自己的文件模块就少不了会遇到module.exports和exports的使用,看别人的代码大多都会使用“module.exports=exports=<对象/函数等>”怪异的串联用法,一问原因,貌似都是云里雾里,如此写法更像是保守的防止性写法. 这种问题除了看源代码外,只能写点代码进行求证. 写了两个模块文件,provider.js产生任意类型的对象, customer.js返回并输出provider对象. 第一种情况: provider.js,直接在exports上

nodejs 中module.exports 和 exports 区别详细介绍

你肯定非常熟悉nodejs模块中的exports对象,你可以用它创建你的模块接下来介绍创建过程,感兴趣的朋友可以参考下 你肯定非常熟悉nodejs模块中的exports对象,你可以用它创建你的模块.例如:(假设这是rocker.js文件)  复制代码代码如下: exports.name = function() { console.log('My name is Lemmy Kilmister'); }; 在另一个文件中你这样引用  复制代码代码如下: var rocker = require(

ES6的export与Nodejs的module.exports

module.exports与exports,export与export default之间的关系和区别 首先我们要明白一个前提,CommonJS模块规范和ES6模块规范完全是两种不同的概念. CommonJS模块规范 Node应用由模块组成,采用CommonJS模块规范. 根据这个规范,每个文件就是一个模块,有自己的作用域.在一个文件里面定义的变量.函数.类,都是私有的,对其他文件不可见. CommonJS规范规定,每个模块内部,module变量代表当前模块.这个变量是一个对象,它的expor

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是

nodejs exports与module.exports的区别

exports和module.exports的作用都是将文件模板的方法和属性暴露给require返回的对象进行调用.但是两者有本质的区别,exports的属性和方法都可以被module.exports替代. 如下代码是一样的: exports.name='iwang' module.exports.name = 'iwang' 但是exports不能替代module.exports的方法,所有的exports对象最终都是通过module.exports传递执行的.可以理解exports是给mod

ES6的export与Nodejs的module.exports比较

首先我们要明白一个前提,CommonJS模块规范和ES6模块规范完全是两种不同的概念. CommonJS模块规范 Node应用由模块组成,采用CommonJS模块规范. 根据这个规范,每个文件就是一个模块,有自己的作用域.在一个文件里面定义的变量.函数.类,都是私有的,对其他文件不可见. CommonJS规范规定,每个模块内部,module变量代表当前模块.这个变量是一个对象,它的exports属性(即module.exports)是对外的接口.加载某个模块,其实是加载该模块的module.ex

exports和module.exports的区别

最近忍不住开始尝试nodeJS了,简直又是打开了一片天地,学的越多越觉得自己好low,还有好多好多东西没有触碰,没有学习. 解决这个问题的唯一的办法就是卧薪尝胆. 好的,刚开始接触nodeJS,在视频学习的时候看到了exports和module.exports这两种导出模块函数的方法.哎,好老师太难遇到了,我唯一喜欢的老师就是带我坑js的石川老师,其他老师的视频我实在不知道说什么好.好吧又说别的了,其实我的意思是我没有听懂exports和module.exports的区别,而且那个老师也只是随便

module.exports和exports

require 用来加载代码,而 exports 和 module.exports 则用来导出代码.但很多新手可能会迷惑于 exports 和 module.exports 的区别,为了更好的理解 exports 和 module.exports 的关系. 一开始我没有理解,原因是我没有明白nodejs 是怎么创建module.exports 和 exports,并且二者关系是怎么样的. 其实,系统自动给nodejs 文件增加2个变量 exports 和 module, module 又有一个属