美文网首页Vue
module.exports与exports的区别

module.exports与exports的区别

作者: agamgn | 来源:发表于2020-02-01 08:20 被阅读0次

    一、module.exports与exports的区别

     在写node的自定义模块的时候,经常是直接module.exports={}完事,但是偶然间看到exports.fn = function(){},感觉少些了一个module,更加简洁于是我想搞清楚他们的区别。
    区别:
    exports返回的是模块函数
    module.exports返回的是模块对象本身,返回的是一个类
    使用上的区别是:
    exports的方法可以直接调用
    module.exports需要new对象之后才可以调用
    exports案例
    正确例子:

    //demo1.js
    function Persion2(){
        console.log("agam2");
    }
    exports.Persion2=Persion2;
    console.log(exports)
    console.log(module.exports)
    
    //index.js
    const persion=require("./demo1")
    persion.Persion2()
    //{ Persion2: [Function: Persion2] }
    //{ Persion2: [Function: Persion2] }
    //agam2
    

    发现此时exports和module.exports对象输出的都是一个sayHello方法,
    为什么module.exports也有exports方法了,简单点理解就是:exports只是module.exports的全局引用
    接下来,我们修改下
    错误例子:

    //demo1.js
    class Persion{
        constructor(age){
            this.age=age;
        }
        getName(){
            return "agam";
        }
    }
    exports.Persion2=Persion;
    console.log(exports)
    console.log(module.exports)
    
    //index.js
    const persion=require("./demo1")
    persion.Persion()
    //Class constructor Persion cannot be invoked without 'new'
    

    可见上面的结论exports返回的是模块函数。
    既然exports是moudle.exports的一个引用,那么exports能做的moudle.exports都能做,不能做的moudle.exports也能做。

    //demo1.js
    class Persion{
        constructor(age){
            this.age=age;
        }
        getName(){
            return "agam";
        }
    }
    function Persion2(){
        console.log("agam2");
    }
    module.exports=Persion;
    
    //index.js
    const persion=require("./demo1")
    let p =new persion();
    console.log(p.getName())
    //agam2
    

    总结

    • exports只是module.exports的引用
    • 如果你想要使用exports导出模块,千万不能给它赋值!
    • 稳一点的做法是使用module.exports,虽然exports用起来是挺爽的
      本节代码

    相关文章

      网友评论

        本文标题:module.exports与exports的区别

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