美文网首页
JavaScript爬坑之:module.exports与exp

JavaScript爬坑之:module.exports与exp

作者: hammercui | 来源:发表于2017-05-10 16:09 被阅读0次

    由于node对es6的import支持还不完美,还得研究下es5的模块导出机制。
    其实require/exports是野生的规范,是社区拟定的规则,被CommonJS,AMD.CMD支持。CommonJS是主流。

    但是我们会使用到module.exports与exports两种导出模块的方法,它们之间的区别呢?

    基础知识

    每一个node.js执行文件,都自动创建一个module对象,同时,module对象会创建一个叫exports的属性,初始化的值是 {}

    module.exports = {};
    

    require是值的拷贝,不是值引用,所以不用担心异步导致的数据污染。

    区别

    主要有3点:

    1. module.exports 初始值为一个空对象 {}
    2. require() 返回的是 module.exports 而不是 exports
    3. exports 是指向的 module.exports 的值的引用。

    前两条很好理解,第三条,意思是:

    • 如果exports = newObject,那么exports断开了与module.exports的引用,两者就不再指向一个内存。
      地址了。所有才有了如下的写法:
    exports = module.exports = somethings
    

    等价于

    module.exports = somethings
    exports = module.exports
    

    通过 exports = module.exports 让 exports 重新指向 module.exports .

    • 如果 module.exports = newObject,exports跟module.exports不再指向同一个值(或者叫内存地址),那么exports就失效了。

    总结:
    如果不使用module.exports,仅使用exports,那么exports只能到处属性,不能重新赋值对象。建议使用exports.x等写法。

    如果使用了module.exports = newObject,那么这时候exports就失效了,必须使用exports = module.exports = newObject建立联系

    相关文章

      网友评论

          本文标题:JavaScript爬坑之:module.exports与exp

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