commonJS规范中module.exports与exports的区别

用代码测试下,同时用module.exportsexports导出属性,默认会使用谁导出的。

 \ app.json
    module.exports = {
      name: "module.exports",
    };
    exports.name = "exports";
   \ main.js
let app = require("./app.js");
console.log(app.name);  //输出 “module.exports”

看来,同时用module.exportsexports导出属性。会默认使用module.exports导出的属性。

最开始 module.exportsexports 输出的都是一个空对象。

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

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

通过给 exports 赋值属性

    console.log(module.exports);
    
    console.log(exports);
    
    console.log(module.exports === exports);
    
    exports.name = "exports";  // 赋值属性
    
    console.log(module.exports === exports);  // 输出true

    console.log(module.exports.name);         // 输出"exports"

到这一步,module.exportsexports 指代的还是同一对象。

在给 exports 属性赋值为一个对象

    console.log(module.exports);
    
    console.log(exports);
    
    console.log(module.exports === exports);  // 输出 true
    
    exports = {
      name: "exports",
    };
    
    console.log(module.exports === exports); // 输出 false
    
    console.log(module.exports.name); // 输出 undefined   

到这里,module.exportsexports 指代的就不是同一引用了,已经是不同的对象了。

原因: exports对象是通过形参的方式传入的,直接赋值形参会改变形参的引用,但并不能改变作用域外的值。module.exports就是为了解决exports直接赋值的问题而产生的。为了减少BUG,尽量不使用exports就行了。

开发工具
原文地址:https://www.cnblogs.com/cisbest/p/13516590.html