前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >exports和module.exports介绍

exports和module.exports介绍

作者头像
OECOM
发布2020-07-01 17:01:52
1.5K0
发布2020-07-01 17:01:52
举报
文章被收录于专栏:OECOMOECOM

为了让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

代码语言:javascript
复制
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;达到的效果是相同的

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

代码语言:javascript
复制
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;这种方式,如果采用这种方式导出的话,那么调用需要按下面的方法

代码语言:javascript
复制
var cs = require("./cs.js");
router.get('/testMo',function(req,res){
    let csF = new cs();
    csF.setName();
    res.json({success:true})
})
exports和module.exports介绍
exports和module.exports介绍

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

代码语言:javascript
复制
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;

调用代码为:

代码语言:javascript
复制
var cs = require("./cs.js");
router.get('/testMo',function(req,res){
    cs.setName();
    res.json({success:true})
})

我们了看一下代码结果

exports和module.exports介绍
exports和module.exports介绍

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-10-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档