专栏首页OECOMexports和module.exports介绍

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})
})

注意 从上图我们可以看到,我两次访问输出了不同的结果。我为什么要进行两次访问,还有就是上面的示例代码中我做了个延时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})
})

我们了看一下代码结果

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • JS变量声明提升解释

    来说一下函数表达式,var C 与 function C 都是声明语句,区别在于 var C 是函数表达式,而 function C 是函数声明。

    OECOM
  • 使用nodejs做文件下载中转

    之前做了一个功能就是点击按钮实现文件下载,文件保存在了阿里云的OSS上,阿里的OSS和七牛的OSS其实个人感觉差不多,一般情况下,前端下载文件很多都是通过一个a...

    OECOM
  • javascript中Math对象的用法

    注释:Math 对象并不像 Date 和 String 那样是对象的类,因此没有构造函数 Math(),像 Math.sin() 这样的函数只是函数,不是某个对...

    OECOM
  • python基础教程:作用域和命名空间

    命名空间和作用域的概念我们之前也提到过,比如内置函数globals(),函数中变量的作用域,模块使用的import等等。这些可能让我们对这两个概念有了大致的理解...

    一墨编程学习
  • mysql视图,ThinkPHP视图

    简单、
  • 迁移到云端?SD-WAN很重要!

    高性能的SD-WAN解决方案提供了一种安全可靠的方式,可以灵活地将用户连接到应用程序以使用任何底层传输组合。

    静一
  • 一篇文章教给你Bypass学习基础

    使用过滤函数对恶意攻击进行过滤,绕过思路: ①大小写替换 ②变换提交方式:如get请求变post/cookie请求绕过 ③编码绕过:url编码、基于语句重...

    天钧
  • Hibernate 中集合对象的抓取策略(Fetching strategies)

    /**  * Product entity. @author MyEclipse Persistence Tools  */

    Hongten
  • 开发中常用的JS知识点集锦

    tandaxia
  • 如何使用Linux的Crontab执行PHP脚本

    我们的PHP程序有时候需要定时执行,我们可以使用ignore_user_abort函数或是在页面放置js让用户帮我们实现。但这两种方法都不太可靠,不稳定。我们可...

    wangxl

扫码关注云+社区

领取腾讯云代金券