Nodejs ·

exports和module.exports介绍

为了让nodejs开发过程中,为了让Node.js的文件可以相互调用,Node.js提供了一个简单的模块系统,模块是Node.js 应用程序的基本组成部分,文件和模块是一一对应的。换言之,一个 Node.js 文件就是一个模块,这个文件可能是JavaScript 代码、JSON 或者编译过的C/C++ 扩展。

nodejs中,提供了exports和module.exports导出模块, require对象从外部获取一个模块的,即所获取模块的 exports或者module.exports导出的模块。module.exports和exports是属于CommonJS模块规范!根据这个规范,每个文件就是一个模块,有自己的作用域。在一个文件里面定义的变量、函数、类,都是私有的,对其他文件不可见。

CommonJS规范规定,每个模块内部,module变量代表当前模块。这个变量是一个对象,它的exports属性(即module.exports)是对外的接口。加载某个模块,其实是加载该模块的module.exports属性。如果你希望你的模块就想为一个特别的对象类型,请使用module.exports;如果希望模块成为一个传统的模块实例,请使用exports.xx方法;module.exports才是真正的接口,exports只不过是它的一个辅助工具。最终返回给调用的是module.exports而不是exports。

下面来看一下exports和module.exports

let cs = function(){
    return {
        name:null,
        setName:function(){
            var self = this;
            setTimeout(function(){
                if(self.name){
                console.log(self.name);
            }else{
                self.name = "hzhzh"+Math.random();
                console.log(self.name);
            }
            },3000)
        }
    }
}
exports.cs = cs;
//或者使用module.exports.cs = cs;达到的效果是相同的

按上面的导出方式,调用使用的时候需要按下方的方法调用

var cs = require("./cs.js");
router.get('/testMo',function(req,res){
    let csF = new cs.cs();
    csF.setName();
    res.json({success:true})
})

在上面的导出方式还可以使用module.exports = cs;这种方式,如果采用这种方式导出的话,那么调用需要按下面的方法

var cs = require("./cs.js");
router.get('/testMo',function(req,res){
    let csF = new cs();
    csF.setName();
    res.json({success:true})
})

exports和module.exports介绍

注意
从上图我们可以看到,我两次访问输出了不同的结果。我为什么要进行两次访问,还有就是上面的示例代码中我做了个延时3秒执行输出的操作。原因在于我导出的如果直接是一个对象的话,那么就会出现一个数据缓存的问题,我们先来看一下修改后的代码

let cs ={
        name:null,
        setName:function(){
            var self = this;
            setTimeout(function(){
                if(self.name){
                console.log(self.name);
            }else{
                self.name = "hzhzh"+Math.random();
                console.log(self.name);
            }
            },3000)
        }
    }
module.exports = cs;

调用代码为:

var cs = require("./cs.js");
router.get('/testMo',function(req,res){
    cs.setName();
    res.json({success:true})
})

我们了看一下代码结果
exports和module.exports介绍

看到了什么,两次访问的结果相同,也就是说第一次访问以后给name赋值了,然后第二次访问的时候name值是存在的。换句话说module.exports导出模块时相当于创建了一个全局的对象,每次调用访问的都是这一个对象,数据是全局公用的,所以在以后的使用过程中需要注意。

参与评论