关于为什么要使用 exports = module.exports = xxx

通过exports和module.exports对外公开的方法都可以访问,但有区别

比如下面这个页面案例: 

const mongoHelper = require('../utils/mongoHelper');
const mongoose = require('mongoose');
const settings = require(`../conf/${process.env.NODE_ENV}/settings`);

const articlesSchema = new mongoose.Schema({
    title: { 
        type: String
    },
    brief: {
        type: String
    },
    author: {
        type: String
    },
    content: {
        type: String
    }
});
var mongoUtil = mongoHelper.pool(settings.databases.local.name,settings.databases.local.config)
const articlesModel = mongoUtil.model('articles',articlesSchema, 'articles');


/**首先说一下 ,module,module.exports 这俩对象是啥? 
 * module 就是当前页面对象。 
 * module.exports 是一个对象, 里面的东西就是对外暴露的对象属性等,  一次暴露多个方法,就要这样写了。 
 * 而exports 就是model.exports 的一个引用, 
 * 我们的目的是暴露出想要暴露出的东西, 不管怎么样,只要将要暴露的东西放到mdoel.exports就行。 
 * 两种方式暴露方法或对象:
 * 1,可以一个一个用exports .上方法, 去暴露,(这个过程也是再给model.exports 加东西的过程) 
 * exports.aa = "bb";
 * 2,也可以将要暴露的对象弄到一起搞成对象直接给model.exports对象进行赋值。  
 * module.exports = {a:function(){}}
 */



/**
 * 关于为什么要使用 exports = module.exports = xxx
 *
 */
module.exports = {a:function(){}}
// module.exports 原来的对象就被覆盖成了这个方法,此时暴露的只是这个方法了。 
exports.aa = "bb";
// 而exports 引用的是model.exports覆盖前的那个对象, 修改它、在它身上添加属性已经没有用了(它已经不代表暴露对象了)

// 所有我们为了让上面一行的这个暴露动作不失效, 所以不能覆盖原model.exports ,
// 我们这样做: exports = module.exports = xxx
exports = module.exports = {a:function(){}} 
exports.aa = "bb";
// 这样的话, 原来的暴露对象赋值给原来的暴露对象, 暴露对象不被覆盖, exports对象的指向仍然是有效的暴露的对象, 然后再往这个exports添加对象, 就实现暴露了。
// 但是这样写的话,要注意这个代码=>  exports = module.exports = xxx  以上的暴露动作会失效。 
console.log(1);

 

// 如果向下面这么写,将一个新对象直接赋值给exports , 那这个引用对象,就和model中的暴露对象毛关系没有了, 它就没有任何作用了。下面代码再对这个做暴露动作也没有意义了,  它已经不代表暴露对象了。 
exports = {a:function(){}} 

 

前辈原话: 

在默认情况下,module.exports 是一个Object, exports 是 module.exports 的一个引用。 大多数人都是通过 exports.xx = yy 来输出

当模块要输出一个非Object时(比如一个Function),可以使用 module.exports = function () {} ,此时 module.exports 被覆盖了而 exports 还是原来的对像的引用,为了避免在后面的代码中仍然使用 exports.xx = yy 而导致不能正确输出,需要把 exports 变量也重新设置为新的 module.exports 的引用,所以一般习惯写成 exports = module.exports = xxx

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值