module.export和export

  • module.exports 和 exports 是引用到的同一个对象,类似下面代码所示(为了举例,不是完全的正确):

        var module.exports = {};
        var exports = module.exports;
        在模块内,没对module.exports和exports做任何更改前,他们都是指向同一个空对象。

  • 在其他模块内使用require引用的是module.exports 对象,不一定是exports指向的引用对象,这点在开发中很容易因为忽略而导致bug产生。如下例子:

        exports = function(){};
        //在其他模块内
        require(...);//得到{}
        此时在其他模块内使用require引用上面模块导出的对象时,发现为空对象,为什么?因为使用exports=function(){}时,是将exports的引用指向了这个函数,而module.exports的引用还是空对象,并且其       他模块使用require引用的是module.exports,所以此处会得到空对象,而不是函数。当然此处写成module.exports = function(){}肯定是没问题的。

  • 有人说为了防止上面的bug产生,一般都执行下 exports = module.exports,,但是直接覆盖module.exports不是一个好习惯,所以对于 module.exports = {a:123, b:456} 这样的情况,分开来写:

             exports.a = 123;
             exports.b = 456;

  • 下面贴下几种情况,其他模块得到的不同结果:

        exports = function fn(){}; // outputs "@routes {}"
        exports.fn = function fn(){}; // outputs "@routes { fn: [Function: fn] }"
        module.exports = function fn(){}; // outputs "@routes function fn(){}"
        module.exports.fn = function fn(){}; // outputs "@routes { fn: [Function: fn] }"

原文地址:https://www.cnblogs.com/yuyuj/p/4559094.html