美文网首页
module.exports 和 exports 的区别

module.exports 和 exports 的区别

作者: 小毛蛋_ | 来源:发表于2018-03-23 10:30 被阅读0次

    node 在编译每个文件时,都会自动生成一个 module 的全局变量,可以在这个文件中直接访问
    // a.js

    console.log(module) 
    //Module {
    //  id: '.',
    //  exports: {},
    //  parent: null,
    //  filename: 'E:\\myproject\\nodetest\\a.js',
    // loaded: false,
    //  children: [],
    //  paths:
    //  [ 'E:\\myproject\\nodetest\\node_modules',
    //     'E:\\myproject\\node_modules', 
    //    'E:\\node_modules' ] }
    

    可以看到 exports 是 module 中的属性
    其实在访问node文件时,为了方便导出,node在生成了 module 的同时,也同时生成一个引用
    var exports = module.exports = {}
    此时,exports 和 module.exports 时指向内存的同一处引用 so.

    //a.js
    console.log(exports === module.exports)   //true
    console.log(exports == module.exports)   //true
    
    exports.a = 1;
    exports.b = 2;
    
    coonsole.log(module.exports)   // {a:1,b:2}
    //exports 改变时 module.exports 也随着改变了      
    
    //b.js
    var a = require('./a.js')     //require 引入的是a.js中的module.js
    
    console.log(a)   //{a:1,b:2}
    下面再看
    
    exports.a = 3;
    console.log(module.exports);    //3
    module.exports.a = 4;
    console.log(module.exports);    //4
    exports.a = 5;
    console.log(module.exports);    //5
    

    上面的例子没有上面问题,再使用时注意先后顺序就好

    以上都没有问题,直到

    //c.js
    module.exports = {
        a:1,
        b:2
    }
    
    exports.a = 3;
    
    //d.js
    var c = require('./c.js')
    console.log(c)   //{a:1,c:3}
    

    what ? 什么 怎么回事
    引入的c ,不应该是{a:3,b:2},怎么没有改变
    不时指向同一块内存吗?

    记住,我前面说过,
    exports 时modules 的一个引用,
    require 时引用 moudle.exports
    那么,当你 module.export={}的时候
    此时,exports 时modules.exports 已经不是指向同一内存了,
    所以在exports.a = 3; 时
    module.exports 并没有改变

    module.exports.a = 1;
    module.exports.b = 2;
    
    exports = function(){};
    

    //此时,两个变量也已经没有联系了,

    exports.a = 3;
    
    console.log(module.exports)    //{a:1,b:2}
    
    //简单的例子
    var obj = {exports:{a:1}};
    var copyObj = obj.exports;
    
    copyObj.a = 2;
    console.log(obj)   //{exports:{a:2}}
    
    注意
    obj.exports = {a:10}
    copyObj.a = 2;
    console.log(obj)   //{exports:{a:10}}
    

    与 上面的exports 和module.exports 一个道理

    相关文章

      网友评论

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

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