module.exports和exports

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