【NodeJs】nodejs中exports与module.exports的区别详细介绍

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

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

在另一个文件引用 代码如下:

var rocker = require('./rocker.js'); 
rocker.name(); 

其实,Module.exports才是真正的接口,exports只不过是它的一个辅助工具。 最终返回给调用的是Module.exports而不是exports

所有的exports收集到的属性和方法,都赋值给了Module.exports。当然,这有个前提,就是Module.exports本身不具备任何属性和方法。如果,Module.exports已经具备一些属性和方法,那么exports收集来的信息将被忽略。
 
修改rocker.js如下:
module.exports = 'ROCK IT!'; 
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的属性。
 
下面例子中,你的模块是一个类,代码如下:
module.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 

下面例子中,你的模块是一个数组,代码如下:

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添加属性类似于给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导出,除非你打算从原来的“实例化对象”改变成一个类型。

我们只需知道三点就知道 exports 和 module.exports 的区别了:

  1. exports 是指向的 module.exports 的引用
  2. module.exports 初始值为一个空对象 {},所以 exports 初始值也是 {}
  3. require() 返回的是 module.exports 而不是 exports
即module.exports是一个对象,可以有属性和方法,引用时,直接对象.方法即可。比如:
var mysql = require('mysql');  
var config = require('./dbConfig');  
var pool = mysql.createPool(config.dbSetting);  
var db = {};  
db.query = function (sql, callback) {  
    pool.getConnection(function (err, conn) {  
        if (err) {  
            callback(err, null, null);  
            return;  
        } else {  
            conn.query(sql, function (error, results, fields) {  
                for (var i = 0; i < results.length; i++) {  
                    console.info("%d\t%s\t%s", results[i].id, results[i].name, results[i].pwd);  
                }  
                callback(error, results, fields);  
            });  
            //回调后要释放连接  
            conn.release();  
        }  
    });  
};  
db.query_param = function (sql, param, callback) {  
    pool.getConnection(function (err, conn) {  
        if (err) {  
            callback(err, null, null);  
            return;  
        } else {  
            conn.query(sql, param, function (error, results, fields) {  
                for (var i = 0; i < results.length; i++) {  
                    console.info("%d\t%s\t%s", results[i].id, results[i].name, results[i].pwd);  
                }  
                callback(error, results, fields);  
            });  
            //回调后要释放连接  
            conn.release();  
        }  
    });  
};  
  
  
//作为对象导出  
module.exports = db; 
 
而exports更倾向的是方法的定义。比如:
/** 
 * Created by Uno on 2016/7/27. 
 */  
//台区电压曲线  
exports.tqdy = function (req, res) {  
    res.render('echart/tqdy', {title: '台区电压曲线'});  
};  
//台区功率曲线  
exports.tqgl = function (req, res) {  
    res.render('echart/tqgl', {title: '台区功率曲线'});  
};  
//台区负载率曲线  
exports.fzl = function (req, res) {  
    res.render('echart/fzl', {title: '台区负载率曲线'});  
};  
//非台区变电电压曲线  
exports.bddy = function (req, res) {  
    res.render('echart/bddy', {title: '变电电压曲线'});  
};  
//非台区配电电压曲线  
exports.pddy = function (req, res) {  
    res.render('echart/pddy', {title: '配电电压曲线'});  
};  
 
posted @ 2017-06-06 16:38  Goss  阅读(1054)  评论(0编辑  收藏  举报