• 【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: '配电电压曲线'});  
    };  
     
  • 相关阅读:
    极简风格的LOGO,收集一波!
    如何利用AI软件中的混合器工具制作文字
    国内有哪些非常有设计感的 App?
    如何用PS制作花型背景图
    怎样去调整摄影作品的背景颜色
    如何用PS把数码拍摄的荷花照片制作成中国风的效果
    PS 抠人像如何抠得干净?
    如何用 Ps 制作毛玻璃穿透效果?
    化装品经过这样PS包装,身价立马翻10倍
    有哪些漂亮的中国风 LOGO 设计?
  • 原文地址:https://www.cnblogs.com/gossgao/p/6952334.html
Copyright © 2020-2023  润新知