• node.js中exports与module.exports的区别


    CommonJS

    Node应用是由模块组成的,采用的是CommonJS模块规范。

    1. 根据规范一个文件就是一个模块,有自己单独的作用域,在一个文件中定义的变量,函数,类都是私有的,对其他的文件不可见。
    2. 根据规范,每个模块内部,module代表当前的模块,这个变量是一个对象,他的exports属性是对外的接口。
    3. module.exports用于输出文件对象,require用于加载模块。

    node在执行一个文件的时候会在文件内部生成exports对象和module对象,module对象又一个属性为export

    当我们在文件中打印下两者是否相等可以看到结果为true
    console.log(exports === module.exports)
    这证明了两个对象是指向的同一个内存地址,同时也只有module.exports对象返回了
    其实可以这样理解初始化一个文件的时候node帮我们做了以下这件事:

    const module={
      exports:{}
    }
    const exports=module.exports
    

    node应用在被执行前会被包装一下

    (function(exports,require,module,__filename,__dirname){
      ...
    })
    

    在进行头尾封装之后,各模块之间进行了作用域的隔离,避免了全局变量实现了:

    1. 保持了顶层的变量(用var和const等定义的)作用在模块的范围内,而不是全局的
    2. 提供了一些模块特定的变量
      1. 从模块中导出值module和exports对象
      2. 包含了模块绝对文件名(__filename)和目录路径(__dirname)

    总结

    1. exports是module对象的一个属性,在初始化的时候module.exports和exports指向了同一个内存地址
    2. 模块导出用的是module.exports,exports只是对这个地址的一个引用
  • 相关阅读:
    python入门基础
    iOS开发应用学习笔记
    ios开发之NavBar和TarBar使用技巧
    iOS开发中常用第三方库的使用和配置-GDataXML
    iOS开发中常用第三方库的使用和配置-GDataXML
    ios程序发布测试打包
    iOS的动画效果类型及实现方法
    iOS定位服务编程详解
    键盘样式风格有关设置-iOS开发
    如何在ios 系统 中抓包??
  • 原文地址:https://www.cnblogs.com/my466879168/p/13784367.html
Copyright © 2020-2023  润新知