Node.js   发布时间:2022-04-24  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Node.js模块导出exports 和 module.exports 的区别大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

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

 
 
  • 1
  • 1
@H_387_16@module.exports = {};

exports和module.exports指向同一块内存,但require()返回的是module.exports而不是exports。

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    var str = "difference" exports.a = str; exports.b = function () { }

    给 exports 赋值其实是给 module.exports 这个空对象添加了两个属性而已,上面的代码相当于:

  • 1
  • 2
  • 3
  • 4
  • 5
    • 1
    • 2
    • 3
    • 4
    • 5
    var str = "difference" exports.a = str; exports.b = function () { }

    先来看下exports和module.exports的使用

    使用exports

    app.js

    @H_403_108@
  • 1
  • 2
    • 1
    • 2
    var s = require("./log"); s.log("Hello");

    log.js

  • 1
  • 2
  • 3
  • 4
    • 1
    • 2
    • 3
    • 4
    @H_419_156@exports.log =(str) { @H_419_156@console.log(str); }

    使用module.exports

    log.js

  • 1
  • 2
  • 3
    • 1
    • 2
    • 3
    @H_387_16@module.exports =(str) { console.log(str); }

    上述两种用法都没问题,但如果这样使用

  • 1
  • 2
  • 3
  • exports = 运行程序就会报错。

    前面的例子中给 exports 添加属性,只是对 exports 指向的内存做了修改。而上例则是对exports指向的内存进行了覆盖,使exports指向了一块新的内存,这样,exports和module.exports指向的内存并不是同一块,exports和module.exports并无任何关系。exports指向的内存有了变化,而module.exports指向的内存并无变化,仍为空对象{}。

    require得到的会是一个空对象,则会有

  • 1
  • TypeError: s.log is @H_696_203@not @H_696_203@a function

    报错信息。

    再看下面的例子

    app.js

  • 1
  • 2
  • 3
  • 4
  • var x = require('./init'); console.log(x.a)

    init.js

    exports
    = {a: 2} exports.a = 1

    运行app.js会有输出

  • 1
  • 2

    这也就是module.exports对象不为空的时候exports对象就自动忽略,因为module.exports通过赋值方式已经和exports对象指向的变量不同了,exports对象怎么改和module.exports对象没关系了。

    exports
    = exports = somethings

    等价于

    exports = somethings
      exports 
    

    原因也很简单, module.exports = somethings 是对 module.exports 进行了覆盖,此时 module.exports 和 exports 的关系断裂,module.exports 指向了新的内存块,而 exports 还是指向原来的内存块,为了让 module.exports 和 exports 还是指向同一块内存或者说指向同一个 “对象”,所以我们就 exports = module.exports 。

    最后,关于exports和module.exports的关系可以总结为

      @H_272_272@module.exports 初始值为一个空对象 {},所以 exports 初始值也是 {}
    1. exports 是指向的 module.exports 的引用
    2. require() 返回的是 module.exports 而不是 exports

    大佬总结

    以上是大佬教程为你收集整理的Node.js模块导出exports 和 module.exports 的区别全部内容,希望文章能够帮你解决Node.js模块导出exports 和 module.exports 的区别所遇到的程序开发问题。

    如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

    本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
    如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。