通常我们用exports 或module.exports 来导出一个文件中的接口和字段,用require来引用导出的对象.那么这个exports 和 module.exports到底有啥关联呢?

1.新建app.js 然后写代码 :console.log({} instanceof Object) 结果是true  说明{} 是一个Object 的实例对象,这里是字面量的形式.

2.在app.js 中写上 console.log(module)

然后运行,结果类似下面的:可知module.exports 是一个{} 形式的对象.

Module {
id: '.',
exports: {},
parent: null,
filename: '/Users/johnson/Documents/app.js',
loaded: false,
children: [],
paths:
[ '/Users/johnson/Documents/node_modules',
'/Users/johnson/node_modules',
'/Users/node_modules',
'/node_modules' ] }

3. 而单独运行console.log(exports)  结果是 {}

4. 不过console.log(exports ==={}) ,console.log(module.exports ==={}) 都是false,说明{}是一个全新的Object 对象.

5.再写个: console.log(exports === module.exports)  结果是true  可以知道module.exports  和  exports 是相同的对象.

注意:{}表示创建了一个新的对象, 这种是Object 对象的字面量形式,比较对象的时候,比较的还是地址.

由以上结论可以知道,平时我导出接口的时候,用exports 和  module.exports 没有什么区别,应为它们的指向是一样的,类似下面的代码:

module.exports = exports = {}

不过还有一点,require 的时候,我们用的究竟是module.exports 呢还是 exports 呢?

新建js文件test.js:

module.exports.minus = function(a,b){
return a - b;
}
exports.multiply = function(a,b){ return a * b;
} // exports = {} // module.exports = {}

新建js文件app.js:

var t = require('./test')

console.log(t.minus(3,2))
console.log(t.multiply(3,2))

经过测试exports = {} 注释或不注释都不会影响结果 ,但是如果把下面的那句注释去掉,则运行报错,找不到导出的接口.

这说明,require 引用的是module.exports 对应的对象. 而exports 的意义就在于省略了一个module而已.

nodejs 包引用的终极结论的更多相关文章

  1. .Net Core 项目中的包引用探索(使用VSCode)

    本文组织有点乱,先说结论吧: 1 在 project.json 文件中声明包引用. 而不是像以前那样可以直接引用 dll. 2 使用 dotnet restore 命令后,nuget 会把声明的依赖项 ...

  2. 使用rust调用c++静态库并编译nodejs包

    在项目上经常要用到身份证阅读器.护照阅读仪.指纹仪等各种品牌硬件,假如每套系统的都做集成开发那代码的维护成本将变得很高,为此采用rust来调用厂家提供的sdk c++开发包并封装成nodejs包,用f ...

  3. go语言的安装和配置,以及包引用

    1.下载和安装 首先大家可以去官网下载 http://golang.org/dl/ 如果官网你看不懂的话,可以到这里下载: http://golangtc.com/download ,这里也提供了百度 ...

  4. python 子包引用父包和其他子包

    python 子包引用父包和其他子包 python引用子目录很简单, 里面放个__init__.py就可以了. 如何在子目录里面引用其他目录(父目录,爷目录和同辈分目录)呢? 例如: python有项 ...

  5. shiro-core包引用的版本问题

    在做shiro学习时,遇到这样的问题: Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/ ...

  6. 在Android Studio添加本地aar包引用

    1.如何在Android Studio添加本地aar包引用 https://jingyan.baidu.com/article/2a13832890d08f074a134ff0.html 2.完成上述 ...

  7. [Dynamic Language] Python非子包引用

    Python非子包引用 python的搜索路径其实是一个列表(sys.path) 导入模块时python会自动去找搜索这个列表当中的路径,如果路径中存在要导入的模块文件则导入成功. 在项目中如果要引用 ...

  8. golang包引用解析

    golang包引用解析 环境变量配置如下: GOROOT----[C:\Go] GOPATH----[F:\workspace\go_home] vs code配置如下: F:\workspace\g ...

  9. 项目中nodejs包高效升级插件npm-check-updates

    nodejs包高效升级插件npm-check-updates 最近想升级npm的包 1.//常规的包升级方式/2.npm update (包) 到npm一搜发现了一个很好的升级工具 npm-check ...

随机推荐

  1. Model Binding To A List

    [文章来源see here] Using the DefaultModelBinder in ASP.NET MVC, you can bind submitted form values to ar ...

  2. 自定义ModelValidatorProvider

    MVC数据验证原理及自定义ModelValidatorProvider实现无编译修改验证规则和错误信息 Asp.net MVC中的提供非常简单易用的数据验证解决方案. 通过System.Compone ...

  3. 《12个有趣的C语言问答》(4)

    C语言面试问答——<12个有趣的C语言问答>评析(4) 前文链接:http://www.cnblogs.com/pmer/p/3324063.html 8,Making changes i ...

  4. jquery mobile Checkbox动态添加刷新及事件绑定

    jquery mobile Checkbox动态添加刷新及事件绑定 在微信项目中,涉及到一个多选功能.数据来自后台数据库,需要动态加载. 项目结构:微信api+web app.使用jquery mob ...

  5. 将JDBC ResultSet结果集转成List

    private List<Map<String, Object>> list = new ArrayList<Map<String,Object>>() ...

  6. Win32_Battery class

    wmi的Win32_Battery类实现 其中EstimatedChargeRemaining属性返回剩余电量的百分比,EstimatedRunTime属性返回剩余时间(分钟) 其他属性参考http: ...

  7. Select * 一定不走索引是否正确?

    Select * 一定不走索引是否正确? 走索引指的是:SQL语句的执行计划用到了1.聚集索引查找  2.索引查找  ,并且查询语句中需要有where子句 根据where子句的过滤条件,去聚集索引或非 ...

  8. 乔布斯,TED,我的演讲

    乔布斯传这部独立影片虽然以失败告终,但是人们把期待留给了索尼影业即将投拍的官方乔布斯传记电影. 据传,这部影片将以乔布斯最成功的四次演讲作为主线,这无疑说明,演讲,对于乔布斯这个传奇人物,是非常重要的 ...

  9. hdu 4277 USACO ORZ (dfs暴搜+hash)

    题目大意:有N个木棒,相互组合拼接,能组成多少种不同的三角形. 思路:假设c>=b>=a 然后枚举C,在C的dfs里嵌套枚举B的DFS. #include <iostream> ...

  10. 数模学习笔记(四)——AHP

    1.层次分析法是对复杂.较为模糊的问题作出决策的简易方法. 2.步骤: (i)建立递阶层次结构模型:最高层(目标层),中间层(准则层),最底层(措施层) (ii)构造出各层次中的所有判断矩阵 各准则在 ...