学习exports和module.exports

今天闲来无事学习下node.js,看到两个有意思的东西,exports和module.exports,不涉及概念,各种教程上写的太详细了,不再拾人牙慧,只是记录自己学习、探索的过程

1、exports和module.exports是什么?

暴力输出一下:

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

竟然是两个空对象。突然灵机一动,这两个空对象会不会是同一个东西?

console.log(exports === module.exports);
// true

我屮艸芔茻,竟然真是同一个对象。
总结:模块内置对象,而且是个空对象。

2、模块导出方式有什么不一样?

创建两个模块试一下

// module.js
function foo() {
  console.log("this is foo");
}
// main.js
var my_module = require('./module');
console.log(my_module);

在module.js中分别测试

// 先测试exports
exports.foo = foo; // { foo: [Function: foo] }
exports = foo; // {}
exports = {foo: foo}; // {}
exports.tt = "712"; // { tt: '712' }

// 再测试module.exports
module.exports = foo; // [Function: foo]
module.exports.foo = foo; // { foo: [Function: foo] }
module.exports = {foo}; // { foo: [Function: foo] }

很有意思,exports只能打点属性赋值导出,module.exports相比之下就灵活的多。这里解释一下为什么exports不能直接赋值导出,module.exports是真正要导出的部分,exports是module.exports的快捷访问方式(这样:exports=module.exports),直接对 exports赋值相当于之前的引用断了,重新指向了新的内存地址,也就说跟module.exports不再有关系,而此时module.exports的值还是{},所以无法导出我们想要的对象。

exports.foo = foo;
module.exports.tt = "红脸汉子";
// { foo: [Function: foo], tt: '红脸汉子' }

并没有发生什么意外的事情,不出所料出现在了同一屋檐下,毕竟两个变量指向同一个对象。

你可能感兴趣的:(学习exports和module.exports)