美文网首页
module.exports和exports

module.exports和exports

作者: 土豪码农 | 来源:发表于2019-01-02 08:20 被阅读0次

    在nodejs中,导出一个模块,经常要用到exports,用法看过几种

    module.exports = exports = fun;
    exports.fun = fun;
    module.exports.fun = fun;
    

    到底这两个有什么关系呢,我决定好好研究一下
    于是我把先尝试两个都打印出来看看

    console.log(exports);  //{}
    console.log(module.exports);  //{}
    

    结果都是一个空对象.
    要弄清楚这个,首先要弄清楚,require的时候,require到底是什么
    于是我又做了一次尝试

    exports = 1; //require打印出来的是{}
    
    module.exports = 2; //require打印出来的是2
    

    所以这里可以确定的是,require的时候,拿到的是module.exports

    module.exports.a = 1; //require的时候拿到的是{ a: 1 }
    console.log(exports); // 打印出来的也是{ a: 1 }
    

    如果我们用上面那种方式,发现exports会根据module.exports添加属性变化而变化,反之亦然
    那为什么,赋值的方式就不行了呢?
    原来exports只是module.exports的一个引用,等于exports指向的是module.exports的内存地址,如果直接给exports赋值,会导致这个引用的消失,因为最终导出的结果还是以module.exports为准的,如果引用消失,exports干啥都没用了,最后拿到的还是module.exports.

    所以在我们使用这两个方法的时候要注意

    exports = fun; //直接赋值这种方法是行不通的,会吧exports对module.exports的引用消除了
    module.exports = exports = fun; //如果非要用这种方式,也可以这样使用
    module.exports.fun = fun; //这种方式和下面的方式基本没啥差别,都可以正确拿到导出的东西
    exports.fun = fun //这种方式和上面的方式基本没啥差别,都可以正确拿到导出的东西
    

    相关文章

      网友评论

          本文标题:module.exports和exports

          本文链接:https://www.haomeiwen.com/subject/nvsalqtx.html