通常我们用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. office文件的预览

    使用FlexPaper实现office文件的预览(C#版) 需求很简单,用户上传office文件(word.excel.ppt)后,可以预览上传的这些文件.搜索的相关的资料后.整理如下: Step1. ...

  2. js操作iframe总结

    一 在父页面操作子页面   IE下操作IFrame内容的代码: document.frames["MyIFrame"].document.getElementById(" ...

  3. easyuidatagrid扩展--玩一下,无实际意义

    直接上代码 $.extend($.fn.datagrid.defaults.editors, { operater: { init: function (container, options) { v ...

  4. JS获取当前日期时间并定时刷新

    JS获取当前日期时间 var date = new Date(); date.getYear(); //获取当前年份(2位) date.getFullYear(); //获取完整的年份(4位,2014 ...

  5. 我的第一篇文章 —— IE6的那些css常见bug(汇总)

    我的微博终于在前几天建立了 虽说很早之前就知道博客园这个地方 但怕自己不能坚持去写一些东西一直没有建.这几天 我做了这个决定 把我的博客建起来 每周发一些看到的,听到了一些前端知识或者前沿技术. 另外 ...

  6. nosql和关系型数据库比较?

    nosql和关系型数据库比较? 优点: 1)成本:nosql数据库简单易部署,基本都是开源软件,不需要像使用oracle那样花费大量成本购买使用,相比关系型数据库价格便宜 2)查询速度:nosql数据 ...

  7. poj1269

    基础题,直线间关系 #include <iostream> #include <math.h> #include <iomanip> #define eps 1e- ...

  8. EF如何操作内存中的数据和加载外键数据:延迟加载、贪婪加载、显示加载

    EF如何操作内存中的数据和加载外键数据:延迟加载.贪婪加载.显示加载 之前的EF Code First系列讲了那么多如何配置实体和数据库表的关系,显然配置只是辅助,使用EF操作数据库才是每天开发中都需 ...

  9. JAVA线程间的状态转换

    线程间的状态转换:  1. 新建(new):新创建了一个线程对象. 2. 可运行(runnable):线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法.该状态的线程位于可运 ...

  10. .Net程序员学用Oracle系列(5):三大数据类型

    <.Net程序员学用Oracle系列:导航目录> 本文大纲 1.Oracle 数据类型概述 2.字符类型 2.1.字符集 & NLS 2.2.常见的两种字符串 2.3.NCHAR ...